[Erp5-report] r31034 nicolas - /erp5/trunk/products/ERP5OOo/FormPrintout.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Dec 3 15:49:57 CET 2009
Author: nicolas
Date: Thu Dec 3 15:49:56 2009
New Revision: 31034
URL: http://svn.erp5.org?rev=31034&view=rev
Log:
Use render_odt on fields
Modified:
erp5/trunk/products/ERP5OOo/FormPrintout.py
Modified: erp5/trunk/products/ERP5OOo/FormPrintout.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/FormPrintout.py?rev=31034&r1=31033&r2=31034&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/FormPrintout.py [utf8] (original)
+++ erp5/trunk/products/ERP5OOo/FormPrintout.py [utf8] Thu Dec 3 15:49:56 2009
@@ -43,6 +43,7 @@
from urllib import quote, quote_plus
from copy import deepcopy
from lxml import etree
+from lxml.etree import _Element, _ElementStringResult
from zLOG import LOG, DEBUG, INFO, WARNING
from mimetypes import guess_extension
from DateTime import DateTime
@@ -897,6 +898,9 @@
class ODTStrategy(ODFStrategy):
"""ODTStrategy create a ODT Document from a form and a ODT template"""
+
+ _style_attribute_name = '{urn:oasis:names:tc:opendocument:xmlns:text:1.0}style-name'
+
def _replaceXmlByForm(self, element_tree=None, form=None, here=None,
extra_context=None, ooo_builder=None, iteration_index=0):
"""
@@ -963,21 +967,16 @@
<text:reference-mark text:name="invoice-date"/>
"""
field_id = field.id
- field_value = self._renderField(field)
- value = self._toUnicodeString(field_value)
- # text:reference-mark text:name="invoice-date"
reference_xpath = '//text:reference-mark[@text:name="%s"]' % field_id
reference_list = element_tree.xpath(reference_xpath, namespaces=element_tree.nsmap)
- if len(reference_list) > 0:
- target_node = reference_list[0]
- paragraph_node = reference_list[0].getparent()
- if not isinstance(field_value, list):
- # remove such a "bbb": <text:p>aaa<text:line-break/>bbb</text:p>
- for child in paragraph_node.getchildren():
- child.tail = ''
- paragraph_node.text = value
- else:
- self._appendParagraphsWithLineList(target_node=target_node, line_list=field_value)
+ for target_node in reference_list:
+ node_to_replace = target_node.xpath('ancestor::text:p[1]', namespaces=element_tree.nsmap)[0]
+ attr_dict = {}
+ style_value = node_to_replace.attrib.get(self._style_attribute_name)
+ if style_value:
+ attr_dict.update({self._style_attribute_name: style_value})
+ new_node = field.render_odt(attr_dict=attr_dict)
+ node_to_replace.getparent().replace(node_to_replace, new_node)
# set when using report section
self._setUniqueElementName(base_name=field.id,
iteration_index=iteration_index,
@@ -991,34 +990,28 @@
range reference example:
<text:reference-mark-start text:name="week"/>Monday<text:reference-mark-end text:name="week"/>
or
- <text:reference-mark-start text:name="my_title"/><text:span text:style-name="T1">title</text:span>
+ <text:reference-mark-start text:name="my_title"/>
+ <text:span text:style-name="T1">title</text:span>
<text:reference-mark-end text:name="my_title"/>
"""
- field_value = self._renderField(field)
- value = self._toUnicodeString(field_value)
- range_reference_xpath = '//text:reference-mark-start[@text:name="%s"]' % field.id
+ field_id = field.id
+ range_reference_xpath = '//text:reference-mark-start[@text:name="%s"]/'\
+ 'following-sibling::*[node()/'\
+ 'following::text:reference-mark-end[@text:name="%s"]]' % (field_id, field_id)
reference_list = element_tree.xpath(range_reference_xpath, namespaces=element_tree.nsmap)
- if len(reference_list) is 0:
+ if not reference_list:
return element_tree
- target_node = reference_list[0]
- if not isinstance(field_value, list):
- next_node = target_node.getnext()
- span_tag_name = '{%s}span' % element_tree.nsmap['text']
- if next_node is not None and next_node.tag == span_tag_name:
- next_node.text = value
- else:
- target_node.tail = value
- # clear text until 'reference-mark-end'
- for node in target_node.itersiblings():
- end_tag_name = '{%s}reference-mark-end' % element_tree.nsmap['text']
- name_attribute = '{%s}name' % element_tree.nsmap['text']
- if node.tag == end_tag_name and node.get(name_attribute) == field.id:
- break
- node.tail = ''
- else:
- self._appendParagraphsWithLineList(target_node=target_node, line_list=field_value)
-
+ parent_node_xpath = '//text:reference-mark-start[@text:name="%s"]/parent::*[1]' % field_id
+ parent_node = element_tree.xpath(parent_node_xpath, namespaces=element_tree.nsmap)[0]
+ text_reference_position = int(parent_node.xpath('count(preceding-sibling::text:reference-mark-start)', namespaces=element_tree.nsmap))
+
+ #Delete all contents between <text:reference-mark-start/> and <text:reference-mark-end/>
+ #Try to fetch style-name
+ attr_dict = {}
+ [(attr_dict.update(target_node.attrib), parent_node.remove(target_node)) for target_node in reference_list]
+ new_node = field.render_odt(local_name='span', attr_dict=attr_dict)
+ parent_node.insert(text_reference_position+1, new_node)
# set when using report section
self._setUniqueElementName(base_name=field.id,
iteration_index=iteration_index,
@@ -1026,40 +1019,12 @@
element_tree=element_tree)
return element_tree
- def _appendParagraphsWithLineList(self, target_node=None, line_list=None):
- """Create paragraphs using an ERP5 Form line list.
-
- Keyword arguments:
- target_node -- target text node which is marked by an ODF reference.
- line_list -- an ERP5 Form line list
-
- example:
- --
- first line
- second line
- --
- <p:text>
- first line
- </p:text>
- <p:text>
- second line
- </p:text>
- """
- paragraph_node = target_node.getparent()
- parent_node = paragraph_node.getparent()
- paragraph_list = []
- for line in line_list:
- p = deepcopy(paragraph_node)
- for child in p.getchildren():
- child.tail = ''
- value = self._toUnicodeString(line)
- p.text = value
- paragraph_list.append(p)
- paragraph_node_index = parent_node.index(paragraph_node)
- parent_node.remove(paragraph_node)
- for (index, paragraph) in enumerate(paragraph_list):
- parent_node.insert(paragraph_node_index, paragraph)
- paragraph_node_index = paragraph_node_index + 1
+ # set when using report section
+ self._setUniqueElementName(base_name=field.id,
+ iteration_index=iteration_index,
+ xpath=range_reference_xpath,
+ element_tree=element_tree)
+ return element_tree
class ODGStrategy(ODFStrategy):
"""ODGStrategy create a ODG Document from a form and a ODG template"""
More information about the Erp5-report
mailing list