File: FormToXML.py

package info (click to toggle)
zope-formulator 1.7.0-5
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 736 kB
  • ctags: 1,025
  • sloc: python: 4,617; sh: 50; makefile: 44
file content (99 lines) | stat: -rw-r--r-- 3,755 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from StringIO import StringIO
from cgi import escape
import types
try:
    from types import BooleanType
except ImportError:
    BooleanType = None

from DateTime import DateTime

#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')
    # 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':
            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
                # convert boolean to int
                if type(value) == BooleanType:
                    value = value and 1 or 0
                if type(value) == type(1.1):
                    write('          <%s type="float">%s</%s>\n' %
                          (key, escape(str(value)), key))
                if type(value) == type(1):
                    write('          <%s type="int">%s</%s>\n' %
                          (key, escape(str(value)), key))
                elif type(value) == types.ListType:
                    write('          <%s type="list">%s</%s>\n' %
                          (key, escape(str(value)), key))
                elif callable(value):
                    write('          <%s type="method">%s</%s>\n' %
                          (key, escape(str(value.method_name)), key))
                elif type(value) == type(DateTime()):
                    write('          <%s type="datetime">%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>')

    if form.unicode_mode:
        return f.getvalue().encode('UTF-8')
    else:
        return unicode(f.getvalue(), form.stored_encoding).encode('UTF-8')