[Erp5-report] r34144 jerome - /erp5/trunk/products/Formulator/Widget.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Mar 26 13:32:30 CET 2010
Author: jerome
Date: Fri Mar 26 13:32:28 2010
New Revision: 34144
URL: http://svn.erp5.org?rev=34144&view=rev
Log:
- implement render_odt on ItemsWidget and MultiItemsWidget
- use a class with attribute instead of global
(reviewed by Nicolas)
Modified:
erp5/trunk/products/Formulator/Widget.py
Modified: erp5/trunk/products/Formulator/Widget.py
URL: http://svn.erp5.org/erp5/trunk/products/Formulator/Widget.py?rev=34144&r1=34143&r2=34144&view=diff
==============================================================================
--- erp5/trunk/products/Formulator/Widget.py [utf8] (original)
+++ erp5/trunk/products/Formulator/Widget.py [utf8] Fri Mar 26 13:32:28 2010
@@ -27,21 +27,24 @@
EForm = ElementMaker(namespace=FORM_URI, nsmap=NSMAP)
RE_OOO_ESCAPE = re.compile(r'([\n\t])?([^\n\t]*)')
-def ooo_escape(match_object):
+class OOoEscaper:
"""Replacement function to use inside re.sub expression.
This function replace \t by <text:tab/>
\n by <text:line-break/>
- - parent_node is a global variable used to carry new nodes.
+ The parent node is passed to the constructor.
"""
- match_value = match_object.group(1)
- if match_value is None:
- parent_node.text = match_object.group(2)
- elif match_value == '\n':
- line_break = SubElement(parent_node, '{%s}%s' % (TEXT_URI, 'line-break'))
- line_break.tail = match_object.group(2)
- elif match_value == '\t':
- line_break = SubElement(parent_node, '{%s}%s' % (TEXT_URI, 'tab'))
- line_break.tail = match_object.group(2)
+ def __init__(self, parent_node):
+ self.parent_node = parent_node
+ def __call__(self, match_object):
+ match_value = match_object.group(1)
+ if match_value is None:
+ self.parent_node.text = match_object.group(2)
+ elif match_value == '\n':
+ line_break = SubElement(self.parent_node, '{%s}%s' % (TEXT_URI, 'line-break'))
+ line_break.tail = match_object.group(2)
+ elif match_value == '\t':
+ line_break = SubElement(self.parent_node, '{%s}%s' % (TEXT_URI, 'tab'))
+ line_break.tail = match_object.group(2)
class Widget:
"""A field widget that knows how to display itself as HTML.
@@ -260,9 +263,7 @@
draw_node.append(text_p_node)
draw_frame_node.append(draw_node)
- global parent_node
- parent_node = text_span_node
- RE_OOO_ESCAPE.sub(ooo_escape, value)
+ RE_OOO_ESCAPE.sub(OOoEscaper(text_span_node), value)
if as_string:
return etree.tostring(draw_frame_node)
return draw_frame_node
@@ -552,9 +553,7 @@
value = value.decode('utf-8')
text_node = Element('{%s}%s' % (TEXT_URI, local_name), nsmap=NSMAP)
- global parent_node
- parent_node = text_node
- RE_OOO_ESCAPE.sub(ooo_escape, value)
+ RE_OOO_ESCAPE.sub(OOoEscaper(text_node), value)
text_node.attrib.update(attr_dict)
if as_string:
return etree.tostring(text_node)
@@ -786,6 +785,41 @@
render_pdf = render_view
+ def render_odt_view(self, field, value, as_string, ooo_builder, REQUEST,
+ render_prefix, attr_dict, local_name):
+
+ items = field.get_value('items',
+ REQUEST=REQUEST,
+ cell=getattr(REQUEST, 'cell', None))
+ # XXX this code can be factorized
+ d = {}
+ for item in items:
+ try:
+ item_text, item_value = item
+ except ValueError:
+ item_text = item
+ item_value = item
+ d[item_value] = item_text
+
+ if value is None:
+ value = ''
+
+ value = d.get(value, '??? (%s)' % value)
+
+ if attr_dict is None:
+ attr_dict = {}
+ if isinstance(value, str):
+ #required by lxml
+ value = value.decode('utf-8')
+ text_node = Element('{%s}%s' % (TEXT_URI, local_name), nsmap=NSMAP)
+
+ RE_OOO_ESCAPE.sub(OOoEscaper(text_node), value)
+ text_node.attrib.update(attr_dict)
+ if as_string:
+ return etree.tostring(text_node)
+ return text_node
+
+
class MultiItemsWidget(ItemsWidget):
"""A widget with a number of items that has multiple selectable
items.
@@ -931,6 +965,46 @@
return Widget.render_odg(self, field, value, as_string, ooo_builder,
REQUEST, render_prefix, attr_dict, local_name)
+ def render_odt_view(self, field, value, as_string, ooo_builder, REQUEST,
+ render_prefix, attr_dict, local_name):
+
+ items = field.get_value('items',
+ REQUEST=REQUEST,
+ cell=getattr(REQUEST, 'cell', None))
+ d = {}
+ for item in items:
+ try:
+ item_text, item_value = item
+ except ValueError:
+ item_text = item
+ item_value = item
+ d[item_value] = item_text
+
+ if value is None:
+ value = ['']
+ elif isinstance(value, basestring):
+ value = [value]
+
+ result = []
+ for e in value:
+ result.append(d.get(e, '??? (%s)' % e))
+
+ value = '\n'.join(result)
+
+ if attr_dict is None:
+ attr_dict = {}
+ if isinstance(value, str):
+ #required by lxml
+ value = value.decode('utf-8')
+ text_node = Element('{%s}%s' % (TEXT_URI, local_name), nsmap=NSMAP)
+
+ RE_OOO_ESCAPE.sub(OOoEscaper(text_node), value)
+ text_node.attrib.update(attr_dict)
+ if as_string:
+ return etree.tostring(text_node)
+ return text_node
+
+
class ListWidget(SingleItemsWidget):
"""List widget.
"""
@@ -967,26 +1041,6 @@
def render_selected_item(self, text, value, key, css_class, extra_item):
return render_element('option', contents=text, value=value,
selected=None, extra=extra_item)
-
- def render_odt_view(self, field, value, as_string, ooo_builder, REQUEST,
- render_prefix, attr_dict, local_name):
- if attr_dict is None:
- attr_dict = {}
- if value is None:
- value = []
- if isinstance(value, (list, tuple)):
- value = '\n'.join(value)
- if isinstance(value, str):
- #required by lxml
- value = value.decode('utf-8')
- text_node = Element('{%s}%s' % (TEXT_URI, local_name), nsmap=NSMAP)
- global parent_node
- parent_node = text_node
- RE_OOO_ESCAPE.sub(ooo_escape, value)
- text_node.attrib.update(attr_dict)
- if as_string:
- return etree.tostring(text_node)
- return text_node
ListWidgetInstance = ListWidget()
More information about the Erp5-report
mailing list