Projet

Général

Profil

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

Benjamin Dauvergne, 05 avril 2019 12:06

Télécharger (4,11 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        | 16 +++++++++----
 2 files changed, 72 insertions(+), 5 deletions(-)
tests/test_api.py
2299 2299
        pub.site_options.write(open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w'))
2300 2300
        resp = get_app(pub).get('/api/reverse-geocoding?lat=0&lon=0')
2301 2301
        assert urlopen.call_args[0][0] == 'http://reverse.example.net/?param=value&format=json&addressdetails=1&lat=0&lon=0&accept-language=en'
2302

  
2303

  
2304
def test_formdef_submit_structured(pub, local_user):
2305
    Role.wipe()
2306
    role = Role(name='test')
2307
    role.store()
2308
    local_user.roles = [role.id]
2309
    local_user.store()
2310

  
2311
    FormDef.wipe()
2312
    formdef = FormDef()
2313
    formdef.name = 'test'
2314
    formdef.fields = [
2315
        fields.ItemField(id='0', label='foobar', varname='foobar',
2316
                         data_source={
2317
                             'type': 'json',
2318
                             'value': 'http://datasource.com',
2319
                         }),
2320
        fields.ItemField(id='1', label='foobar1', varname='foobar1',
2321
                         data_source={
2322
                             'type': 'formula',
2323
                             'value': '[dict(id=i, text=\'label %s\' % i, foo=i) for i in range(10)]',
2324
                         }),
2325
    ]
2326
    formdef.store()
2327
    data_class = formdef.data_class()
2328

  
2329
    def url():
2330
        signed_url = sign_url(
2331
            'http://example.net/api/formdefs/test/submit'
2332
            '?format=json&orig=coucou&email=%s' % urllib.quote(local_user.email), '1234')
2333
        return signed_url[len('http://example.net'):]
2334

  
2335
    with mock.patch('qommon.misc.urlopen') as urlopen:
2336
        urlopen.side_effect = lambda *args: StringIO('''\
2337
{"data": [{"id": 0, "text": "zéro", "foo": "bar"}, \
2338
{"id": 1, "text": "uné", "foo": "bar1"}, \
2339
{"id": 2, "text": "deux", "foo": "bar2"}]}''')
2340
        resp = get_app(pub).post_json(url(), {'data': {
2341
            '0': '0',
2342
            "1": '3',
2343
        }})
2344

  
2345
    formdata = data_class.get(resp.json['data']['id'])
2346
    assert formdata.status == 'wf-new'
2347
    assert formdata.data['0'] == '0'
2348
    assert formdata.data['0_display'] == 'zéro'
2349
    assert formdata.data['0_structured'] == {
2350
        'id': 0,
2351
        'text': 'zéro',
2352
        'foo': 'bar',
2353
    }
2354
    assert formdata.data['1'] == '3'
2355
    assert formdata.data['1_display'] == 'label 3'
2356
    assert formdata.data['1_structured'] == {
2357
        'id': 3,
2358
        'text': 'label 3',
2359
        'foo': 3,
2360
    }
2361

  
2362
    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
        if field.store_display_value and display not in data:
70
            data[display] = field.store_display_value(data, field.id)
71
        if field.store_structured_value and structured not in data:
72
            structured_value = field.store_structured_value(data, field.id)
73
            if structured_value:
74
                data[structured] = structured_value
75
        if hasattr(field, 'from_json_value'):
76
            data[field.id] = field.from_json_value(data[field.id])
71 77
    return data
72 78

  
73 79

  
74
-