diff --git a/orbeon_xml_api/__init__.py b/orbeon_xml_api/__init__.py index b501ab1..3a7c623 100644 --- a/orbeon_xml_api/__init__.py +++ b/orbeon_xml_api/__init__.py @@ -1,6 +1,2 @@ -# -*- coding: utf-8 -*- -# Copyright 2017-2018 Bob Leers (http://www.novacode.nl) -# See LICENSE file for full licensing details. - # from . import tests from . import builder diff --git a/orbeon_xml_api/builder.py b/orbeon_xml_api/builder.py index c6cfd8f..35cb870 100644 --- a/orbeon_xml_api/builder.py +++ b/orbeon_xml_api/builder.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2017-2018 Bob Leers (http://www.novacode.nl) -# See LICENSE file for full licensing details. + + from lxml import etree @@ -10,7 +10,7 @@ BooleanControl, AnyUriControl, EmailControl, DecimalControl, \ Select1Control, OpenSelect1Control, SelectControl, ImageAnnotationControl from utils import generate_xml_root, unaccent_unicode - +#.ITERITEMS ARE MADE TO ITEMS() # `xforms:` types are here for backwards compatibility. XF_TYPE_CONTROL = { 'xf:string': StringControl, diff --git a/orbeon_xml_api/controls.py b/orbeon_xml_api/controls.py index befce16..085340c 100644 --- a/orbeon_xml_api/controls.py +++ b/orbeon_xml_api/controls.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2017-2018 Bob Leers (http://www.novacode.nl) -# See LICENSE file for full licensing details. + + from datetime import datetime, time from lxml import etree diff --git a/orbeon_xml_api/runner.py b/orbeon_xml_api/runner.py index 7dd3ade..156aee4 100644 --- a/orbeon_xml_api/runner.py +++ b/orbeon_xml_api/runner.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2017-2018 Bob Leers (http://www.novacode.nl) -# See LICENSE file for full licensing details. + + import re from lxml import etree @@ -128,28 +128,80 @@ def set_value(self, name, value): def merge(self, builder_obj, **kwargs): # TODO Move and rebuild into RunnerCopyBuilderMerge (class) + parser = etree.XMLParser(ns_clean=True, encoding='utf-8') + root = etree.XML('
', parser) + no_copy_prefix = kwargs.get('no_copy_prefix', None) + parents = {} - merged_form = builder_obj.get_form_instance_raw() - merged_form = etree.fromstring(merged_form) - - for element in merged_form.iter(): - tag = element.tag - if tag not in ['annotation', 'image']: - if isinstance(tag, basestring): - if no_copy_prefix and tag.startswith(no_copy_prefix): - pass - else: - ov = self.xml_root.xpath('//%s' % tag) - if len(ov) > 0 and ov[0].text: - if len(ov[0].text.strip()) > 0: - element.text = ov[0].text - merge_form_xml = etree.tostring(merged_form) + for tag, element in builder_obj.controls.iteritems(): + if tag in self.builder.controls.keys(): + # k_: Known elements (present in original runner/builder) + k_control = self.builder.controls.get(tag, False) + + if not k_control: + continue + + k_parent_control = k_control._parent + k_form_element = self.get_form_element(tag) + + # Sections (escpecially) + if k_parent_control is None and tag not in parents: + parents[tag] = etree.Element(tag) + root.append(parents[tag]) + + # Controls + if k_form_element is not None: + if k_parent_control is not None and hasattr(k_parent_control, '_bind') and k_parent_control._bind.name not in parents: + k_el_parent = etree.Element(k_parent_control._bind.name) + parents[k_parent_control._bind.name] = k_el_parent + root.append(k_el_parent) + + if no_copy_prefix is not None and re.search(r"^%s" % no_copy_prefix, tag) is not None: + # Instead of the Runner control, add the Builder model_instance + parents[k_parent_control._bind.name].append(k_control._model_instance) + else: + parents[k_parent_control._bind.name].append(k_form_element) + # root.append(k_form_element) + else: + # n_: New elements + n_new_control = builder_obj.controls.get(tag, False) + + if not n_new_control: + continue + + n_parent_control = n_new_control._parent + + # Sections (escpecially) don't have a parent, hence it's