forms: make /live return extended attributes to timetable fiels (#56095)

This commit is contained in:
Frédéric Péters 2021-08-10 14:47:16 +02:00
parent d9e02ccb38
commit ab12779161
2 changed files with 48 additions and 0 deletions

View File

@ -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()

View File

@ -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')