Projet

Général

Profil

0001-forms-put-item-display-value-in-session-for-select2-.patch

Frédéric Péters, 24 juillet 2020 09:45

Télécharger (4,36 ko)

Voir les différences:

Subject: [PATCH] forms: put item display value in session for select2 use
 (#45438)

 tests/test_form_pages.py | 70 ++++++++++++++++++++++++++++++++++++++++
 wcs/fields.py            | 10 +++++-
 2 files changed, 79 insertions(+), 1 deletion(-)
tests/test_form_pages.py
2324 2324
    assert logged_error.occurences_count == 2
2325 2325

  
2326 2326

  
2327
def test_form_edit_autocomplete_list(pub):
2328
    user = create_user(pub)
2329

  
2330
    NamedDataSource.wipe()
2331
    data_source = NamedDataSource(name='foobar')
2332
    data_source.data_source = {'type': 'json', 'value': 'http://remote.example.net/json'}
2333
    data_source.query_parameter = 'q'
2334
    data_source.id_parameter = 'id'
2335
    data_source.store()
2336

  
2337
    formdef = create_formdef()
2338
    formdef.data_class().wipe()
2339

  
2340
    formdef.fields = [
2341
        fields.ItemField(id='0', label='string', type='item',
2342
            data_source={'type': 'foobar'},
2343
            display_mode='autocomplete',
2344
        ),
2345
    ]
2346
    formdef.store()
2347

  
2348
    workflow = Workflow(name='test')
2349
    st1 = workflow.add_status('Status1', 'st1')
2350
    editable = EditableWorkflowStatusItem()
2351
    editable.id = '_editable'
2352
    editable.by = ['_submitter', '_receiver']
2353
    st1.items.append(editable)
2354
    editable.parent = st1
2355
    workflow.store()
2356

  
2357
    formdef.workflow_id = workflow.id
2358
    formdef.store()
2359

  
2360
    app = get_app(pub)
2361
    login(app, username='foo', password='foo')
2362

  
2363
    with mock.patch('wcs.qommon.misc.urlopen') as urlopen:
2364
        data = {'data': [{'id': '1', 'text': 'hello', 'extra': 'foo'},
2365
                         {'id': '2', 'text': 'world', 'extra': 'bar'}]}
2366
        urlopen.side_effect = lambda *args: StringIO(json.dumps(data))
2367
        resp = app.get('/test/')
2368
        assert 'data-select2-url=' in resp.text
2369
        # simulate select2 mode, with qommon.forms.js adding an extra hidden widget
2370
        resp.form.fields['f0_display'] = Hidden(form=resp.form, tag='input', name='f0_display', pos=10)
2371
        resp.form['f0'].force_value('1')
2372
        resp.form.fields['f0_display'].force_value('hello')
2373
        resp = resp.form.submit('submit')  # -> validation page
2374
        resp = resp.form.submit('submit')  # -> submit
2375
        assert formdef.data_class().select()[0].data['0'] == '1'
2376
        assert formdef.data_class().select()[0].data['0_display'] == 'hello'
2377
        assert formdef.data_class().select()[0].data['0_structured'] == data['data'][0]
2378

  
2379
        resp = resp.follow()
2380
        url = resp.request.url
2381
        resp = resp.form.submit('button_editable')
2382
        assert 'wfedit' in resp.location
2383
        resp = resp.follow()
2384
        assert 'data-value="1"' in resp
2385
        assert 'data-initial-display-value="hello"' in resp
2386

  
2387
        # relogin
2388
        app = get_app(pub)
2389
        login(app, username='foo', password='foo')
2390
        resp = app.get(url)
2391
        resp = resp.form.submit('button_editable')
2392
        resp = resp.follow()
2393
        assert 'data-value="1"' in resp
2394
        assert 'data-initial-display-value="hello"' in resp
2395

  
2396

  
2327 2397
def test_form_count_dispatching(pub):
2328 2398
    user = create_user(pub)
2329 2399

  
wcs/fields.py
1533 1533
            return get_session().jsonp_display_values.get(
1534 1534
                            '%s_%s' % (data_source.get_jsonp_url(), value))
1535 1535

  
1536
        return data_source.get_display_value(value)
1536
        display_value = data_source.get_display_value(value)
1537
        if self.display_mode == 'autocomplete' and data_source and data_source.can_jsonp():
1538
            # store display value in session to be used by select2
1539
            url = data_source.get_jsonp_url()
1540
            if not get_session().jsonp_display_values:
1541
                get_session().jsonp_display_values = {}
1542
            get_session().jsonp_display_values['%s_%s' % (url, value)] = display_value
1543

  
1544
        return display_value
1537 1545

  
1538 1546
    def get_view_value(self, value, value_id=None, **kwargs):
1539 1547
        value = super(ItemField, self).get_view_value(value)
1540
-