예제 #1
0
    def OnEndElement(self, sTagName):
        """ XmlAttrBuilder.OnEndElement """

        # -- TAG-STACK
        tag = self.dTagStack.pop()
        name = standard.unencode(tag['name'])
        attrs = standard.unencode(tag['attrs'])
        cdata = standard.unencode(tag['cdata'])
        # Hack for nested CDATA
        cdata = re.compile(r'\<\!\{CDATA\{(.*?)\}\}\>').sub(
            r'<![CDATA[\1]]>', cdata)

        if name != sTagName:
            raise ParseError("Unmatching end tag (" + str(sTagName) +
                             ") expected (" + str(name) + ")")

        # -- DATA
        if sTagName in ['data']:
            filename = attrs.get('filename')
            content_type = attrs.get('content_type')
            try:
                data = standard.hex2bin(cdata)
            except:
                data = bytes(cdata, 'utf-8')
            file = {
                'data': data,
                'filename': filename,
                'content_type': content_type
            }
            objtype = attrs.get('type')
            item = _blobfields.createBlobField(None, objtype, file)
            for key in attrs:
                value = attrs.get(key)
                setattr(item, key, value)
            self.dValueStack.pop()
            self.dValueStack.append(item)

        # -- ITEM
        elif sTagName in ['item']:
            if tag['dValueStack'] < len(self.dValueStack):
                item = self.dValueStack.pop()
            else:
                item = cdata
            item = getXmlTypeSaveValue(item, attrs)
            value = self.dValueStack.pop()
            if isinstance(value, dict):
                key = attrs.get('key')
                value[key] = item
            if isinstance(value, list):
                value.append(item)
            self.dValueStack.append(value)
예제 #2
0
def xmlOnUnknownEndTag(self, sTagName):
    # -- TAG-STACK
    tag = self.dTagStack.pop()
    skip = len([x for x in self.oCurrNode.dTagStack if x.get('skip')]) > 0
    name = standard.unencode(tag['name'])
    if name != sTagName: return 0  # don't accept any unknown tag
    attrs = standard.unencode(tag['attrs'])
    cdata = standard.unencode(tag['cdata'])

    # -- ITEM (DICTIONARY|LIST) --
    #----------------------------
    if sTagName in ['dict', 'dictionary']:
        pass
    elif sTagName == 'list':
        pass
    elif sTagName == 'item':
        item = cdata
        if tag['dValueStack'] < len(self.dValueStack):
            item = self.dValueStack.pop()
        else:
            item = cdata
        item = getXmlTypeSaveValue(item, attrs)
        value = self.dValueStack.pop()
        if isinstance(value, dict):
            key = attrs.get('key')
            value[key] = item
        if isinstance(value, list):
            value.append(item)
        self.dValueStack.append(value)

    # -- DATA (IMAGE|FILE) --
    #-----------------------
    elif sTagName == 'data':
        value = attrs
        if cdata is not None and len(cdata) > 0:
            filename = attrs.get('filename')
            content_type = attrs.get('content_type')
            try:
                data = standard.hex2bin(cdata)
            except:
                data = bytes(cdata, 'utf-8')
            value['data'] = data
        self.dValueStack.append(value)

    # -- LANGUAGE --
    #--------------
    elif sTagName == 'lang':
        lang = attrs.get('id', self.getPrimaryLanguage())
        if len(self.dValueStack) == 1:
            item = cdata
        else:
            item = self.dValueStack.pop()
        values = self.dValueStack.pop()
        values[lang] = item
        self.dValueStack.append(values)

    # -- OBJECT-ATTRIBUTES --
    #-----------------------
    elif sTagName in self.getObjAttrs():
        if not skip:
            obj_attr = self.getObjAttr(sTagName)

            # -- DATATYPE
            datatype = obj_attr['datatype_key']

            # -- Multi-Language Attributes.
            if obj_attr['multilang']:
                item = self.dValueStack.pop()
                if item is not None:
                    if not isinstance(item, dict):
                        item = {self.getPrimaryLanguage(): item}
                    for s_lang in item:
                        value = item[s_lang]
                        # Data
                        if datatype in _globals.DT_BLOBS:
                            if isinstance(value,
                                          dict) and len(value.keys()) > 0:
                                ob = _blobfields.createBlobField(
                                    self, datatype)
                                for key in value:
                                    setattr(ob, key, value[key])
                                xmlInitObjProperty(self, sTagName, ob, s_lang)
                        # Others
                        else:
                            # -- Init Properties.
                            xmlInitObjProperty(self, sTagName, value, s_lang)

            else:
                # -- Complex Attributes (Blob|Dictionary|List).
                value = None
                if len(self.dValueStack) > 0:
                    value = self.dValueStack.pop()
                if value is not None and \
                   (datatype in _globals.DT_BLOBS or \
                     datatype == _globals.DT_LIST or \
                     datatype == _globals.DT_DICT):
                    # Data
                    if datatype in _globals.DT_BLOBS:
                        if isinstance(value, dict) and len(value.keys()) > 0:
                            ob = _blobfields.createBlobField(self, datatype)
                            for key in value:
                                setattr(ob, key, value[key])
                            xmlInitObjProperty(self, sTagName, ob)
                    # Others
                    else:
                        if self.getType() == 'ZMSRecordSet':
                            if isinstance(value, list):
                                for item in value:
                                    if isinstance(item, dict):
                                        for key in item:
                                            item_obj_attr = self.getObjAttr(
                                                key)
                                            item_datatype = item_obj_attr[
                                                'datatype_key']
                                            if item_datatype in _globals.DT_BLOBS:
                                                item_data = item[key]
                                                if isinstance(item_data, dict):
                                                    blob = _blobfields.createBlobField(
                                                        self, item_datatype,
                                                        item_data)
                                                    blob.on_setobjattr()
                                                    item[key] = blob
                        # -- Convert multilingual to monolingual attributes.
                        if obj_attr['multilang'] == 0 and \
                           isinstance(value, dict) and \
                           len(value.keys()) == 1 and \
                           value.keys()[0] == self.getPrimaryLanguage():
                            value = value[value.keys()[0]]
                        xmlInitObjProperty(self, sTagName, value)
                    if len(self.dValueStack) > 0:
                        raise "Items on self.dValueStack=%s" % self.dValueStack

                # -- Simple Attributes (String, Integer, etc.)
                else:
                    if value is not None:
                        standard.writeBlock(
                            self, "[xmlOnUnknownEndTag]: WARNING - Skip %s" %
                            sTagName)
                    value = cdata
                    # -- OPTIONS
                    if 'options' in obj_attr:
                        options = obj_attr['options']
                        if isinstance(options, list):
                            try:
                                i = options.index(int(value))
                                if i % 2 == 1: value = options[i - 1]
                            except:
                                try:
                                    i = options.index(value)
                                    if i % 2 == 1: value = options[i - 1]
                                except:
                                    pass
                    xmlInitObjProperty(self, sTagName, value)

            # Clear value stack.
            self.dValueStack.clear()

    # -- OTHERS --
    #------------
    else:
        value = None
        if len(self.dTagStack): value = self.dTagStack.pop()
        if value is None: value = {'cdata': ''}
        cdata = value.get('cdata', '')
        cdata += '<' + tag['name']
        for attr_name in attrs:
            attr_value = attrs.get(attr_name)
            cdata += ' ' + attr_name + '="' + attr_value + '"'
        cdata += '>' + tag['cdata']
        cdata += '</' + tag['name'] + '>'
        value['cdata'] = cdata
        self.dTagStack.append(value)

    return 1  # accept matching end tag