[Erp5-report] r26637 - in /erp5/trunk/products/ERP5OOo: ./ tests/ tests/test_document/
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon Apr 27 04:12:27 CEST 2009
Author: tatuya
Date: Mon Apr 27 04:12:26 2009
New Revision: 26637
URL: http://svn.erp5.org?rev=26637&view=rev
Log:
* Fix
- LinesField via point-reference did not work,
because it looked wrong node
- LinesField insert order was wrong, it was reversed
* Append
replacing some control charactors such as
tabs and line-breaks
Modified:
erp5/trunk/products/ERP5OOo/FormPrintout.py
erp5/trunk/products/ERP5OOo/tests/testFormPrintout.py
erp5/trunk/products/ERP5OOo/tests/test_document/Foo_001.odt
Modified: erp5/trunk/products/ERP5OOo/FormPrintout.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/FormPrintout.py?rev=26637&r1=26636&r2=26637&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/FormPrintout.py [utf8] (original)
+++ erp5/trunk/products/ERP5OOo/FormPrintout.py [utf8] Mon Apr 27 04:12:26 2009
@@ -45,6 +45,7 @@
from mimetypes import guess_extension
from DateTime import DateTime
from decimal import Decimal
+from xml.sax.saxutils import escape
import re
try:
@@ -363,15 +364,16 @@
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()
parent_node = paragraph_node.getparent()
- # remove such a "bbb": <text:p>aaa<br/>bbb</text:p>
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
+ paragraph_node.text = value
else:
- self._appendParagraphsWithLineList(target_node=paragraph_node, line_list=field_value)
+ self._appendParagraphsWithLineList(target_node=target_node, line_list=field_value)
# set when using report section
self._setUniqueElementName(base_name=field.id,
iteration_index=iteration_index,
@@ -394,6 +396,7 @@
target_node = reference_list[0]
if not isinstance(field_value, list):
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']
@@ -438,8 +441,9 @@
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 + 1, paragraph)
-
+ parent_node.insert(paragraph_node_index, paragraph)
+ paragraph_node_index = paragraph_node_index + 1
+
def _replaceXmlByReportSection(self, element_tree=None, extra_context=None, ooo_builder=None):
if not extra_context.has_key('report_method') or extra_context['report_method'] is None:
return element_tree
@@ -762,25 +766,58 @@
def _setColumnValue(self, column, value):
self._clearColumnValue(column)
if value is None:
+ self._removeColumnValue(column)
+ column_value, table_content = self._translateValueIntoColumnContent(value, column)
+ for child in column.getchildren():
+ column.remove(child)
+ if table_content is not None:
+ column.append(table_content)
+ value_attribute = self._getColumnValueAttribute(column)
+ if value_attribute is not None and column_value is not None:
+ column.set(value_attribute, column_value)
+
+ def _translateValueIntoColumnContent(self, value, column):
+ """translate a value as a table content"""
+ table_content = None
+ column_children = column.getchildren()
+ if len(column_children) > 0:
+ table_content = deepcopy(column_children[0])
+ # create a tempolaly etree object to generate a content paragraph
+ fragment = self._valueAsOdfXmlElement(value=value, element_tree=column)
+ column_value = None
+ if table_content is not None:
+ table_content.text = fragment.text
+ for element in fragment.getchildren():
+ table_content.append(element)
+ column_value = " ".join([x for x in table_content.itertext()])
+ return (column_value, table_content)
+
+ def _valueAsOdfXmlElement(self, value=None, element_tree=None):
+ """values as ODF XML element
+
+ replacing:
+ \t -> tabs
+ \n -> line-breaks
+ DateTime -> Y-m-d
+ """
+ if value is None:
value = ''
- self._removeColumnValue(column)
+ translated_value = str(value)
if isinstance(value, DateTime):
- value = value.strftime('%Y-%m-%d')
- column_value = unicode(str(value),'utf-8')
- column_children = column.getchildren()
- first_child = None
- if len(column_children) > 0:
- first_child = deepcopy(column_children[0])
- first_child.text = column_value
- for child in column_children:
- column.remove(child)
- if first_child is not None:
- column.append(first_child)
- if column_value != '':
- value_attribute = self._getColumnValueAttribute(column)
- if value_attribute is not None:
- column.set(value_attribute, column_value)
-
+ translated_value = value.strftime('%Y-%m-%d')
+ translated_value = escape(translated_value)
+ text_namespace = element_tree.nsmap['text']
+ tab_element_str = '<text:tab xmlns:text="%s"/>' % text_namespace
+ line_break_element_str ='<text:line-break xmlns:text="%s"/>' % text_namespace
+ translated_value = translated_value.replace('\t', tab_element_str)
+ translated_value = translated_value.replace('\r', '')
+ translated_value = translated_value.replace('\n', line_break_element_str)
+ translated_value = unicode(str(translated_value),'utf-8')
+ # create a paragraph
+ template = '<text:p xmlns:text="%s">%s</text:p>'
+ fragment_element_tree = etree.XML(template % (text_namespace, translated_value))
+ return fragment_element_tree
+
def _removeColumnValue(self, column):
# to eliminate a default value, remove "office:*" attributes.
# if remaining these attribetes, the column shows its default value,
Modified: erp5/trunk/products/ERP5OOo/tests/testFormPrintout.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/tests/testFormPrintout.py?rev=26637&r1=26636&r2=26637&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/tests/testFormPrintout.py [utf8] (original)
+++ erp5/trunk/products/ERP5OOo/tests/testFormPrintout.py [utf8] Mon Apr 27 04:12:26 2009
@@ -214,7 +214,29 @@
content_xml = builder.extract("content.xml")
self.assertTrue(content_xml.find("Français test2") > 0)
self._validate(odf_document)
-
+
+ def test_01_Paragraph_07_LinesField(self, run=run_all_test):
+ """test LinesField into multi line"""
+ if not run: return
+
+ foo_printout = self.portal.foo_module.test1.Foo_viewAsPrintout
+ foo_form = self.portal.foo_module.test1.Foo_view
+ if foo_form._getOb("week", None) is None:
+ foo_form.manage_addField('week', 'week', 'LinesField')
+ week = foo_form.week
+ week.values['default'] = ['line1', 'line2']
+
+ odf_document = foo_printout()
+ self.assertTrue(odf_document is not None)
+ #test_output = open("/tmp/test_01_07_Paragraph.odf", "w")
+ #test_output.write(odf_document)
+ builder = OOoBuilder(odf_document)
+ content_xml = builder.extract("content.xml")
+ self.assertTrue(content_xml.find("line1") > 0)
+ self.assertTrue(content_xml.find("line2") > 0)
+ self.assertTrue(content_xml.find("line2") > content_xml.find("line1"))
+ self._validate(odf_document)
+
def test_02_Table_01_Normal(self, run=run_all_test):
"""To test listbox and ODF table mapping
Modified: erp5/trunk/products/ERP5OOo/tests/test_document/Foo_001.odt
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/tests/test_document/Foo_001.odt?rev=26637&r1=26636&r2=26637&view=diff
==============================================================================
Binary files - no diff available.
More information about the Erp5-report
mailing list