datasources: avoid raising on lost datasource (#18431)

This commit is contained in:
Nicolas Roche 2019-10-11 10:38:40 +02:00
parent 215209fb98
commit 0085120f84
3 changed files with 29 additions and 4 deletions

View File

@ -4238,6 +4238,25 @@ def test_form_text_field_submit(pub):
resp = resp.forms[0].submit('submit')
assert 'Check values then click submit.' in resp.body
def test_unknown_datasource(pub):
formdef = create_formdef()
formdef.fields = [
fields.StringField(id='1', label='string',
varname='string', required=False, data_source={'type': 'foobar'}),
fields.ItemField(id='2', label='item',
varname='item', required=False, data_source={'type': 'foobar'}),
fields.ItemsField(id='3', label='items',
varname='items', required=False, data_source={'type': 'foobar'}),
]
formdef.store()
data_class = formdef.data_class()
data_class.wipe()
resp = get_app(pub).get('/test/')
formdef.data_class().wipe()
resp = resp.forms[0].submit('submit') # should go straight to validation
assert 'Check values then click submit.' in resp.body
def test_form_items_datasource(pub):
formdef = create_formdef()
formdef.fields = [fields.ItemsField(id='1', label='items',

View File

@ -249,6 +249,12 @@ def get_object(data_source):
return NamedDataSource.get_by_slug(ds_type)
class StubNamedDataSource(object):
type = 'formula'
data_source = {'type': 'formula', 'value': []}
cache_duration = None
class NamedDataSource(XmlStorableObject):
_names = 'datasources'
_xml_tagname = 'datasources'
@ -330,7 +336,8 @@ class NamedDataSource(XmlStorableObject):
objects = [x for x in cls.select() if x.slug == slug]
if objects:
return objects[0]
raise KeyError("data source '%s' does not exist" % slug)
get_logger().warn("data source '%s' does not exist" % slug)
return StubNamedDataSource()
def get_json_query_url(self):
url = self.data_source.get('value').strip()

View File

@ -1010,9 +1010,8 @@ class FormDef(StorableObject):
for field in formdef.fields:
data_source = getattr(field, 'data_source', None)
if data_source:
try:
data_sources.get_real(data_source)
except KeyError:
if isinstance(data_sources.get_object(data_source),
data_sources.StubNamedDataSource):
unknown_datasources.add(data_source.get('type'))
if unknown_datasources:
raise FormdefImportError(N_('Unknown datasources'),