cards: check on form import if carddef custom view exists (#47780)
This commit is contained in:
parent
3f4d868db2
commit
213b769d99
|
@ -378,6 +378,7 @@ def test_unknown_data_source():
|
||||||
with pytest.raises(FormdefImportError, match='Unknown datasources'):
|
with pytest.raises(FormdefImportError, match='Unknown datasources'):
|
||||||
FormDef.import_from_xml(BytesIO(export))
|
FormDef.import_from_xml(BytesIO(export))
|
||||||
|
|
||||||
|
# carddef as datasource
|
||||||
carddef = CardDef()
|
carddef = CardDef()
|
||||||
carddef.name = 'foo'
|
carddef.name = 'foo'
|
||||||
carddef.fields = [
|
carddef.fields = [
|
||||||
|
@ -398,6 +399,29 @@ def test_unknown_data_source():
|
||||||
with pytest.raises(FormdefImportError):
|
with pytest.raises(FormdefImportError):
|
||||||
FormDef.import_from_xml(BytesIO(export))
|
FormDef.import_from_xml(BytesIO(export))
|
||||||
|
|
||||||
|
# carddef custom view as datasource
|
||||||
|
pub.custom_view_class.wipe()
|
||||||
|
custom_view = pub.custom_view_class()
|
||||||
|
custom_view.title = 'card view'
|
||||||
|
custom_view.formdef = carddef
|
||||||
|
custom_view.columns = {'list': [{'id': 'id'}]}
|
||||||
|
custom_view.filters = {}
|
||||||
|
custom_view.visibility = 'datasource'
|
||||||
|
custom_view.store()
|
||||||
|
|
||||||
|
formdef.fields = [fields.StringField(
|
||||||
|
id='1', type='string',
|
||||||
|
data_source={'type': 'carddef:foo:card-view'})]
|
||||||
|
export = ET.tostring(export_to_indented_xml(formdef))
|
||||||
|
FormDef.import_from_xml(BytesIO(export))
|
||||||
|
|
||||||
|
formdef.fields = [fields.StringField(
|
||||||
|
id='1', type='string',
|
||||||
|
data_source={'type': 'carddef:foo:unknown'})]
|
||||||
|
export = ET.tostring(export_to_indented_xml(formdef))
|
||||||
|
with pytest.raises(FormdefImportError):
|
||||||
|
FormDef.import_from_xml(BytesIO(export))
|
||||||
|
|
||||||
|
|
||||||
def test_duplicated_field_ids():
|
def test_duplicated_field_ids():
|
||||||
formdef = FormDef()
|
formdef = FormDef()
|
||||||
|
|
|
@ -33,7 +33,7 @@ from quixote import get_request, get_publisher
|
||||||
from quixote.http_request import Upload
|
from quixote.http_request import Upload
|
||||||
|
|
||||||
from .qommon import _, N_, force_str, PICKLE_KWARGS
|
from .qommon import _, N_, force_str, PICKLE_KWARGS
|
||||||
from .qommon.storage import StorableObject, fix_key
|
from .qommon.storage import StorableObject, fix_key, Equal
|
||||||
from .qommon.cron import CronJob
|
from .qommon.cron import CronJob
|
||||||
from .qommon.form import *
|
from .qommon.form import *
|
||||||
from .qommon.misc import simplify, get_as_datetime, xml_node_text
|
from .qommon.misc import simplify, get_as_datetime, xml_node_text
|
||||||
|
@ -1044,19 +1044,36 @@ class FormDef(StorableObject):
|
||||||
for field in formdef.fields:
|
for field in formdef.fields:
|
||||||
data_source = getattr(field, 'data_source', None)
|
data_source = getattr(field, 'data_source', None)
|
||||||
if data_source:
|
if data_source:
|
||||||
|
data_source_id = data_source.get('type')
|
||||||
if isinstance(data_sources.get_object(data_source),
|
if isinstance(data_sources.get_object(data_source),
|
||||||
data_sources.StubNamedDataSource):
|
data_sources.StubNamedDataSource):
|
||||||
unknown_datasources.add(data_source.get('type'))
|
unknown_datasources.add(data_source_id)
|
||||||
elif data_source.get('type') and data_source.get('type').startswith('carddef:'):
|
elif data_source_id and data_source_id.startswith('carddef:'):
|
||||||
|
parts = data_source_id.split(':')
|
||||||
# check if carddef exists
|
# check if carddef exists
|
||||||
url_name = data_source['type'][8:]
|
url_name = parts[1]
|
||||||
if formdef.xml_root_node == 'carddef' and formdef.url_name == url_name:
|
if formdef.xml_root_node == 'carddef' and formdef.url_name == url_name:
|
||||||
# reference to itself, it's ok
|
# reference to itself, it's ok
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
CardDef.get_by_urlname(url_name)
|
CardDef.get_by_urlname(url_name)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
unknown_datasources.add(data_source.get('type'))
|
unknown_datasources.add(data_source_id)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if len(parts) == 2:
|
||||||
|
continue
|
||||||
|
|
||||||
|
lookup_criterias = [
|
||||||
|
Equal('formdef_type', 'carddef'),
|
||||||
|
Equal('visibility', 'datasource'),
|
||||||
|
Equal('slug', parts[2]),
|
||||||
|
]
|
||||||
|
try:
|
||||||
|
get_publisher().custom_view_class.select(lookup_criterias)[0]
|
||||||
|
except IndexError:
|
||||||
|
unknown_datasources.add(data_source_id)
|
||||||
|
|
||||||
if unknown_datasources:
|
if unknown_datasources:
|
||||||
raise FormdefImportError(N_('Unknown datasources'),
|
raise FormdefImportError(N_('Unknown datasources'),
|
||||||
details=', '.join(sorted(unknown_datasources)))
|
details=', '.join(sorted(unknown_datasources)))
|
||||||
|
|
Loading…
Reference in New Issue