source: products/quintagroup.transmogrifier.pfm2pfg/trunk/quintagroup/transmogrifier/pfm2pfg/exporting.py @ 330

Last change on this file since 330 was 320, checked in by mylan, 18 years ago

Added Blogging APIs modules.

File size: 3.0 KB
Line 
1from xml.dom import minidom
2
3from zope.interface import Interface, implements
4from zope.component import adapts
5
6from Products.Archetypes import atapi
7from Products.Marshall.config import AT_NS
8
9from quintagroup.transmogrifier.interfaces import IExportDataCorrector
10from quintagroup.transmogrifier.adapters.exporting import ReferenceExporter
11
12class IPloneFormMailer(Interface):
13    """ Marker interface for PloneFormMailer content type
14    """
15
16class 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')
Note: See TracBrowser for help on using the repository browser.