def deserialize(self, instance, ns_data, options={}):
        if not ns_data:
            return
        data = ns_data.get( self.name )
        if data is None:
            return
        values = data.get('value', None)
        if not values:
            return

	# check if we are a schema attribute
        if self.isReference( instance ):
            values = self.resolveReferences( instance, values)
            if not config.HANDLE_REFS :
                return

        field = instance.Schema()[self.name]
        mutator = field.getMutator(instance)
        if not mutator:
            # read only field no mutator, but try to set value still
            # since it might reflect object state (like ATCriteria)
            field = instance.getField( self.name ).set( instance, values )
            #raise AttributeError("No Mutator for %s"%self.name)
            return
        
        if self.name == "id":
            transaction.savepoint()
            
        mutator(values)

        # set mimetype if possible
        mimetype = data.get('mimetype', None)
        if (mimetype is not None and IObjectField.providedBy(field)):
            field.setContentType(instance, mimetype)
    def serialize(self, dom, parent_node, instance, options={}):

        values = self.get(instance)
        if not values:
            return

        is_ref = self.isReference(instance)

        for value in values:
            if instance.Type() == 'Folder':
                # allowed types are acquired from parent
                if instance.getConstrainTypesMode() != 1 and self.name in ['locallyAllowedTypes', 'immediatelyAddableTypes']:
                    continue
            node = dom.createElementNS(self.namespace.xmlns, "field")
            name_attr = dom.createAttribute("name")
            name_attr.value = self.name
            node.setAttributeNode(name_attr)

            # try to get 'utf-8' encoded string
            if isinstance(value, unicode):
                value = value.encode('utf-8')
            elif IBaseUnit.providedBy(value):
                value = value.getRaw(encoding='utf-8')
            else:
                value = str(value)

            if is_ref:
                if config.HANDLE_REFS:
                    ref_node = dom.createElementNS(self.namespace.xmlns,
                                                    'reference')
                    uid_node = dom.createElementNS(self.namespace.xmlns,
                                                    'uid')
                    value = dom.createTextNode(value)
                    uid_node.append(value)
                    ref_node.append(uid_node)
                    node.append(ref_node)
            elif isinstance(value, str) and has_ctrlchars(value):
                value = value.encode('base64')
                attr = dom.createAttributeNS(self.namespace.xmlns,
                                             'transfer_encoding')
                attr.value = 'base64'
                node.setAttributeNode(attr)
                value_node = dom.createCDATASection(value)
                node.appendChild(value_node)
            else:
                value_node = dom.createTextNode(value)
                node.appendChild(value_node)

            schema = ISchema(instance)
            field = schema._fields[self.name]
            if IObjectField.providedBy(field):
                mime_attr = dom.createAttribute('mimetype')
                mime_attr.value = field.getContentType(instance)
                node.setAttributeNode(mime_attr)

            node.normalize()
            parent_node.appendChild(node)

        return True
Esempio n. 3
0
    def serialize(self, dom, parent_node, instance, options={}):

        values = self.get(instance)
        if not values:
            return

        is_ref = self.isReference(instance)

        for value in values:
            if instance.Type() == 'Folder':
                # allowed types are acquired from parent
                if instance.getConstrainTypesMode() != 1 and self.name in ['locallyAllowedTypes','immediatelyAddableTypes']:
                    continue
            node = dom.createElementNS(self.namespace.xmlns, "field")
            name_attr = dom.createAttribute("name")
            name_attr.value = self.name
            node.setAttributeNode(name_attr)

            # try to get 'utf-8' encoded string
            if isinstance(value, unicode):
                value = value.encode('utf-8')
            elif IBaseUnit.providedBy(value):
                value = value.getRaw(encoding='utf-8')
            else:
                value = str(value)

            if is_ref:
                if config.HANDLE_REFS:
                    ref_node = dom.createElementNS(self.namespace.xmlns,
                                                    'reference')
                    uid_node = dom.createElementNS(self.namespace.xmlns,
                                                    'uid')
                    value = dom.createTextNode(value)
                    uid_node.append(value)
                    ref_node.append(uid_node)
                    node.append(ref_node)
            elif isinstance(value, str) and has_ctrlchars(value):
                value = value.encode('base64')
                attr = dom.createAttributeNS(self.namespace.xmlns,
                                             'transfer_encoding')
                attr.value = 'base64'
                node.setAttributeNode(attr)
                value_node = dom.createCDATASection(value)
                node.appendChild(value_node)
            else:
                value_node = dom.createTextNode(value)
                node.appendChild(value_node)

            schema = ISchema(instance)
            field = schema._fields[self.name]
            if IObjectField.providedBy(field):
                mime_attr = dom.createAttribute('mimetype')
                mime_attr.value = field.getContentType(instance)
                node.setAttributeNode(mime_attr)

            node.normalize()
            parent_node.appendChild(node)

        return True
Esempio n. 4
0
    def serialize(self, dom, parent_node, instance, options={}):

        encode_ctrlchars = options.get('encode_ctrlchars', True)

        values = self.get(instance)
        if not values:
            return

        for value in values:
            node = dom.createElementNS(self.namespace.xmlns, "field")
            name_attr = dom.createAttribute("name")
            name_attr.value = self.name
            node.setAttributeNode(name_attr)

            # try to get 'utf-8' encoded string
            if isinstance(value, unicode):
                value = value.encode('utf-8')
            elif IBaseUnit.providedBy(value):
                value = value.getRaw(encoding='utf-8')
            else:
                value = str(value)

            if self.isReference(instance):
                if config.HANDLE_REFS:
                    ref_node = dom.createElementNS(self.namespace.xmlns,
                                                    'reference')
                    uid_node = dom.createElementNS(self.namespace.xmlns,
                                                    'uid')
                    value = dom.createTextNode(value)
                    uid_node.append(value)
                    ref_node.append(uid_node)
                    node.append(ref_node)
            elif (encode_ctrlchars and
                  isinstance(value, str) and
                  has_ctrlchars(value)):
                value = value.encode('base64')
                attr = dom.createAttributeNS(self.namespace.xmlns,
                                             'transfer_encoding')
                attr.value = 'base64'
                node.setAttributeNode(attr)
                value_node = dom.createCDATASection(value)
                node.appendChild(value_node)
            else:
                value_node = dom.createTextNode(value)
                node.appendChild(value_node)

            # set the mimetype if it is available
            field = instance.schema._fields[self.name]
            if IObjectField.providedBy(field):
                mime_attr = dom.createAttribute('mimetype')
                mime_attr.value = field.getContentType(instance)
                node.setAttributeNode(mime_attr)

            node.normalize()
            parent_node.appendChild(node)

        return True
Esempio n. 5
0
    def deserialize(self, instance, ns_data, options={}):
        if not ns_data:
            return
        data = ns_data.get(self.name)
        if data is None:
            return
        values = data.get("value", None)
        if not values:
            return

        # check if we are a schema attribute
        if self.isReference(instance):
            values = self.resolveReferences(instance, values)
            if not config.HANDLE_REFS:
                return

        field = instance.Schema()[self.name]
        mutator = field.getMutator(instance)
        if not mutator:
            # read only field no mutator, but try to set value still
            # since it might reflect object state (like ATCriteria)
            field = instance.getField(self.name).set(instance, values)
            # raise AttributeError("No Mutator for %s"%self.name)
            return
        if self.name == "id":
            transaction.savepoint()

        if instance.getField(self.name).type == "datetime":
            # make sure DateTime fields are constructed properly
            # by explicitly constructing a DateTime instance
            mutator(DateTime(values))
        else:
            mutator(values)

        # set mimetype if possible
        mimetype = data.get("mimetype", None)
        if mimetype is not None and IObjectField.providedBy(field):
            field.setContentType(instance, mimetype)