misc: change json encoder to preprocess date for time.struct_time (#38981)
This commit is contained in:
parent
e6eb2a8ad0
commit
efa3ebb305
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue