Projet

Général

Profil

0001-api-allow-varname-in-formdef-submit-10026.patch

Benjamin Dauvergne, 24 février 2016 16:45

Télécharger (5,2 ko)

Voir les différences:

Subject: [PATCH] api: allow varname in formdef submit (#10026)

structured and display value are also copied if found.
 help/fr/api-fill.page |  3 ++-
 tests/test_api.py     | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++
 wcs/api.py            | 16 +++++++++++++
 3 files changed, 82 insertions(+), 1 deletion(-)
help/fr/api-fill.page
41 41
  <p>
42 42
   L'attribut <code>data</code> est obligatoire et contient un dictionnaire
43 43
   dont les clés sont les identifiants des champs du formulaire et les valeurs
44
   le contenu de ces champs.
44
   le contenu de ces champs. Les noms de variable des champs sont aussi acceptés
45
   comme identifiant.
45 46
  </p>
46 47

  
47 48
  <p>
tests/test_api.py
412 412

  
413 413
    data_class.wipe()
414 414

  
415

  
416
def test_formdef_submit_with_varname(pub, local_user):
417
    NamedDataSource.wipe()
418
    data_source = NamedDataSource(name='foobar')
419
    source = [{'id': '1', 'text': 'foo', 'more': 'XXX'},
420
              {'id': '2', 'text': 'bar', 'more': 'YYY'}]
421
    data_source.data_source = {'type': 'formula', 'value': repr(source)}
422
    data_source.store()
423

  
424
    data_source = NamedDataSource(name='foobar_jsonp')
425
    data_source.data_source = {'type': 'formula', 'value': 'http://example.com/jsonp'}
426
    data_source.store()
427

  
428
    Role.wipe()
429
    role = Role(name='test')
430
    role.store()
431
    local_user.roles = [role.id]
432
    local_user.store()
433

  
434
    FormDef.wipe()
435
    formdef = FormDef()
436
    formdef.name = 'test'
437
    formdef.fields = [
438
        fields.StringField(id='0', label='foobar0', varname='foobar0'),
439
        fields.ItemField(id='1', label='foobar1', varname='foobar1',
440
            data_source={'type': 'foobar'}),
441
        fields.ItemField(id='2', label='foobar2', varname='foobar2',
442
            data_source={'type': 'foobar_jsonp'}),
443
    ]
444
    formdef.store()
445
    data_class = formdef.data_class()
446

  
447
    resp = get_app(pub).post_json('/api/formdefs/test/submit', {'data': {}}, status=403)
448
    assert resp.json['err'] == 1
449
    assert resp.json['err_desc'] == 'no user'
450

  
451
    signed_url = sign_url('http://example.net/api/formdefs/test/submit' +
452
            '?format=json&orig=coucou&email=%s' % urllib.quote(local_user.email), '1234')
453
    url = signed_url[len('http://example.net'):]
454
    resp = get_app(pub).post_json(url,
455
                                  {'data':
456
                                   {'foobar0': 'xxx',
457
                                    'foobar1': '1',
458
                                    'foobar1_structured': {
459
                                        'id': '1',
460
                                        'text': 'foo',
461
                                        'more': 'XXX',
462
                                    },
463
                                    'foobar2': 'bar',
464
                                    'foobar2_raw': '10',
465
                                   }
466
                                  })
467
    assert resp.json['err'] == 0
468
    assert data_class.get(resp.json['data']['id']).status == 'wf-new'
469
    assert data_class.get(resp.json['data']['id']).user_id == str(local_user.id)
470
    assert data_class.get(resp.json['data']['id']).tracking_code is None
471
    assert data_class.get(resp.json['data']['id']).data['0'] == 'xxx'
472
    assert data_class.get(resp.json['data']['id']).data['1'] == '1'
473
    assert data_class.get(resp.json['data']['id']).data['1_structured'] == source[0]
474
    assert data_class.get(resp.json['data']['id']).data['2'] == '10'
475
    assert data_class.get(resp.json['data']['id']).data['2_display'] == 'bar'
476

  
477
    data_class.wipe()
478

  
415 479
def test_categories(pub):
416 480
    FormDef.wipe()
417 481
    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
        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)
230 246
        formdata.data = json_input['data']
231 247
        meta = json_input.get('meta') or {}
232 248
        if meta.get('backoffice-submission'):
233
-