From 9d396374d26100d57ac75cabb28737633529a09e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 13 Apr 2016 17:36:23 +0200 Subject: [PATCH] forms: include functions in XML export (#10650) --- tests/test_formdef_import.py | 32 ++++++++++++++++++++++++++++++++ wcs/formdef.py | 43 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/tests/test_formdef_import.py b/tests/test_formdef_import.py index 5fb1044..dba874c 100644 --- a/tests/test_formdef_import.py +++ b/tests/test_formdef_import.py @@ -12,6 +12,7 @@ from quixote import cleanup from wcs.categories import Category from wcs.formdef import FormDef, fields, FormdefImportError from wcs.workflows import Workflow +from wcs.roles import Role from qommon.misc import indent_xml as indent from utilities import create_temporary_pub @@ -308,3 +309,34 @@ def test_page_post_conditions(): fd2 = assert_xml_import_export_works(formdef) assert fd2.fields[0].type == 'page' assert fd2.fields[0].post_conditions == formdef.fields[0].post_conditions + +def test_workflow_roles(): + Role.wipe() + role = Role(name='blah') + role.store() + + formdef = FormDef() + formdef.name = 'foo' + formdef.fields = [] + formdef.workflow_roles = {'_receiver': role.id} + fd2 = assert_xml_import_export_works(formdef, include_id=True) + assert fd2.workflow_roles.get('_receiver') == role.id + + fd2 = assert_xml_import_export_works(formdef, include_id=False) + assert fd2.workflow_roles.get('_receiver') == role.id + + xml_export = export_to_indented_xml(formdef, include_id=True) + xml_export_no_id = export_to_indented_xml(formdef, include_id=False) + + # same id, different name + role.name = 'blah 2' + role.store() + + fd2 = FormDef.import_from_xml_tree(xml_export, include_id=True) + assert fd2.workflow_roles.get('_receiver') == role.id + fd2 = FormDef.import_from_xml_tree(xml_export, include_id=False) + assert fd2.workflow_roles.get('_receiver') is None + + role.remove_self() + fd2 = FormDef.import_from_xml_tree(xml_export, include_id=True) + assert fd2.workflow_roles.get('_receiver') is None diff --git a/wcs/formdef.py b/wcs/formdef.py index 6dffc51..4d32186 100644 --- a/wcs/formdef.py +++ b/wcs/formdef.py @@ -31,7 +31,7 @@ from qommon.substitution import Substitutions from qommon.publisher import get_publisher_class from formdata import FormData -from roles import logged_users_role +from roles import Role, logged_users_role from categories import Category import fields import data_sources @@ -675,6 +675,25 @@ class FormDef(StorableObject): for field in self.fields or []: fields.append(field.export_to_xml(charset=charset, include_id=include_id)) + if self.workflow_roles: + roles = ET.SubElement(root, 'roles') + for role_key, role_id in self.workflow_roles.items(): + if role_id is None: + continue + role_id = str(role_id) + if role_id.startswith('_') or role_id == 'logged-users': + role = unicode(role_id, charset) + else: + try: + role = unicode(Role.get(role_id).name, charset) + except KeyError: + role = unicode(role_id, charset) + sub = ET.SubElement(roles, 'role') + sub.attrib['role_key'] = role_key + if include_id: + sub.attrib['role_id'] = role_id + sub.text = role + options = ET.SubElement(root, 'options') for option in self.workflow_options or []: element = ET.SubElement(options, 'option') @@ -813,6 +832,28 @@ class FormDef(StorableObject): formdef.workflow_id = w.id break + if tree.find('roles') is not None: + roles_node = tree.find('roles') + formdef.workflow_roles = {} + for child in roles_node.getchildren(): + role_key = child.attrib['role_key'] + role_id = None + value = child.text.encode(charset) + if value.startswith('_') or value == 'logged-users': + role_id = value + elif include_id: + role_id = child.attrib.get('role_id') + else: + for role in Role.select(ignore_errors=True): + if role.name == value: + role_id = role.id + break + + if role_id and not Role.has_key(role_id): + role_id = None + + formdef.workflow_roles[role_key] = role_id + return formdef def get_detailed_email_form(self, formdata, url): -- 2.8.0.rc3