[Erp5-report] r27696 - in /erp5/trunk/products/Formulator: ./ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Jun 19 21:12:45 CEST 2009


Author: nicolas
Date: Fri Jun 19 21:12:45 2009
New Revision: 27696

URL: http://svn.erp5.org?rev=27696&view=rev
Log:
 * Fix escaping chars in FormGroup title
 * Use lxml to produce XML view
 * Update XMLToForm to follow escaping changes

Modified:
    erp5/trunk/products/Formulator/FormToXML.py
    erp5/trunk/products/Formulator/XMLObjects.py
    erp5/trunk/products/Formulator/tests/testSerializeForm.py

Modified: erp5/trunk/products/Formulator/FormToXML.py
URL: http://svn.erp5.org/erp5/trunk/products/Formulator/FormToXML.py?rev=27696&r1=27695&r2=27696&view=diff
==============================================================================
--- erp5/trunk/products/Formulator/FormToXML.py [utf8] (original)
+++ erp5/trunk/products/Formulator/FormToXML.py [utf8] Fri Jun 19 21:12:45 2009
@@ -1,85 +1,78 @@
-from StringIO import StringIO
+# -*- coding: utf-8 -*-
 from cgi import escape
-import types
+from lxml import etree
+from lxml.etree import Element, SubElement, CDATA
+from lxml.builder import E
 
-#def write(s):
-#    if type(s) == type(u''):
-#        print "Unicode:", repr(s)
-    
 def formToXML(form, prologue=1):
     """Takes a formulator form and serializes it to an XML representation.
     """
-    f = StringIO()
-    write = f.write
-
-    if prologue:
-        write('<?xml version="1.0"?>\n\n')
-    write('<form>\n')
+    form_as_xml = Element('form')
     # export form settings
     for field in form.settings_form.get_fields(include_disabled=1):
-        id = field.id
-        value = getattr(form, id)
-        if id == 'title':
-            value = escape(value)
-        if id == 'unicode_mode':
+      id = field.id
+      value = getattr(form, id)
+      if id == 'unicode_mode':
+        if value:
+          value = 'true'
+        else:
+          value = 'false'
+      sub_element = SubElement(form_as_xml, id)
+      sub_element.text = escape(str(value))
+    groups = SubElement(form_as_xml, 'groups')
+    # export form groups
+    for group in form.get_groups(include_empty=1):
+      group_element = SubElement(groups, 'group')
+      group_element.append(E.title(group))
+
+      fields = SubElement(group_element, 'fields')
+      for field in form.get_fields_in_group(group, include_disabled=1):
+        field_element = E.field(
+                                  E.id(str(field.id)),
+                                  E.type(str(field.meta_type))
+                               )
+
+        fields.append(field_element)
+        values_element = SubElement(field_element, 'values')
+        items = field.values.items()
+        items.sort()
+        for key, value in items:
+          if value is None:
+            continue
+          if value is True: # XXX Patch
+            value = 1 # XXX Patch
+          if value is False: # XXX Patch
+            value = 0 # XXX Patch
+          if callable(value): # XXX Patch
+            value_element = SubElement(values_element, key, type='method')
+          elif isinstance(value, float):
+            value_element = SubElement(values_element, key, type='float')
+          elif isinstance(value, int):
+            value_element = SubElement(values_element, key, type='int')
+          elif isinstance(value, list):
+            value_element = SubElement(values_element, key, type='list')
+          else:
+            if not isinstance(value, (str, unicode)):
+              value = str(value)
+            value_element = SubElement(values_element, key)
+          value_element.text = escape(str(value))
+
+          tales_element = SubElement(field_element, 'tales')
+          items = field.tales.items()
+          items.sort()
+          for key, value in items:
             if value:
-                value = 'true'
-            else:
-                value = 'false'
-        write('  <%s>%s</%s>\n' % (id, value, id))
-    # export form groups
-    write('  <groups>\n')
-    for group in form.get_groups(include_empty=1):
-        write('    <group>\n')
-        write('      <title>%s</title>\n' % escape(group))
-        write('      <fields>\n\n')
-        for field in form.get_fields_in_group(group, include_disabled=1):
-            write('      <field><id>%s</id> <type>%s</type>\n' % (field.id, field.meta_type))
-            write('        <values>\n')
-            items = field.values.items()
-            items.sort()
-            for key, value in items:
-                if value is None:
-                    continue
-                if value==True: # XXX Patch
-                    value = 1 # XXX Patch
-                if value==False: # XXX Patch
-                    value = 0 # XXX Patch
-                if callable(value): # XXX Patch
-                    write('          <%s type="method">%s</%s>\n' % # XXX Patch
-                        (key, escape(str(value.method_name)), key)) # XXX Patch
-                elif type(value) == type(1.1):
-                    write('          <%s type="float">%s</%s>\n' % (key, escape(str(value)), key))
-                elif type(value) == type(1):
-                    write('          <%s type="int">%s</%s>\n' % (key, escape(str(value)), key))
-                elif type(value) == type([]):
-                    write('          <%s type="list">%s</%s>\n' % (key, escape(str(value)), key))
-                else:
-                    if type(value) not in (types.StringType, types.UnicodeType):
-                        value = str(value)
-                    write('          <%s>%s</%s>\n' % (key, escape(value), key))
-            write('        </values>\n')
-
-            write('        <tales>\n')
-            items = field.tales.items()
-            items.sort()
-            for key, value in items:
-                if value:
-                    write('          <%s>%s</%s>\n' % (key, escape(str(value._text)), key))
-            write('        </tales>\n')
-
-            write('        <messages>\n')
-            for message_key in field.get_error_names():
-                write('          <message name="%s">%s</message>\n' %
-                      (escape(message_key), escape(field.get_error_message(message_key))))
-            write('        </messages>\n')
-            write('      </field>\n')
-        write('      </fields>\n')
-        write('    </group>\n')
-    write('  </groups>\n')
-    write('</form>')
-
+              tale_element = SubElement(tales_element, key)
+              tale_element.text = escape(str(value._text))
+          messages = SubElement(field_element, 'messages')
+          for message_key in field.get_error_names():
+            message_element = SubElement(messages, 'message', name=message_key)
+            message_element.text = escape(field.get_error_message(message_key))
+    form_as_string = etree.tostring(form_as_xml, encoding='utf-8',
+                                    xml_declaration=True, pretty_print=True)
     if form.unicode_mode:
-        return f.getvalue().encode('UTF-8')
+      return etree.tostring(form_as_xml, encoding='utf-8',
+                                    xml_declaration=True, pretty_print=True)
     else:
-        return unicode(f.getvalue(), form.stored_encoding).encode('UTF-8')
+      return etree.tostring(form_as_xml, encoding=form.stored_encoding,
+                                    xml_declaration=True, pretty_print=True)

Modified: erp5/trunk/products/Formulator/XMLObjects.py
URL: http://svn.erp5.org/erp5/trunk/products/Formulator/XMLObjects.py?rev=27696&r1=27695&r2=27696&view=diff
==============================================================================
--- erp5/trunk/products/Formulator/XMLObjects.py [utf8] (original)
+++ erp5/trunk/products/Formulator/XMLObjects.py [utf8] Fri Jun 19 21:12:45 2009
@@ -1,5 +1,6 @@
+# -*- coding: utf-8 -*-
 from xml.dom.minidom import parse, parseString, Node
-
+from xml.sax.saxutils import unescape
 # an extremely simple system for loading in XML into objects
 
 class Object:
@@ -40,7 +41,7 @@
 
 def textToObject(parent, node):
     # add this text to parents text content
-    parent.text += node.data
+    parent.text += unescape(node.data)
     
 def processingInstructionToObject(parent, node):
     # don't do anything with these

Modified: erp5/trunk/products/Formulator/tests/testSerializeForm.py
URL: http://svn.erp5.org/erp5/trunk/products/Formulator/tests/testSerializeForm.py?rev=27696&r1=27695&r2=27696&view=diff
==============================================================================
--- erp5/trunk/products/Formulator/tests/testSerializeForm.py [utf8] (original)
+++ erp5/trunk/products/Formulator/tests/testSerializeForm.py [utf8] Fri Jun 19 21:12:45 2009
@@ -165,7 +165,7 @@
         form.manage_addField('multi_field', '<Checkbox> Field', 'MultiCheckBoxField')
 
         form2 = ZMIForm('test2', 'ValueTest')
-        
+
         xml = formToXML(form)
         XMLToForm(xml, form2)
 




More information about the Erp5-report mailing list