From 40f68770504e674753c0117167032ce319027c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 17 Aug 2015 13:47:08 +0200 Subject: [PATCH] formdef: don't import invalid category/worflow references (#8021) --- tests/test_admin_pages.py | 2 +- tests/test_formdef_import.py | 74 ++++++++++++++++++++++++++++++++++++++++++-- wcs/formdef.py | 10 ++++-- 3 files changed, 80 insertions(+), 6 deletions(-) diff --git a/tests/test_admin_pages.py b/tests/test_admin_pages.py index 33653f0..56a29b8 100644 --- a/tests/test_admin_pages.py +++ b/tests/test_admin_pages.py @@ -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 diff --git a/tests/test_formdef_import.py b/tests/test_formdef_import.py index eaf95ac..40e89b6 100644 --- a/tests/test_formdef_import.py +++ b/tests/test_formdef_import.py @@ -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 diff --git a/wcs/formdef.py b/wcs/formdef.py index 8095e67..2e73eea 100644 --- a/wcs/formdef.py +++ b/wcs/formdef.py @@ -725,7 +725,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(): @@ -734,12 +736,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 -- 2.5.0