From b98b3089a2e59ed1ac0aca24485c3b93257c2e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 2 Nov 2015 19:13:52 +0100 Subject: [PATCH] api: expose _structured field variants in json output (#8844) --- tests/test_api.py | 34 +++++++++++++++++++++++++++++++--- wcs/formdata.py | 3 +++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 736c9f7..73fb5f5 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -15,6 +15,7 @@ from wcs.users import User from wcs.roles import Role from wcs.formdef import FormDef from wcs.categories import Category +from wcs.data_sources import NamedDataSource from wcs import fields from wcs.api import sign_url @@ -391,6 +392,14 @@ def test_categories_formdefs(): def test_formdata(local_user): + NamedDataSource.wipe() + data_source = NamedDataSource(name='foobar') + data_source.data_source = {'type': 'formula', + 'value': repr( + [{'id': '1', 'text': 'foo', 'more': 'XXX'}, + {'id': '2', 'text': 'bar', 'more': 'YYY'}])} + data_source.store() + Role.wipe() role = Role(name='test') role.store() @@ -401,15 +410,29 @@ def test_formdata(local_user): fields.StringField(id='0', label='foobar', varname='foobar'), fields.StringField(id='1', label='foobar2'), fields.DateField(id='2', label='foobar3', varname='date'), - fields.FileField(id='3', label='foobar4', varname='file'),] + fields.FileField(id='3', label='foobar4', varname='file'), + fields.ItemField(id='4', label='foobar5', varname='item', + data_source={'type': 'foobar'}), + ] formdef.workflow_roles = {'_receiver': role.id} formdef.store() + item_field = formdef.fields[4] formdata = formdef.data_class()() date = time.strptime('2014-01-20', '%Y-%m-%d') upload = PicklableUpload('test.txt', 'text/plain', 'ascii') upload.receive(['base64me']) - formdata.data = {'0': 'foo@localhost', '1': 'xxx', '2': date, '3': upload} + formdata.data = { + '0': 'foo@localhost', + '1': 'xxx', + '2': date, + '3': upload, + '4': '1', + } + formdata.data['4_display'] = item_field.store_display_value( + formdata.data, item_field.id) + formdata.data['4_structured'] = item_field.store_structured_value( + formdata.data, item_field.id) formdata.user_id = local_user.id formdata.just_created() formdata.store() @@ -427,13 +450,18 @@ def test_formdata(local_user): resp2 = get_app(pub).get(sign_uri('/test/%s/' % formdata.id, user=local_user)) assert resp.json == resp2.json assert 'last_update_time' in resp.json - assert len(resp.json['fields']) == 3 # foobar2 has no varname, not in json + 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 assert resp.json['user']['name'] == local_user.name assert resp.json['fields']['foobar'] == 'foo@localhost' assert resp.json['fields']['date'] == '2014-01-20' assert resp.json['fields']['file']['content'] == 'YmFzZTY0bWU=' # base64('base64me') assert resp.json['fields']['file']['filename'] == 'test.txt' assert resp.json['fields']['file']['content_type'] == 'text/plain' + assert resp.json['fields']['item'] == 'foo' + assert resp.json['fields']['item_raw'] == '1' + assert resp.json['fields']['item_structured'] == {'id': '1', 'text': 'foo', 'more': 'XXX'} def test_user_forms(local_user): FormDef.wipe() diff --git a/wcs/formdata.py b/wcs/formdata.py index 84b8d2c..b10ae03 100644 --- a/wcs/formdata.py +++ b/wcs/formdata.py @@ -107,6 +107,9 @@ def get_json_dict(fields, data, include_files=True): new_data[field.varname] = data.get('%s_display' % field.id) else: new_data[field.varname] = value + if field.store_structured_value: + if data.get('%s_structured' % field.id): + new_data[field.varname + '_structured'] = data.get('%s_structured' % field.id) return new_data -- 2.6.2