datasource: don't fail if custom view does not exist (#55405)

This commit is contained in:
Lauréline Guérin 2021-07-06 09:14:09 +02:00
parent 8c3f7b1611
commit f6c363e959
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 50 additions and 21 deletions

View File

@ -5323,6 +5323,7 @@ def test_item_field_from_cards(pub):
formdef = create_formdef()
formdef.data_class().wipe()
CardDef.wipe()
carddef = CardDef()
carddef.name = 'items'
carddef.digest_templates = {'default': '{{form_var_name}}'}
@ -5331,6 +5332,7 @@ def test_item_field_from_cards(pub):
fields.StringField(id='1', label='string', varname='attr'),
]
carddef.store()
carddef.data_class().wipe()
for i, value in enumerate(['foo', 'bar', 'baz']):
carddata = carddef.data_class()()
carddata.data = {
@ -5561,6 +5563,18 @@ def test_dynamic_item_field_from_custom_view_on_cards(pub):
assert formdef.data_class().select()[0].data['1'] in baz_ids
assert formdef.data_class().select()[0].data['1_structured']['item'] == 'baz'
# delete custom view
if pub.is_using_postgresql():
pub.loggederror_class.wipe()
custom_view.remove_self()
resp = get_app(pub).get('/test/')
assert resp.form['f1'].options == []
if pub.is_using_postgresql():
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.formdef_id == formdef.id
assert logged_error.summary == '[DATASOURCE] Unknown custom view "as-data-source" for CardDef "items"'
def test_item_field_from_cards_check_lazy_live(pub):
create_user(pub)

View File

@ -589,40 +589,55 @@ class NamedDataSource(XmlStorableObject):
def get_jsonp_url(self):
if self.type == 'jsonp':
return self.data_source.get('value')
if self.type == 'json' and self.query_parameter:
json_url = self.get_json_query_url()
info = None
if json_url:
info = {'url': json_url, 'data_source': self.id}
return '/api/autocomplete/%s' % (get_session().get_data_source_query_info_token(info))
if self.type and self.type.startswith('carddef:'):
parts = self.type.split(':')
if len(parts) > 2:
# custom view, check if it's dynamic
from wcs.carddef import CardDef
from wcs.workflows import WorkflowStatusItem
custom_view = CardDef.get_data_source_custom_view(self.type)
had_template = False
for filter_key, filter_value in custom_view.filters.items():
if not Template.is_template_string(filter_value):
continue
custom_view.filters[filter_key] = WorkflowStatusItem.compute(filter_value)
had_template = True
if had_template:
# keep altered custom view in session
return '/api/autocomplete/%s' % (
get_session().get_data_source_query_info_token(
{'carddef_ref': self.type, 'dynamic_custom_view': custom_view}
)
)
return '/api/autocomplete/%s' % (
if self.type and self.type.startswith('carddef:'):
api_url = '/api/autocomplete/%s' % (
get_session().get_data_source_query_info_token(
{
'carddef_ref': self.type,
}
)
)
parts = self.type.split(':')
if len(parts) <= 2:
return api_url
# custom view, check if it's dynamic
from wcs.carddef import CardDef
from wcs.workflows import WorkflowStatusItem
custom_view = CardDef.get_data_source_custom_view(self.type)
if custom_view is None:
get_publisher().record_error(
_('Unknown custom view "%s" for CardDef "%s"') % (parts[2], parts[1]),
context='[DATASOURCE]',
notify=True,
record=True,
)
return api_url
had_template = False
for filter_key, filter_value in custom_view.filters.items():
if not Template.is_template_string(filter_value):
continue
custom_view.filters[filter_key] = WorkflowStatusItem.compute(filter_value)
had_template = True
if had_template:
# keep altered custom view in session
api_url = '/api/autocomplete/%s' % (
get_session().get_data_source_query_info_token(
{'carddef_ref': self.type, 'dynamic_custom_view': custom_view}
)
)
return api_url
return None
def get_geojson_url(self):