From 176cf3d713e83ac6cf5c496f345e7349d2b26859 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 23 Feb 2016 14:28:25 +0100 Subject: [PATCH] api: allow varname in formdef submit (#10026) structured and display value are also copied if found. --- tests/test_api.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ wcs/api.py | 16 ++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index 418fd78..e4e9f0e 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -412,6 +412,70 @@ def test_formdef_submit(pub, local_user): data_class.wipe() + +def test_formdef_submit_with_varname(pub, local_user): + NamedDataSource.wipe() + data_source = NamedDataSource(name='foobar') + source = [{'id': '1', 'text': 'foo', 'more': 'XXX'}, + {'id': '2', 'text': 'bar', 'more': 'YYY'}] + data_source.data_source = {'type': 'formula', 'value': repr(source)} + data_source.store() + + data_source = NamedDataSource(name='foobar_jsonp') + data_source.data_source = {'type': 'formula', 'value': 'http://example.com/jsonp'} + data_source.store() + + Role.wipe() + role = Role(name='test') + role.store() + local_user.roles = [role.id] + local_user.store() + + FormDef.wipe() + formdef = FormDef() + formdef.name = 'test' + formdef.fields = [ + fields.StringField(id='0', label='foobar0', varname='foobar0'), + fields.ItemField(id='1', label='foobar1', varname='foobar1', + data_source={'type': 'foobar'}), + fields.ItemField(id='2', label='foobar2', varname='foobar2', + data_source={'type': 'foobar_jsonp'}), + ] + formdef.store() + data_class = formdef.data_class() + + resp = get_app(pub).post_json('/api/formdefs/test/submit', {'data': {}}, status=403) + assert resp.json['err'] == 1 + assert resp.json['err_desc'] == 'no user' + + signed_url = sign_url('http://example.net/api/formdefs/test/submit' + + '?format=json&orig=coucou&email=%s' % urllib.quote(local_user.email), '1234') + url = signed_url[len('http://example.net'):] + resp = get_app(pub).post_json(url, + {'data': + {'foobar0': 'xxx', + 'foobar1': '1', + 'foobar1_structured': { + 'id': '1', + 'text': 'foo', + 'more': 'XXX', + }, + 'foobar2': 'bar', + 'foobar2_raw': '10', + } + }) + assert resp.json['err'] == 0 + assert data_class.get(resp.json['data']['id']).status == 'wf-new' + assert data_class.get(resp.json['data']['id']).user_id == str(local_user.id) + assert data_class.get(resp.json['data']['id']).tracking_code is None + assert data_class.get(resp.json['data']['id']).data['0'] == 'xxx' + assert data_class.get(resp.json['data']['id']).data['1'] == '1' + assert data_class.get(resp.json['data']['id']).data['1_structured'] == source[0] + assert data_class.get(resp.json['data']['id']).data['2'] == '10' + assert data_class.get(resp.json['data']['id']).data['2_display'] == 'bar' + + data_class.wipe() + def test_categories(pub): FormDef.wipe() Category.wipe() diff --git a/wcs/api.py b/wcs/api.py index f168375..3617452 100644 --- a/wcs/api.py +++ b/wcs/api.py @@ -227,6 +227,22 @@ class ApiFormdefDirectory(Directory): raise AccessForbiddenError('disabled form') json_input = get_request().json formdata = self.formdef.data_class()() + data = json_input['data'] + # remap fields + for field in self.formdef.fields: + if not field.varname: + continue + if not field.varname in data: + continue + raw = '%s_raw' % field.varname + structured = '%s_structured' % field.varname + if field.store_display_value and raw in data: + data[field.id] = data.pop(raw) + data['%s_display' % field.id] = data.pop(field.varname) + else: + data[field.id] = data.pop(field.varname) + if field.store_structured_value and structured in data: + data['%s_structured' % field.id] = data.pop(structured) formdata.data = json_input['data'] meta = json_input.get('meta') or {} if meta.get('backoffice-submission'): -- 2.1.4