misc: convert time.struct_time to datetime objects before json dump (#38706)

This commit is contained in:
Frédéric Péters 2019-12-25 10:46:13 +01:00
parent 09a29908f8
commit 12bfec671f
4 changed files with 14 additions and 10 deletions

View File

@ -1158,7 +1158,8 @@ def test_formdata(pub, local_user):
sign_uri('/api/forms/test/%s/' % formdata.id, user=local_user),
status=200)
assert 'last_update_time' in resp.json
assert datetime.datetime.strptime(resp.json['last_update_time'], '%Y-%m-%dT%H:%M:%S')
assert datetime.datetime.strptime(resp.json['receipt_time'], '%Y-%m-%dT%H:%M:%S')
assert len(resp.json['fields']) == 6
assert 'foobar' in resp.json['fields']
assert 'foobar2' not in resp.json['fields'] # foobar2 has no varname, not in json
@ -1636,7 +1637,7 @@ def test_api_list_formdata(pub, local_user):
# check it now gets the data
resp = get_app(pub).get(sign_uri('/api/forms/test/list', user=local_user))
assert len(resp.json) == 30
assert 'receipt_time' in resp.json[0]
assert datetime.datetime.strptime(resp.json[0]['receipt_time'], '%Y-%m-%dT%H:%M:%S')
assert not 'fields' in resp.json[0]
# check getting full formdata

View File

@ -1845,8 +1845,9 @@ class FormPage(Directory):
else:
output = [{'id': filled.id,
'url': filled.get_url(),
'receipt_time': filled.receipt_time,
'last_update_time': filled.last_update_time} for filled in items]
'receipt_time': datetime.datetime(*filled.receipt_time[:6]),
'last_update_time': datetime.datetime(*filled.last_update_time[:6]),
} for filled in items]
return json.dumps(output,
cls=misc.JSONEncoder)

View File

@ -182,8 +182,8 @@ class Evolution(object):
def get_json_export_dict(self, user, anonymise=False):
data = {
'time': self.time,
'last_jump_datetime': self.last_jump_datetime,
'time': datetime.datetime(*self.time[:6]) if self.time else None,
'last_jump_datetime': self.last_jump_datetime
}
if self.status:
data['status'] = self.status[3:]
@ -1012,8 +1012,8 @@ class FormData(StorableObject):
data['id'] = str(self.id)
data['display_id'] = self.get_display_id()
data['display_name'] = self.get_display_name()
data['receipt_time'] = self.receipt_time
data['last_update_time'] = self.last_update_time
data['receipt_time'] = datetime.datetime(*self.receipt_time[:6])
data['last_update_time'] = datetime.datetime(*self.last_update_time[:6])
data['criticality_level'] = self.criticality_level
data['url'] = self.get_url()

View File

@ -475,8 +475,10 @@ def indent_xml(elem, level=0):
class JSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, time.struct_time):
return datetime.datetime.utcfromtimestamp(time.mktime(obj)).isoformat() + 'Z'
# make sure time.struct_time are not received as they do have a
# default serializer in Python 3 (they are tuples) and should
# be converted to datetime objects beforehand.
assert not isinstance(obj, time.struct_time), 'time.struct_time should not be serialized'
if isinstance(obj, datetime.datetime):
return obj.isoformat()