From 3c936280f2ef5d0db4242c2af93a64027cf6ed16 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. --- help/fr/api-fill.page | 9 ++++---- tests/test_api.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ wcs/api.py | 18 ++++++++++++++- 3 files changed, 86 insertions(+), 5 deletions(-) diff --git a/help/fr/api-fill.page b/help/fr/api-fill.page index 69c2969..0eabcb0 100644 --- a/help/fr/api-fill.page +++ b/help/fr/api-fill.page @@ -40,8 +40,8 @@ différentes pages définies dans le formulaire (mode flux).

L'attribut data est obligatoire et contient un dictionnaire - dont les clés sont les identifiants des champs du formulaire et les valeurs - le contenu de ces champs. + dont les clés sont les identifiants des champs du formulaire (ou leur + nom de variable) et les valeurs le contenu de ces champs.

@@ -72,7 +72,8 @@ différentes pages définies dans le formulaire (mode flux).

L'exemple suivant complète un formulaire d'inscription à une newsletter, qui - demanderait trois champs, prénom, nom et adresse électronique. + demanderait trois champs : prénom, nom et adresse électronique, ce dernier + champ ayant le nom de variable email.

@@ -93,7 +94,7 @@ différentes pages définies dans le formulaire (mode flux). "data": { "1": "Marc", "2": "L.", - "3": "marc@example.net" + "email": "marc@example.net" } } diff --git a/tests/test_api.py b/tests/test_api.py index 0954ae9..b71f7f1 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -411,6 +411,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..e538479 100644 --- a/wcs/api.py +++ b/wcs/api.py @@ -227,7 +227,23 @@ class ApiFormdefDirectory(Directory): raise AccessForbiddenError('disabled form') json_input = get_request().json formdata = self.formdef.data_class()() - formdata.data = json_input['data'] + 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 = data meta = json_input.get('meta') or {} if meta.get('backoffice-submission'): if not self.formdef.backoffice_submission_roles: -- 2.7.0