1 | from xml.dom import minidom |
---|
2 | |
---|
3 | from zope.interface import Interface, implements |
---|
4 | from zope.component import adapts |
---|
5 | |
---|
6 | from Products.Archetypes import atapi |
---|
7 | from Products.Marshall.config import AT_NS |
---|
8 | |
---|
9 | from quintagroup.transmogrifier.interfaces import IExportDataCorrector |
---|
10 | from quintagroup.transmogrifier.adapters.exporting import ReferenceExporter |
---|
11 | |
---|
12 | class IPloneFormMailer(Interface): |
---|
13 | """ Marker interface for PloneFormMailer content type |
---|
14 | """ |
---|
15 | |
---|
16 | class PloneFormMailerExporter(ReferenceExporter): |
---|
17 | """ Marshalls PloneFormMailer to XML. |
---|
18 | """ |
---|
19 | implements(IExportDataCorrector) |
---|
20 | adapts(IPloneFormMailer) |
---|
21 | |
---|
22 | def __init__(self, context): |
---|
23 | self.context = context |
---|
24 | self.tales_fnames = ['recipient_name', 'bcc_recipients', 'cc_recipients'] |
---|
25 | self.mail_subject_field = 'subject' |
---|
26 | |
---|
27 | def __call__(self, data): |
---|
28 | xml = data['data'] |
---|
29 | xml = self.exportReferences(xml) |
---|
30 | data['data'] = self.exportFormFields(xml) |
---|
31 | return data |
---|
32 | |
---|
33 | def exportFormFields(self, data): |
---|
34 | """ Reformat xml file and add Formulator fields. |
---|
35 | """ |
---|
36 | # reformat xml tree |
---|
37 | doc = minidom.parseString(data) |
---|
38 | root = doc.documentElement |
---|
39 | |
---|
40 | # some TALES fields must be exported as value of executed expression |
---|
41 | schema = self.context.Schema() |
---|
42 | for fname in self.tales_fnames: |
---|
43 | nodes = [i for i in root.getElementsByTagName('field') if i.getAttribute('name') == fname] |
---|
44 | for node in nodes: |
---|
45 | root.removeChild(node) |
---|
46 | values = schema[fname].getAccessor(self.context)() |
---|
47 | if not isinstance(values, (list, tuple)): |
---|
48 | values = [values] |
---|
49 | values = filter(None, values) |
---|
50 | for value in values: |
---|
51 | node = doc.createElementNS(AT_NS, "field") |
---|
52 | name_attr = doc.createAttribute("name") |
---|
53 | name_attr.value = fname |
---|
54 | node.setAttributeNode(name_attr) |
---|
55 | value_node = doc.createTextNode(str(value)) |
---|
56 | node.appendChild(value_node) |
---|
57 | node.normalize() |
---|
58 | root.appendChild(node) |
---|
59 | |
---|
60 | # PloneFormMailer overrides standard 'subject' schema field with it's own, |
---|
61 | # which is a subject of a message. That's why it isn't exported as '<dc:subject />' |
---|
62 | # element (it is concerned with current implementation of Marshall's CMF namespaces |
---|
63 | value = atapi.BaseObject.__getitem__(self.context, self.mail_subject_field) |
---|
64 | if value: |
---|
65 | node = doc.createElementNS(AT_NS, "field") |
---|
66 | name_attr = doc.createAttribute("name") |
---|
67 | name_attr.value = mail_subject_field |
---|
68 | node.setAttributeNode(name_attr) |
---|
69 | value_node = doc.createTextNode(str(value)) |
---|
70 | node.appendChild(value_node) |
---|
71 | node.normalize() |
---|
72 | root.appendChild(node) |
---|
73 | |
---|
74 | # append form fields |
---|
75 | fm_doc = minidom.parseString(self.context.form.get_xml()) |
---|
76 | root.appendChild(fm_doc.documentElement) |
---|
77 | |
---|
78 | return doc.toxml('utf-8') |
---|