misc: get select2 display/value from data source if missing (#48520)
This commit is contained in:
parent
abbc8aacdc
commit
f7787357e7
|
@ -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 = [
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue