[Erp5-report] r31016 nicolas - /erp5/trunk/products/ERP5OOo/FormPrintout.py

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Dec 3 10:35:13 CET 2009


Author: nicolas
Date: Thu Dec  3 10:35:06 2009
New Revision: 31016

URL: http://svn.erp5.org?rev=31016&view=rev
Log:
Move method from ODFStrategy to ODTStrategy as they seems specialized to render odt content only

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=31016&r1=31015&r2=31016&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/FormPrintout.py [utf8] (original)
+++ erp5/trunk/products/ERP5OOo/FormPrintout.py [utf8] Thu Dec  3 10:35:06 2009
@@ -366,157 +366,10 @@
     extra_context -- extra_context
     ooo_builder -- the OOoBuilder object which have an ODF document.
     iteration_index -- the index which is used when iterating the group of items using ReportSection.
-    """
-    field_list = form.get_fields(include_disabled=1) 
-    REQUEST = get_request()
-    for (count, field) in enumerate(field_list):
-      if isinstance(field, ListBox):
-        element_tree = self._appendTableByListbox(element_tree=element_tree,
-                                                  listbox=field,
-                                                  REQUEST=REQUEST,
-                                                  iteration_index=iteration_index)
-      elif isinstance(field, FormBox):
-        if not hasattr(here, field.get_value('formbox_target_id')):
-          continue
-        sub_form = getattr(here, field.get_value('formbox_target_id'))
-        content = self._replaceXmlByFormbox(element_tree=element_tree,
-                                            field=field,
-                                            form=sub_form,
-                                            extra_context=extra_context,
-                                            ooo_builder=ooo_builder,
-                                            iteration_index=iteration_index)
-      elif isinstance(field, ReportBox):
-         report_method = getattr(field, field.get_value('report_method'), None)
-         element_tree = self._replaceXmlByReportSection(element_tree=element_tree,
-                                                        extra_context=extra_context,
-                                                        report_method=report_method,
-                                                        base_name=field.id,
-                                                        ooo_builder=ooo_builder)
-      elif isinstance(field, ImageField):
-        element_tree = self._replaceXmlByImageField(element_tree=element_tree,
-                                                    image_field=field,
-                                                    ooo_builder=ooo_builder,
-                                                    iteration_index=iteration_index)
-      else:
-        element_tree = self._replaceNodeViaReference(element_tree=element_tree,
-                                                     field=field, iteration_index=iteration_index)
-    return element_tree
-
-  def _replaceNodeViaReference(self, element_tree=None, field=None, iteration_index=0):
-    """replace nodes (e.g. paragraphs) via ODF reference"""
-    element_tree = self._replaceNodeViaRangeReference(element_tree=element_tree, field=field)
-    element_tree = self._replaceNodeViaPointReference(element_tree=element_tree, field=field)
-    return element_tree
-
-  def _renderField(self, field):
-    # XXX It looks ugly to use render_pdf to extract text. Probably
-    # it should be renamed to render_text.
-    return field.render_pdf(field.get_value('default'))
-
-  def _replaceNodeViaPointReference(self, element_tree=None, field=None, iteration_index=0):
-    """Replace text node via an ODF point reference.
-
-    point reference example:
-     <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)
-    # set when using report section
-    self._setUniqueElementName(base_name=field.id,
-                               iteration_index=iteration_index,
-                               xpath=reference_xpath,
-                               element_tree=element_tree)
-    return element_tree
-
-  def _replaceNodeViaRangeReference(self, element_tree=None, field=None, iteration_index=0):
-    """Replace text node via an ODF ranged reference.
-
-    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-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
-    reference_list = element_tree.xpath(range_reference_xpath, namespaces=element_tree.nsmap)
-    if len(reference_list) is 0:
-      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)
-
-    # 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
-
-  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
+
+    Need to be overloaded in OD?Strategy Class
+    """
+    raise NotImplementedError
 
   def _replaceXmlByReportSection(self, element_tree=None, extra_context=None, 
                                  report_method=None, base_name=None, 
@@ -1044,7 +897,169 @@
 
 class ODTStrategy(ODFStrategy):
   """ODTStrategy create a ODT Document from a form and a ODT template"""
-  pass
+  def _replaceXmlByForm(self, element_tree=None, form=None, here=None,
+                           extra_context=None, ooo_builder=None, iteration_index=0):
+    """
+    Replace an element_tree object using an ERP5 form.
+
+    Keyword arguments:
+    element_tree -- the element_tree of a XML file in an ODF document.
+    form -- an ERP5 form
+    here -- called context
+    extra_context -- extra_context
+    ooo_builder -- the OOoBuilder object which have an ODF document.
+    iteration_index -- the index which is used when iterating the group of items using ReportSection.
+    """
+    field_list = form.get_fields(include_disabled=1) 
+    REQUEST = get_request()
+    for (count, field) in enumerate(field_list):
+      if isinstance(field, ListBox):
+        element_tree = self._appendTableByListbox(element_tree=element_tree,
+                                                  listbox=field,
+                                                  REQUEST=REQUEST,
+                                                  iteration_index=iteration_index)
+      elif isinstance(field, FormBox):
+        if not hasattr(here, field.get_value('formbox_target_id')):
+          continue
+        sub_form = getattr(here, field.get_value('formbox_target_id'))
+        content = self._replaceXmlByFormbox(element_tree=element_tree,
+                                            field=field,
+                                            form=sub_form,
+                                            extra_context=extra_context,
+                                            ooo_builder=ooo_builder,
+                                            iteration_index=iteration_index)
+      elif isinstance(field, ReportBox):
+         report_method = getattr(field, field.get_value('report_method'), None)
+         element_tree = self._replaceXmlByReportSection(element_tree=element_tree,
+                                                        extra_context=extra_context,
+                                                        report_method=report_method,
+                                                        base_name=field.id,
+                                                        ooo_builder=ooo_builder)
+      elif isinstance(field, ImageField):
+        element_tree = self._replaceXmlByImageField(element_tree=element_tree,
+                                                    image_field=field,
+                                                    ooo_builder=ooo_builder,
+                                                    iteration_index=iteration_index)
+      else:
+        element_tree = self._replaceNodeViaReference(element_tree=element_tree,
+                                                     field=field, iteration_index=iteration_index)
+    return element_tree
+
+  def _replaceNodeViaReference(self, element_tree=None, field=None, iteration_index=0):
+    """replace nodes (e.g. paragraphs) via ODF reference"""
+    element_tree = self._replaceNodeViaRangeReference(element_tree=element_tree, field=field)
+    element_tree = self._replaceNodeViaPointReference(element_tree=element_tree, field=field)
+    return element_tree
+
+  def _renderField(self, field):
+    # XXX It looks ugly to use render_pdf to extract text. Probably
+    # it should be renamed to render_text.
+    return field.render_pdf(field.get_value('default'))
+
+  def _replaceNodeViaPointReference(self, element_tree=None, field=None, iteration_index=0):
+    """Replace text node via an ODF point reference.
+
+    point reference example:
+     <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)
+    # set when using report section
+    self._setUniqueElementName(base_name=field.id,
+                               iteration_index=iteration_index,
+                               xpath=reference_xpath,
+                               element_tree=element_tree)
+    return element_tree
+
+  def _replaceNodeViaRangeReference(self, element_tree=None, field=None, iteration_index=0):
+    """Replace text node via an ODF ranged reference.
+
+    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-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
+    reference_list = element_tree.xpath(range_reference_xpath, namespaces=element_tree.nsmap)
+    if len(reference_list) is 0:
+      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)
+
+    # 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
+
+  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
 
 class ODGStrategy(ODFStrategy):
   """ODGStrategy create a ODG Document from a form and a ODG template"""




More information about the Erp5-report mailing list