Projet

Général

Profil

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

Thomas Noël, 25 février 2016 18:06

Télécharger (5,93 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 |  9 ++++----
 tests/test_api.py     | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++
 wcs/api.py            | 18 ++++++++++++++-
 3 files changed, 86 insertions(+), 5 deletions(-)
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
-