misc: enable live changes on geojson data sources (#51943)

This commit is contained in:
Thomas NOËL 2021-03-15 18:49:34 +01:00
parent 16d50764c8
commit a8abf764f9
4 changed files with 58 additions and 3 deletions

View File

@ -7184,6 +7184,57 @@ def test_field_live_select_content(pub, http_requests):
assert formdata.data['3'] == 'a'
assert formdata.data['3_display'] == 'b'
# create and use geojson datasource
NamedDataSource.wipe()
data_source = NamedDataSource(name='geofoobar')
data_source.data_source = {
'type': 'geojson',
'value': 'http://remote.example.net/geojson?plop={{form_var_bar2}}',
}
data_source.id_property = 'id'
data_source.label_template_property = '{{ text }}'
data_source.cache_duration = '5'
data_source.store()
formdef.fields[2].data_source = {'type': 'geofoobar'}
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/foo/')
assert 'f1' in resp.form.fields
assert 'f2' in resp.form.fields
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['f1'] = 'hello'
live_resp = app.post('/foo/live', params=resp.form.submit_fields())
assert live_resp.json['result']['1']['visible']
assert live_resp.json['result']['2']['visible']
assert live_resp.json['result']['3']['visible']
assert not 'items' in live_resp.json['result']['3']
resp.form['f2'] = 'plop'
live_resp = app.post('/foo/live?modified_field_id=2', params=resp.form.submit_fields())
assert live_resp.json['result']['1']['visible']
assert live_resp.json['result']['2']['visible']
assert live_resp.json['result']['3']['visible']
assert 'items' in live_resp.json['result']['3']
resp.form['f3'].options = []
for item in live_resp.json['result']['3']['items']:
# simulate javascript filling the <select>
resp.form['f3'].options.append((item['id'], False, item['text']))
resp.form['f3'] = '1'
resp = resp.form.submit('submit')
assert 'Check values then click submit.' in resp.text
assert 'name="f1"' in resp.text
assert 'name="f2"' in resp.text
assert 'name="f3"' in resp.text
resp = resp.form.submit('submit')
resp = resp.follow()
formdata = formdef.data_class().select()[0]
assert formdata.data['1'] == 'hello'
assert formdata.data['2'] == 'plop'
assert formdata.data['3'] == '1'
assert formdata.data['3_display'] == 'foo'
def test_field_live_select_content_on_workflow_form(pub, http_requests):
create_user(pub)

View File

@ -756,7 +756,7 @@ class NamedDataSource(XmlStorableObject):
def get_referenced_varnames(self, formdef):
from .fields import Field
if self.type == 'json':
if self.type in ('json', 'geojson'):
return Field.get_referenced_varnames(formdef, self.data_source.get('value'))
# else: carddef
assert self.type.startswith('carddef:'), 'data source must be carddef'

View File

@ -742,7 +742,9 @@ class FormDef(StorableObject):
live_condition_fields[varname].append(field)
if field.key == 'item' and field.data_source:
data_source = data_sources.get_object(field.data_source)
if data_source.type != 'json' and not data_source.type.startswith('carddef:'):
if data_source.type not in ('json', 'geojson') and not data_source.type.startswith(
'carddef:'
):
continue
varnames = data_source.get_referenced_varnames(formdef=self)
for varname in varnames:

View File

@ -726,7 +726,9 @@ class FormStatusPage(Directory, FormTemplateMixin):
for field in displayed_fields:
if field.key == 'item' and field.data_source:
data_source = data_sources.get_object(field.data_source)
if data_source.type != 'json' and not data_source.type.startswith('carddef:'):
if data_source.type not in ('json', 'geojson') and not data_source.type.startswith(
'carddef:'
):
continue
varnames = data_source.get_referenced_varnames(field.formdef)
if (not modified_field_varnames or modified_field_varnames.intersection(varnames)) and (