general: use compatibility dict when rendering ezt (#49395)

This commit is contained in:
Frédéric Péters 2020-12-12 10:52:41 +01:00
parent 47f956dd37
commit 93ef308b1b
2 changed files with 58 additions and 0 deletions

View File

@ -6737,6 +6737,60 @@ def test_item_field_autocomplete_cards_source(pub):
assert formdef.data_class().select()[0].data['0_display'] == 'bar'
def test_item_field_autocomplete_ezt_variable_jsonp(http_requests, pub):
formdef = create_formdef()
formdef.data_class().wipe()
formdef.fields = [
fields.PageField(id='0', label='1st page', type='page'),
fields.ItemField(id='1', label='foo', type='item', varname='foo',
data_source={'type': 'jsonp', 'value': '[site_url]/foo-jsonp'},
),
fields.PageField(id='2', label='2nd page', type='page'),
fields.ItemField(id='3', label='bar', type='item',
data_source={'type': 'jsonp', 'value': '[site_url]/foo-jsonp?a=[form_var_foo_raw]'},
),
]
formdef.store()
app = get_app(pub)
with mock.patch('wcs.qommon.misc.urlopen') as urlopen:
resp = app.get('/test/')
assert urlopen.call_count == 0
pq = resp.pyquery.remove_namespaces()
select2_url = pq('select').attr['data-select2-url']
assert select2_url == 'http://example.net/foo-jsonp'
# simulate select2 mode, with qommon.forms.js adding an extra hidden widget
resp.form.fields['f1_display'] = [Hidden(form=resp.form, tag='input', name='f1_display', pos=10)]
resp.form.field_order.append(('f1_display', resp.form.fields['f1_display'][0]))
resp.form['f1'].force_value('1')
resp.form['f1_display'].force_value('hello')
with mock.patch('wcs.qommon.misc.urlopen') as urlopen:
resp = resp.form.submit('submit') # -> 2nd page
assert urlopen.call_count == 0
assert resp.pyquery('select').attr['data-select2-url'] == 'http://example.net/foo-jsonp?a=1'
# simulate select2 mode, with qommon.forms.js adding an extra hidden widget
resp.form.fields['f3_display'] = [Hidden(form=resp.form, tag='input', name='f3_display', pos=10)]
resp.form.field_order.append(('f3_display', resp.form.fields['f3_display'][0]))
resp.form['f3'].force_value('2')
resp.form['f3_display'].force_value('hello2')
with mock.patch('wcs.qommon.misc.urlopen') as urlopen:
resp = resp.form.submit('submit') # -> validation
resp = resp.form.submit('submit') # -> submit
assert urlopen.call_count == 0
assert formdef.data_class().select()[0].data['1'] == '1'
assert formdef.data_class().select()[0].data['1_display'] == 'hello'
assert formdef.data_class().select()[0].data['3'] == '2'
assert formdef.data_class().select()[0].data['3_display'] == 'hello2'
# no _structured data for pure jsonp sources
assert '1_structured' not in formdef.data_class().select()[0].data
assert '3_structured' not in formdef.data_class().select()[0].data
def test_form_data_keywords(pub):
formdef = create_formdef()
formdef.keywords = 'hello,world'

View File

@ -321,6 +321,10 @@ class Template:
return self.data[k]
except KeyError:
raise AttributeError(k)
# use custom dictionary to support underscored variables.
from wcs.qommon.substitution import CompatibilityNamesDict
data = CompatibilityNamesDict(data)
data = _data_ob(data)
ctx = _context()