formdef: don't import invalid category/worflow references (#8021)
This commit is contained in:
parent
d8c6553f6a
commit
0dbc1f11b7
|
@ -565,7 +565,7 @@ def test_form_import():
|
|||
formdef.name = 'form title'
|
||||
formdef.fields = []
|
||||
formdef.store()
|
||||
formdef_xml = ET.tostring(formdef.export_to_xml(include_id=False))
|
||||
formdef_xml = ET.tostring(formdef.export_to_xml(include_id=True))
|
||||
|
||||
FormDef.wipe()
|
||||
assert FormDef.count() == 0
|
||||
|
|
|
@ -8,7 +8,9 @@ import xml.etree.ElementTree as ET
|
|||
|
||||
from quixote import cleanup
|
||||
|
||||
from wcs.categories import Category
|
||||
from wcs.formdef import FormDef, fields
|
||||
from wcs.workflows import Workflow
|
||||
from qommon.misc import indent_xml as indent
|
||||
|
||||
from utilities import create_temporary_pub
|
||||
|
@ -35,8 +37,8 @@ def assert_compare_formdef(formdef1, formdef2, include_id=False):
|
|||
formdef2.export_to_json(include_id=include_id, indent=2)
|
||||
|
||||
def assert_xml_import_export_works(formdef, include_id=False):
|
||||
formdef2 = FormDef.import_from_xml_tree(
|
||||
formdef.export_to_xml(include_id=include_id), include_id=include_id)
|
||||
formdef_xml = formdef.export_to_xml(include_id=include_id)
|
||||
formdef2 = FormDef.import_from_xml_tree(formdef_xml, include_id=include_id)
|
||||
assert_compare_formdef(formdef, formdef2, include_id=include_id)
|
||||
return formdef2
|
||||
|
||||
|
@ -157,3 +159,71 @@ def test_workflow_options_with_no_values():
|
|||
assert fd2.workflow_options == formdef.workflow_options
|
||||
fd2 = assert_json_import_export_works(formdef)
|
||||
assert fd2.workflow_options == formdef.workflow_options
|
||||
|
||||
def test_workflow_reference():
|
||||
Workflow.wipe()
|
||||
FormDef.wipe()
|
||||
|
||||
wf = Workflow()
|
||||
wf.name = 'test workflow'
|
||||
wf.store()
|
||||
|
||||
formdef = FormDef()
|
||||
formdef.name = 'foo'
|
||||
formdef.workflow_id = wf.id
|
||||
f2 = assert_xml_import_export_works(formdef)
|
||||
assert f2.workflow_id == formdef.workflow_id
|
||||
|
||||
f2 = assert_xml_import_export_works(formdef, include_id=True)
|
||||
assert f2.workflow_id == formdef.workflow_id
|
||||
|
||||
formdef_xml_with_id = formdef.export_to_xml(include_id=True)
|
||||
formdef_xml_without_id = formdef.export_to_xml(include_id=False)
|
||||
|
||||
# check there's no reference to a non-existing workflow
|
||||
Workflow.wipe()
|
||||
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).workflow_id is None
|
||||
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).workflow_id is None
|
||||
|
||||
# check an import that is not using id fields will find the workflow by its
|
||||
# name
|
||||
wf = Workflow()
|
||||
wf.id = '2'
|
||||
wf.name = 'test workflow'
|
||||
wf.store()
|
||||
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).workflow_id == '2'
|
||||
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).workflow_id is None
|
||||
|
||||
def test_category_reference():
|
||||
Category.wipe()
|
||||
FormDef.wipe()
|
||||
|
||||
cat = Category()
|
||||
cat.name = 'test category'
|
||||
cat.store()
|
||||
|
||||
formdef = FormDef()
|
||||
formdef.name = 'foo'
|
||||
formdef.category_id = cat.id
|
||||
f2 = assert_xml_import_export_works(formdef)
|
||||
assert f2.category_id == formdef.category_id
|
||||
|
||||
f2 = assert_xml_import_export_works(formdef, include_id=True)
|
||||
assert f2.category_id == formdef.category_id
|
||||
|
||||
formdef_xml_with_id = formdef.export_to_xml(include_id=True)
|
||||
formdef_xml_without_id = formdef.export_to_xml(include_id=False)
|
||||
|
||||
# check there's no reference to a non-existing category
|
||||
Category.wipe()
|
||||
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).category_id is None
|
||||
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).category_id is None
|
||||
|
||||
# check an import that is not using id fields will find the category by its
|
||||
# name
|
||||
cat = Category()
|
||||
cat.id = '2'
|
||||
cat.name = 'test category'
|
||||
cat.store()
|
||||
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=False).category_id == '2'
|
||||
assert FormDef.import_from_xml_tree(formdef_xml_with_id, include_id=True).category_id is None
|
||||
|
|
|
@ -718,7 +718,9 @@ class FormDef(StorableObject):
|
|||
if tree.find('category') is not None:
|
||||
category_node = tree.find('category')
|
||||
if include_id and category_node.attrib.get('category_id'):
|
||||
formdef.category_id = str(category_node.attrib.get('category_id'))
|
||||
category_id = str(category_node.attrib.get('category_id'))
|
||||
if Category.has_key(category_id):
|
||||
formdef.category_id = category_id
|
||||
else:
|
||||
category = category_node.text.encode(charset)
|
||||
for c in Category.select():
|
||||
|
@ -727,12 +729,14 @@ class FormDef(StorableObject):
|
|||
break
|
||||
|
||||
if tree.find('workflow') is not None:
|
||||
from wcs.workflows import Workflow
|
||||
workflow_node = tree.find('workflow')
|
||||
if include_id and workflow_node.attrib.get('workflow_id'):
|
||||
formdef.workflow_id = workflow_node.attrib.get('workflow_id')
|
||||
workflow_id = workflow_node.attrib.get('workflow_id')
|
||||
if Workflow.has_key(workflow_id):
|
||||
formdef.workflow_id = workflow_id
|
||||
else:
|
||||
workflow = workflow_node.text.encode(charset)
|
||||
from wcs.workflows import Workflow
|
||||
for w in Workflow.select():
|
||||
if w.name == workflow:
|
||||
formdef.workflow_id = w.id
|
||||
|
|
Loading…
Reference in New Issue