forms: make /live return extended attributes to timetable fiels (#56095)
This commit is contained in:
parent
d9e02ccb38
commit
ab12779161
|
@ -7648,6 +7648,48 @@ def test_field_live_select_extended_content(pub, http_requests):
|
|||
assert live_resp.json['result']['3']['items'][0]['foo'] == 'bar'
|
||||
|
||||
|
||||
def test_field_live_timetable_select(pub, http_requests):
|
||||
NamedDataSource.wipe()
|
||||
data_source = NamedDataSource(name='foobar')
|
||||
data_source.data_source = {
|
||||
'type': 'json',
|
||||
'value': 'http://remote.example.net/api/datetimes{% if form_var_bar2 %}?{% endif %}',
|
||||
}
|
||||
data_source.store()
|
||||
|
||||
FormDef.wipe()
|
||||
formdef = FormDef()
|
||||
formdef.name = 'Foo'
|
||||
formdef.fields = [
|
||||
fields.StringField(type='string', id='2', label='Bar2', size='40', required=True, varname='bar2'),
|
||||
fields.ItemField(
|
||||
id='3', type='item', label='datetime', display_mode='timetable', data_source={'type': 'foobar'}
|
||||
),
|
||||
]
|
||||
formdef.store()
|
||||
formdef.data_class().wipe()
|
||||
|
||||
app = get_app(pub)
|
||||
|
||||
with mock.patch('wcs.qommon.misc.urlopen') as urlopen:
|
||||
data = {
|
||||
"data": [
|
||||
{"id": "1", "datetime": "2021-01-12 10:00:00", "text": "event 1", "api": {}},
|
||||
{"id": "2", "datetime": "2021-01-13 10:20:00", "text": "event 2", "api": {}},
|
||||
{"id": "3", "datetime": "2021-01-14 10:40:00", "text": "event 3", "api": {}},
|
||||
]
|
||||
}
|
||||
urlopen.side_effect = lambda *args: io.StringIO(json.dumps(data))
|
||||
|
||||
resp = app.get('/foo/')
|
||||
assert resp.html.find('div', {'data-field-id': '2'}).attrs['data-live-source'] == 'true'
|
||||
assert resp.html.find('div', {'data-field-id': '3'}).find('select')
|
||||
resp.form['f2'] = 'plop'
|
||||
live_resp = app.post('/foo/live?modified_field_id=2', params=resp.form.submit_fields())
|
||||
assert 'datetime' in live_resp.json['result']['3']['items'][0]
|
||||
assert 'api' not in live_resp.json['result']['3']['items'][0]
|
||||
|
||||
|
||||
def test_field_live_comment_content(pub, http_requests):
|
||||
FormDef.wipe()
|
||||
formdef = FormDef()
|
||||
|
|
|
@ -765,6 +765,12 @@ class FormStatusPage(Directory, FormTemplateMixin):
|
|||
if 'template-' in (field.extra_css_class or ''):
|
||||
# custom template, it may need all option attributes
|
||||
result[field.id]['items'] = field.get_extended_options()
|
||||
elif field.display_mode == 'timetable':
|
||||
# timetables require additional attributes
|
||||
result[field.id]['items'] = field.get_extended_options()
|
||||
# but reduce payload weight by removing the API URLs
|
||||
for options in result[field.id]['items']:
|
||||
options.pop('api', None)
|
||||
else:
|
||||
result[field.id]['items'] = [
|
||||
{'id': x[2], 'text': x[1]} for x in field.get_options(mode='lazy')
|
||||
|
|
Loading…
Reference in New Issue