misc: change json encoder to preprocess date for time.struct_time (#38981)

This commit is contained in:
Frédéric Péters 2020-01-15 15:42:03 +01:00
parent e6eb2a8ad0
commit efa3ebb305
2 changed files with 39 additions and 3 deletions

View File

@ -29,7 +29,7 @@ from wcs.formdef import FormDef
from wcs.formdata import Evolution
from wcs.categories import Category
from wcs.data_sources import NamedDataSource
from wcs.workflows import Workflow, EditableWorkflowStatusItem, WorkflowBackofficeFieldsFormDef
from wcs.workflows import Workflow, EditableWorkflowStatusItem, WorkflowBackofficeFieldsFormDef, WorkflowVariablesFieldsFormDef
from wcs.wf.jump import JumpWorkflowStatusItem
from wcs.wf.register_comment import RegisterCommenterWorkflowStatusItem
from wcs import fields, qommon
@ -1318,15 +1318,26 @@ def test_user_roles(pub, local_user):
assert resp.json['user_roles'][0]['name'] == 'Foo bar'
def test_user_forms(pub, local_user):
Workflow.wipe()
workflow = Workflow.get_default_workflow()
workflow.id = '2'
workflow.variables_formdef = WorkflowVariablesFieldsFormDef(workflow=workflow)
workflow.variables_formdef.fields.append(fields.DateField(label='Test', type='date', varname='option_date'))
workflow.store()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'test'
formdef.fields = [
fields.StringField(id='0', label='foobar', varname='foobar'),
fields.StringField(id='1', label='foobar2'),]
fields.StringField(id='1', label='foobar2'),
fields.DateField(id='2', label='date', type='date', varname='date'),
]
formdef.keywords = 'hello, world'
formdef.disabled = False
formdef.enable_tracking_codes = True
formdef.workflow = workflow
formdef.workflow_options = {'option_date': datetime.date(2020, 1, 15).timetuple()}
formdef.store()
formdef.data_class().wipe()
@ -1335,7 +1346,11 @@ def test_user_forms(pub, local_user):
assert len(resp.json['data']) == 0
formdata = formdef.data_class()()
formdata.data = {'0': 'foo@localhost', '1': 'xxx'}
formdata.data = {
'0': 'foo@localhost',
'1': 'xxx',
'2': datetime.date(2020, 1, 15).timetuple(),
}
formdata.user_id = local_user.id
formdata.just_created()
formdata.jump_status('new')
@ -1357,7 +1372,9 @@ def test_user_forms(pub, local_user):
resp = get_app(pub).get(sign_uri('/api/user/forms?full=on', user=local_user))
assert resp.json['err'] == 0
assert resp.json['data'][0]['fields']['foobar'] == 'foo@localhost'
assert resp.json['data'][0]['fields']['date'] == '2020-01-15'
assert resp.json['data'][0]['keywords'] == ['hello', 'world']
assert resp.json['data'][0]['form_option_option_date'] == '2020-01-15'
resp2 = get_app(pub).get(sign_uri('/api/user/forms?&full=on', user=local_user))
assert resp.json == resp2.json

View File

@ -473,7 +473,26 @@ def indent_xml(elem, level=0):
return elem
def preprocess_struct_time(obj):
if isinstance(obj, time.struct_time):
dt = datetime.datetime(*obj[:6])
if dt.hour == 0 and dt.minute == 0 and dt.second == 0:
return dt.date()
return dt
elif isinstance(obj, list):
return [preprocess_struct_time(x) for x in obj]
elif isinstance(obj, dict):
new_d = {}
for k, v in obj.items():
new_d[preprocess_struct_time(k)] = preprocess_struct_time(v)
return new_d
return obj
class JSONEncoder(json.JSONEncoder):
def encode(self, obj):
return super(JSONEncoder, self).encode(preprocess_struct_time(obj))
def default(self, obj):
# make sure time.struct_time are not received as they do have a
# default serializer in Python 3 (they are tuples) and should