source: products/quintagroup.transmogrifier/branches/plone-2.1/quintagroup.transmogrifier/quintagroup/transmogrifier/namespaces/atns.py @ 1457

Last change on this file since 1457 was 1457, checked in by piv, 14 years ago

merge r2491-2495 from trunk: not exception in atns namespace in case of empty text field, not run content import step in case quintagroup.transmogrifier profile is not selected

File size: 3.7 KB
Line 
1"""
2    Archetypes Marshall namespace but which can safely handle
3    Control Characters for you
4"""
5
6from Products.Archetypes.interfaces.base import IBaseUnit
7
8from Products.Marshall import config
9from Products.Marshall.handlers.atxml import XmlNamespace
10from Products.Marshall.handlers.atxml import SchemaAttribute
11from Products.Marshall.handlers.atxml import getRegisteredNamespaces
12from Products.Marshall.exceptions import MarshallingException
13from Products.Marshall import utils
14
15from Products.Marshall.namespaces import atns as base
16
17from quintagroup.transmogrifier.namespaces.util import has_ctrlchars
18
19
20class ATAttribute(base.ATAttribute):
21
22    def serialize(self, dom, parent_node, instance, options={}):
23       
24        values = self.get(instance)
25        if not values:
26            return
27
28        is_ref = self.isReference(instance)
29       
30        for value in values:
31            node = dom.createElementNS(self.namespace.xmlns, "field")
32            name_attr = dom.createAttribute("name")
33            name_attr.value = self.name
34            node.setAttributeNode(name_attr)
35           
36            # try to get 'utf-8' encoded string
37            if isinstance(value, unicode):
38                value = value.encode('utf-8')
39            elif IBaseUnit.isImplementedBy(value):
40                value = value.getRaw(encoding='utf-8')
41            else:
42                value = str(value)
43
44            if is_ref:
45                if config.HANDLE_REFS:
46                    ref_node = dom.createElementNS(self.namespace.xmlns,
47                                                    'reference')
48                    uid_node = dom.createElementNS(self.namespace.xmlns,
49                                                    'uid')
50                    value = response.createTextNode(value)
51                    uid_node.append(value)
52                    ref_node.append(uid_node)
53                    node.append(ref_node)
54            elif isinstance(value, str) and has_ctrlchars(value):
55                value = value.encode('base64')
56                attr = dom.createAttributeNS(self.namespace.xmlns,
57                                             'transfer_encoding')
58                attr.value = 'base64'
59                node.setAttributeNode(attr)
60                value_node = dom.createCDATASection(value)
61                node.appendChild(value_node)
62            else:
63                value_node = dom.createTextNode(value)
64                node.appendChild(value_node)
65       
66            node.normalize()
67            parent_node.appendChild(node)
68
69        return True
70
71    def processXmlValue(self, context, value):
72        if value is None:
73            return
74
75        value = value.strip()
76        if not value:
77            return
78
79        # decode node value if needed
80        te = context.node.get('transfer_encoding', None)
81        if te is not None:
82            value = value.decode(te)
83
84        data = context.getDataFor(self.namespace.xmlns)
85        if data.has_key(self.name):
86            svalues = data[self.name]
87            if not isinstance(svalues, list):
88                data[self.name] = svalues = [svalues]
89            svalues.append(value)
90            return
91        else:
92            data[self.name] = value
93
94class Archetypes(base.Archetypes):
95
96    def getAttributeByName(self, schema_name, context=None):
97        if context is not None and schema_name not in self.at_fields:
98            if not context.instance.Schema().has_key(schema_name):
99                return
100                raise AssertionError, \
101                      "invalid attribute %s"%(schema_name)
102       
103        if schema_name in self.at_fields:
104            return self.at_fields[schema_name]
105
106        attribute = ATAttribute(schema_name)
107        attribute.setNamespace(self)
108       
109        return attribute
Note: See TracBrowser for help on using the repository browser.