datasource: don't fail if custom view does not exist (#55405)
This commit is contained in:
parent
8c3f7b1611
commit
f6c363e959
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue