Ignore:
Timestamp:
Aug 3, 2010 5:56:55 PM (14 years ago)
Author:
mylan
Message:

Refactoring serializing for dictionary type field

File:
1 edited

Legend:

Unmodified
Added
Removed
  • quintagroup.transmogrifier/branches/dictionary/quintagroup/transmogrifier/namespaces/atns.py

    r2716 r2719  
    1616 
    1717from quintagroup.transmogrifier.namespaces.util import has_ctrlchars 
    18  
    19  
    2018 
    2119####################################### 
     
    4543 
    4644    def serialize(self, dom, parent_node, instance, options={}): 
    47          
     45 
     46        def getPreparedValue(value): 
     47            if isinstance(value, unicode): 
     48                value = value.encode('utf-8') 
     49            elif IBaseUnit.isImplementedBy(value): 
     50                value = value.getRaw(encoding='utf-8') 
     51            else: 
     52                value = str(value) 
     53            return value 
     54 
     55 
     56        def addNode(node, value, nspref): 
     57            # Create text node and add *value* to the *node*. 
     58            # Use *nspref* if needed. 
     59            if is_ref: 
     60                if config.HANDLE_REFS: 
     61                    ref_node = dom.createElementNS(nspref, 'reference') 
     62                    uid_node = dom.createElementNS(nspref, 'uid') 
     63                    value = response.createTextNode(value) 
     64                    uid_node.append(value) 
     65                    ref_node.append(uid_node) 
     66                    node.append(ref_node) 
     67 
     68            elif isinstance(value, str) and has_ctrlchars(value): 
     69                value = value.encode('base64') 
     70                attr = dom.createAttributeNS(nspref, 'transfer_encoding') 
     71                attr.value = 'base64' 
     72                node.setAttributeNode(attr) 
     73                value_node = dom.createCDATASection(value) 
     74                node.appendChild(value_node) 
     75            else: 
     76                value_node = dom.createTextNode(value) 
     77                node.appendChild(value_node) 
     78 
    4879        values = self.get(instance) 
    4980        if not values: 
     
    6293             
    6394            # try to get 'utf-8' encoded string 
    64             if isinstance(value, unicode): 
    65                 value = value.encode('utf-8') 
    66             elif IBaseUnit.isImplementedBy(value): 
    67                 value = value.getRaw(encoding='utf-8') 
     95            items = getattr(value, 'items', _marker) 
     96            if items is not _marker and callable(items): 
     97                # set type attribute for the field 
     98                type_attr = dom.createAttribute("type") 
     99                type_attr.value = "dict" 
     100                node.setAttributeNode(type_attr) 
     101                for k, v in items(): 
     102                    # create item node with key attribute 
     103                    good_key = getPreparedValue(k) 
     104                    item_node = dom.createElementNS(self.namespace.xmlns, "item") 
     105                    key_attr = dom.createAttribute("key") 
     106                    key_attr.value = good_key 
     107                    item_node.setAttributeNode(key_attr) 
     108                    # prepare value for the item 
     109                    good_value = getPreparedValue(v) 
     110                    addNode(item_node, good_value, self.namespace.xmlns) 
     111                    item_node.normalize() 
     112                    node.appendChild(item_node) 
    68113            else: 
    69                 value = str(value) 
    70  
    71             if is_ref: 
    72                 if config.HANDLE_REFS: 
    73                     ref_node = dom.createElementNS(self.namespace.xmlns, 
    74                                                     'reference') 
    75                     uid_node = dom.createElementNS(self.namespace.xmlns, 
    76                                                     'uid') 
    77                     value = response.createTextNode(value) 
    78                     uid_node.append(value) 
    79                     ref_node.append(uid_node) 
    80                     node.append(ref_node) 
    81             elif isinstance(value, str) and has_ctrlchars(value): 
    82                 value = value.encode('base64') 
    83                 attr = dom.createAttributeNS(self.namespace.xmlns, 
    84                                              'transfer_encoding') 
    85                 attr.value = 'base64' 
    86                 node.setAttributeNode(attr) 
    87                 value_node = dom.createCDATASection(value) 
    88                 node.appendChild(value_node) 
    89             else: 
    90                 items = getattr(value, 'items', _marker) 
    91                 if items is not _marker and callable(items): 
    92                     type_attr = dom.createAttribute("type") 
    93                     type_attr.value = "dict" 
    94                     node.setAttributeNode( type_attr ) 
    95                 value_node = dom.createTextNode(value) 
    96                 node.appendChild(value_node) 
     114                value = getPreparedValue(value) 
     115                addNode(node, value, self.namespace.xmlns) 
    97116         
    98117            node.normalize() 
Note: See TracChangeset for help on using the changeset viewer.