carddefs: check on form import if carddef exists (#42579)
This commit is contained in:
parent
ac4a4fc227
commit
d8fc1952a5
|
@ -4630,6 +4630,9 @@ def test_settings_export_import(pub, studio):
|
|||
formdef.roles = [role.id]
|
||||
formdef.backoffice_submission_roles = [role.id]
|
||||
formdef.workflow_roles = {'_receiver': role.id}
|
||||
formdef.fields = [fields.StringField(
|
||||
id='1', type='string',
|
||||
data_source={'type': 'carddef:unknown'})]
|
||||
formdef.store()
|
||||
|
||||
resp = app.get('/backoffice/settings/export')
|
||||
|
@ -4666,6 +4669,7 @@ def test_settings_export_import(pub, studio):
|
|||
assert FormDef.select()[0].roles == ['012345']
|
||||
assert FormDef.select()[0].backoffice_submission_roles == ['012345']
|
||||
assert FormDef.select()[0].workflow_roles == {'_receiver': '012345'}
|
||||
assert len(FormDef.select()[0].fields) == 1
|
||||
assert Workflow.select()[0].possible_status[0].items[0].by == ['012345']
|
||||
|
||||
# do not export roles when managed by idp
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import pytest
|
||||
import sys
|
||||
import shutil
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
|
@ -10,6 +9,7 @@ from django.utils.six import BytesIO, StringIO
|
|||
from quixote import cleanup
|
||||
|
||||
from wcs.categories import Category
|
||||
from wcs.carddef import CardDef
|
||||
from wcs.formdef import FormDef, fields, FormdefImportError
|
||||
from wcs.workflows import Workflow
|
||||
from wcs.roles import Role
|
||||
|
@ -346,15 +346,37 @@ def test_invalid_field_type():
|
|||
def test_unknown_data_source():
|
||||
formdef = FormDef()
|
||||
formdef.name = 'foo'
|
||||
formdef.fields = [fields.StringField(id='1', type='string',
|
||||
formdef.fields = [fields.StringField(
|
||||
id='1', type='string',
|
||||
data_source={'type': 'json', 'value': 'http://example.net'})]
|
||||
export = ET.tostring(export_to_indented_xml(formdef))
|
||||
|
||||
FormDef.import_from_xml(BytesIO(export))
|
||||
|
||||
formdef.fields = [fields.StringField(id='1', type='string',
|
||||
formdef.fields = [fields.StringField(
|
||||
id='1', type='string',
|
||||
data_source={'type': 'foobar'})]
|
||||
export = ET.tostring(export_to_indented_xml(formdef))
|
||||
with pytest.raises(FormdefImportError, match='Unknown datasources'):
|
||||
FormDef.import_from_xml(BytesIO(export))
|
||||
|
||||
carddef = CardDef()
|
||||
carddef.name = 'foo'
|
||||
carddef.fields = [
|
||||
fields.StringField(id='1', label='Test', type='string', varname='foo'),
|
||||
]
|
||||
carddef.store()
|
||||
|
||||
formdef.fields = [fields.StringField(
|
||||
id='1', type='string',
|
||||
data_source={'type': 'carddef:foo'})]
|
||||
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:unknown'})]
|
||||
export = ET.tostring(export_to_indented_xml(formdef))
|
||||
with pytest.raises(FormdefImportError):
|
||||
FormDef.import_from_xml(BytesIO(export))
|
||||
|
||||
|
|
|
@ -1009,6 +1009,7 @@ class FormDef(StorableObject):
|
|||
@classmethod
|
||||
def import_from_xml(cls, fd, charset=None, include_id=False,
|
||||
fix_on_error=False, check_datasources=True):
|
||||
from wcs.carddef import CardDef
|
||||
try:
|
||||
tree = ET.parse(fd)
|
||||
except:
|
||||
|
@ -1039,6 +1040,12 @@ class FormDef(StorableObject):
|
|||
if isinstance(data_sources.get_object(data_source),
|
||||
data_sources.StubNamedDataSource):
|
||||
unknown_datasources.add(data_source.get('type'))
|
||||
elif data_source.get('type') and data_source.get('type').startswith('carddef:'):
|
||||
# check if carddef exists
|
||||
try:
|
||||
CardDef.get_by_urlname(data_source['type'][8:])
|
||||
except KeyError:
|
||||
unknown_datasources.add(data_source.get('type'))
|
||||
if unknown_datasources:
|
||||
raise FormdefImportError(N_('Unknown datasources'),
|
||||
details=', '.join(sorted(unknown_datasources)))
|
||||
|
|
Loading…
Reference in New Issue