formdef: don't import invalid category/worflow references (#8021)

This commit is contained in:
Frédéric Péters 2015-08-17 13:47:08 +02:00
parent d8c6553f6a
commit 0dbc1f11b7
3 changed files with 80 additions and 6 deletions

View File

@ -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

View File

@ -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

View File

@ -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