From de815650e6e90ba27b103a30c2c2cd759900e40f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 23 Jan 2023 15:21:03 +0100 Subject: [PATCH] misc: fix import of unnamed block field (#73729) --- tests/api/test_formdef.py | 47 +++++++++++++++++++++++++++++++++++++++ wcs/api.py | 4 +++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/tests/api/test_formdef.py b/tests/api/test_formdef.py index 8fdbc9470..4605394cc 100644 --- a/tests/api/test_formdef.py +++ b/tests/api/test_formdef.py @@ -1108,3 +1108,50 @@ def test_formdef_import_export_block(pub, admin_user): new_formdata = formdef.data_class().select()[0] assert new_formdata.data == formdata.data + + +def test_formdef_import_export_unnamed_block(pub, admin_user): + BlockDef.wipe() + block = BlockDef() + block.name = 'foobar' + block.fields = [ + fields.StringField(id='1', label='Foo', varname='foo'), + ] + block.store() + + FormDef.wipe() + formdef = FormDef() + formdef.name = 'test' + formdef.fields = [ + fields.BlockField(id='0', label='test', type='block:foobar', max_items=3), + ] + formdef.store() + + formdef.data_class().wipe() + formdata = formdef.data_class()() + formdata.data = { + '0': { + 'data': [ + { + '1': 'plop', + }, + { + '1': 'hop', + }, + ], + 'schema': {'1': 'string'}, + }, + '0_display': 'foobar, foobar', + } + formdata.just_created() + formdata.store() + + formdata_export = formdata.get_json_export_dict(include_unnamed_fields=True, include_evolution=False) + del formdata_export['receipt_time'] + del formdata_export['last_update_time'] + formdef.data_class().wipe() + + app = login(get_app(pub)) + app.post_json('/api/formdefs/test/submit', formdata_export) + new_formdata = formdef.data_class().select()[0] + assert new_formdata.data == formdata.data diff --git a/wcs/api.py b/wcs/api.py index 69ac43861..04af3d816 100644 --- a/wcs/api.py +++ b/wcs/api.py @@ -74,7 +74,9 @@ def posted_json_data_to_formdata_data(formdef, data): # merge unnamed fields if they exist if '_unnamed' in data: - data.update(data.pop('_unnamed')) + unnamed_data = data.pop('_unnamed') + for k in unnamed_data.keys(): + data[k] = unnamed_data.get('%s_raw' % k, unnamed_data.get(k)) # prefer raw value # create a temporary formdata so datasources using previous fields in # parameters can find their values. -- 2.39.2