Projet

Général

Profil

0002-api-store-display-structured-on-submit-of-an-item-fi.patch

Benjamin Dauvergne, 15 avril 2019 09:00

Télécharger (4,31 ko)

Voir les différences:

Subject: [PATCH 2/2] api: store display/structured on submit of an item field
 with raw id (#32013)

 tests/test_api.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++
 wcs/api.py        | 20 ++++++++++++----
 2 files changed, 76 insertions(+), 5 deletions(-)
tests/test_api.py
2355 2355
        pub.site_options.write(open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w'))
2356 2356
        resp = get_app(pub).get('/api/reverse-geocoding?lat=0&lon=0')
2357 2357
        assert urlopen.call_args[0][0] == 'http://reverse.example.net/?param=value&format=json&addressdetails=1&lat=0&lon=0&accept-language=en'
2358

  
2359

  
2360
def test_formdef_submit_structured(pub, local_user):
2361
    Role.wipe()
2362
    role = Role(name='test')
2363
    role.store()
2364
    local_user.roles = [role.id]
2365
    local_user.store()
2366

  
2367
    FormDef.wipe()
2368
    formdef = FormDef()
2369
    formdef.name = 'test'
2370
    formdef.fields = [
2371
        fields.ItemField(id='0', label='foobar', varname='foobar',
2372
                         data_source={
2373
                             'type': 'json',
2374
                             'value': 'http://datasource.com',
2375
                         }),
2376
        fields.ItemField(id='1', label='foobar1', varname='foobar1',
2377
                         data_source={
2378
                             'type': 'formula',
2379
                             'value': '[dict(id=i, text=\'label %s\' % i, foo=i) for i in range(10)]',
2380
                         }),
2381
    ]
2382
    formdef.store()
2383
    data_class = formdef.data_class()
2384

  
2385
    def url():
2386
        signed_url = sign_url(
2387
            'http://example.net/api/formdefs/test/submit'
2388
            '?format=json&orig=coucou&email=%s' % urllib.quote(local_user.email), '1234')
2389
        return signed_url[len('http://example.net'):]
2390

  
2391
    with mock.patch('qommon.misc.urlopen') as urlopen:
2392
        urlopen.side_effect = lambda *args: StringIO('''\
2393
{"data": [{"id": 0, "text": "zéro", "foo": "bar"}, \
2394
{"id": 1, "text": "uné", "foo": "bar1"}, \
2395
{"id": 2, "text": "deux", "foo": "bar2"}]}''')
2396
        resp = get_app(pub).post_json(url(), {'data': {
2397
            '0': '0',
2398
            "1": '3',
2399
        }})
2400

  
2401
    formdata = data_class.get(resp.json['data']['id'])
2402
    assert formdata.status == 'wf-new'
2403
    assert formdata.data['0'] == '0'
2404
    assert formdata.data['0_display'] == 'zéro'
2405
    assert formdata.data['0_structured'] == {
2406
        'id': 0,
2407
        'text': 'zéro',
2408
        'foo': 'bar',
2409
    }
2410
    assert formdata.data['1'] == '3'
2411
    assert formdata.data['1_display'] == 'label 3'
2412
    assert formdata.data['1_structured'] == {
2413
        'id': 3,
2414
        'text': 'label 3',
2415
        'foo': 3,
2416
    }
2417

  
2418
    data_class.wipe()
wcs/api.py
60 60
        if field.store_structured_value and structured in data:
61 61
            data['%s_structured' % field.id] = data.pop(structured)
62 62

  
63
    # parse special fields
63
    # complete/adapt field values
64 64
    for field in formdef.get_all_fields():
65
        if not hasattr(field, 'from_json_value'):
66
            continue
65
        structured = '%s_structured' % field.id
66
        display = '%s_display' % field.id
67 67
        if data.get(field.id) is None:
68 68
            continue
69
        data[field.id] = field.from_json_value(data[field.id])
70

  
69
        # only fill display/structured if both are absent
70
        if display not in data and structured not in data:
71
            if field.store_display_value:
72
                display_value = field.store_display_value(data, field.id)
73
                if display_value is not None:
74
                    data[display] = display_value
75
            if field.store_structured_value:
76
                structured_value = field.store_structured_value(data, field.id)
77
                if structured_value is not None:
78
                    data[structured] = structured_value
79
        if hasattr(field, 'from_json_value'):
80
            data[field.id] = field.from_json_value(data[field.id])
71 81
    return data
72 82

  
73 83

  
74
-