0001-api-allow-varname-in-formdef-submit-10026.patch
help/fr/api-fill.page | ||
---|---|---|
40 | 40 | |
41 | 41 |
<p> |
42 | 42 |
L'attribut <code>data</code> est obligatoire et contient un dictionnaire |
43 |
dont les clés sont les identifiants des champs du formulaire et les valeurs
|
|
44 |
le contenu de ces champs. |
|
43 |
dont les clés sont les identifiants des champs du formulaire (ou leur
|
|
44 |
nom de variable) et les valeurs le contenu de ces champs.
|
|
45 | 45 |
</p> |
46 | 46 | |
47 | 47 |
<p> |
... | ... | |
72 | 72 | |
73 | 73 |
<p> |
74 | 74 |
L'exemple suivant complète un formulaire d'inscription à une newsletter, qui |
75 |
demanderait trois champs, prénom, nom et adresse électronique. |
|
75 |
demanderait trois champs : prénom, nom et adresse électronique, ce dernier |
|
76 |
champ ayant le nom de variable <code>email</code>. |
|
76 | 77 |
</p> |
77 | 78 | |
78 | 79 |
<screen> |
... | ... | |
93 | 94 |
"data": { |
94 | 95 |
"1": "Marc", |
95 | 96 |
"2": "L.", |
96 |
"3": "marc@example.net"
|
|
97 |
"email": "marc@example.net"
|
|
97 | 98 |
} |
98 | 99 |
} |
99 | 100 |
</code> |
tests/test_api.py | ||
---|---|---|
411 | 411 | |
412 | 412 |
data_class.wipe() |
413 | 413 | |
414 | ||
415 |
def test_formdef_submit_with_varname(pub, local_user): |
|
416 |
NamedDataSource.wipe() |
|
417 |
data_source = NamedDataSource(name='foobar') |
|
418 |
source = [{'id': '1', 'text': 'foo', 'more': 'XXX'}, |
|
419 |
{'id': '2', 'text': 'bar', 'more': 'YYY'}] |
|
420 |
data_source.data_source = {'type': 'formula', 'value': repr(source)} |
|
421 |
data_source.store() |
|
422 | ||
423 |
data_source = NamedDataSource(name='foobar_jsonp') |
|
424 |
data_source.data_source = {'type': 'formula', 'value': 'http://example.com/jsonp'} |
|
425 |
data_source.store() |
|
426 | ||
427 |
Role.wipe() |
|
428 |
role = Role(name='test') |
|
429 |
role.store() |
|
430 |
local_user.roles = [role.id] |
|
431 |
local_user.store() |
|
432 | ||
433 |
FormDef.wipe() |
|
434 |
formdef = FormDef() |
|
435 |
formdef.name = 'test' |
|
436 |
formdef.fields = [ |
|
437 |
fields.StringField(id='0', label='foobar0', varname='foobar0'), |
|
438 |
fields.ItemField(id='1', label='foobar1', varname='foobar1', |
|
439 |
data_source={'type': 'foobar'}), |
|
440 |
fields.ItemField(id='2', label='foobar2', varname='foobar2', |
|
441 |
data_source={'type': 'foobar_jsonp'}), |
|
442 |
] |
|
443 |
formdef.store() |
|
444 |
data_class = formdef.data_class() |
|
445 | ||
446 |
resp = get_app(pub).post_json('/api/formdefs/test/submit', {'data': {}}, status=403) |
|
447 |
assert resp.json['err'] == 1 |
|
448 |
assert resp.json['err_desc'] == 'no user' |
|
449 | ||
450 |
signed_url = sign_url('http://example.net/api/formdefs/test/submit' + |
|
451 |
'?format=json&orig=coucou&email=%s' % urllib.quote(local_user.email), '1234') |
|
452 |
url = signed_url[len('http://example.net'):] |
|
453 |
resp = get_app(pub).post_json(url, |
|
454 |
{'data': |
|
455 |
{'foobar0': 'xxx', |
|
456 |
'foobar1': '1', |
|
457 |
'foobar1_structured': { |
|
458 |
'id': '1', |
|
459 |
'text': 'foo', |
|
460 |
'more': 'XXX', |
|
461 |
}, |
|
462 |
'foobar2': 'bar', |
|
463 |
'foobar2_raw': '10', |
|
464 |
} |
|
465 |
}) |
|
466 |
assert resp.json['err'] == 0 |
|
467 |
assert data_class.get(resp.json['data']['id']).status == 'wf-new' |
|
468 |
assert data_class.get(resp.json['data']['id']).user_id == str(local_user.id) |
|
469 |
assert data_class.get(resp.json['data']['id']).tracking_code is None |
|
470 |
assert data_class.get(resp.json['data']['id']).data['0'] == 'xxx' |
|
471 |
assert data_class.get(resp.json['data']['id']).data['1'] == '1' |
|
472 |
assert data_class.get(resp.json['data']['id']).data['1_structured'] == source[0] |
|
473 |
assert data_class.get(resp.json['data']['id']).data['2'] == '10' |
|
474 |
assert data_class.get(resp.json['data']['id']).data['2_display'] == 'bar' |
|
475 | ||
476 |
data_class.wipe() |
|
477 | ||
414 | 478 |
def test_categories(pub): |
415 | 479 |
FormDef.wipe() |
416 | 480 |
Category.wipe() |
wcs/api.py | ||
---|---|---|
227 | 227 |
raise AccessForbiddenError('disabled form') |
228 | 228 |
json_input = get_request().json |
229 | 229 |
formdata = self.formdef.data_class()() |
230 |
formdata.data = json_input['data'] |
|
230 |
data = json_input['data'] |
|
231 |
# remap fields |
|
232 |
for field in self.formdef.fields: |
|
233 |
if not field.varname: |
|
234 |
continue |
|
235 |
if not field.varname in data: |
|
236 |
continue |
|
237 |
raw = '%s_raw' % field.varname |
|
238 |
structured = '%s_structured' % field.varname |
|
239 |
if field.store_display_value and raw in data: |
|
240 |
data[field.id] = data.pop(raw) |
|
241 |
data['%s_display' % field.id] = data.pop(field.varname) |
|
242 |
else: |
|
243 |
data[field.id] = data.pop(field.varname) |
|
244 |
if field.store_structured_value and structured in data: |
|
245 |
data['%s_structured' % field.id] = data.pop(structured) |
|
246 |
formdata.data = data |
|
231 | 247 |
meta = json_input.get('meta') or {} |
232 | 248 |
if meta.get('backoffice-submission'): |
233 | 249 |
if not self.formdef.backoffice_submission_roles: |
234 |
- |