misc: get select2 display/value from data source if missing (#48520)

This commit is contained in:
Frédéric Péters 2020-11-13 11:43:54 +01:00
parent abbc8aacdc
commit f7787357e7
2 changed files with 83 additions and 1 deletions

View File

@ -4585,6 +4585,79 @@ def test_formdata_workflow_form_prefill_checkbox(pub):
assert formdata.workflow_data['xxx_var_zzz_raw'] is True
def test_formdata_workflow_form_prefill_autocomplete(pub):
create_user(pub)
NamedDataSource.wipe()
data_source = NamedDataSource(name='foobar')
data_source.data_source = {'type': 'json', 'value': 'http://local-mock/test'}
data_source.query_parameter = 'q'
data_source.id_parameter = 'id'
data_source.store()
wf = Workflow(name='status')
st1 = wf.add_status('Status1', 'st1')
display_form = FormWorkflowStatusItem()
display_form.id = '_x'
display_form.by = ['_submitter']
display_form.varname = 'xxx'
display_form.formdef = WorkflowFormFieldsFormDef(item=display_form)
display_form.formdef.fields = [
fields.ItemField(id='4', label='string', type='item',
data_source={'type': 'foobar'},
required=False,
display_mode='autocomplete',
prefill={'type': 'string', 'value': '{{ form_var_foo_raw }}'},
),
]
st1.items.append(display_form)
display_form.parent = st1
wf.store()
formdef = create_formdef()
formdef.workflow_id = wf.id
formdef.fields = [
fields.ItemField(id='0', label='string', type='item',
data_source={'type': 'foobar'},
display_mode='autocomplete',
required=False,
varname='foo',
),
]
formdef.store()
formdef.data_class().wipe()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
with mock.patch('wcs.qommon.misc.urlopen') as urlopen:
data = {'data': [{'id': '1', 'text': 'hello', 'extra': 'foo'}]}
def side_effect(url, *args):
return StringIO(json.dumps(data))
urlopen.side_effect = side_effect
assert 'data-select2-url=' in resp
# simulate select2
resp.form.fields['f0_display'] = Hidden(form=resp.form, tag='input', name='f0_display', pos=10)
resp.form['f0'].force_value('1')
resp.form.fields['f0_display'].force_value('foo')
resp = resp.form.submit('submit')
assert 'Check values then click submit.' in resp
resp = resp.form.submit('submit').follow()
assert 'The form has been recorded' in resp
# check display value is in form action widget
assert resp.form['f4'].attrs['data-value'] == '1'
assert resp.form['f4'].attrs['data-initial-display-value'] == 'hello'
# check it is also displayed in a fresh session
resp = login(get_app(pub), username='foo', password='foo').get(resp.request.url)
assert resp.form['f4'].attrs['data-value'] == '1'
assert resp.form['f4'].attrs['data-initial-display-value'] == 'hello'
def test_form_map_field_back_and_submit(pub):
formdef = create_formdef()
formdef.fields = [

View File

@ -2093,9 +2093,18 @@ class JsonpSingleSelectWidget(Widget):
value = None
else:
value = htmlescape(self.value)
if not value or not get_session().jsonp_display_values:
if not value:
return None
key = '%s_%s' % (self.url, value)
if not get_session().jsonp_display_values:
get_session().jsonp_display_values = {}
if key not in get_session().jsonp_display_values:
# get display value from data source; if it works it will be put in
# jsonp_display_values as a side effect.
field = getattr(self, 'field', None)
if field:
field.get_display_value(self.value)
return get_session().jsonp_display_values.get(key)
def get_select2_url(self):