예제 #1
0
    def metadataField(self, field, v=True, ed=True):
        """
        Crea un objeto FLFieldMetaData a partir de un elemento XML.

        Dado un elemento XML, que contiene la descripción de un
        campo de una tabla construye y agrega a una lista de descripciones
        de campos el objeto FLFieldMetaData correspondiente, que contiene
        dicha definición del campo. Tambien lo agrega a una lista de claves
        compuesta, si el campo construido pertenece a una clave compuesta.
        NO SE HACEN CHEQUEOS DE ERRORES SINTÁCTICOS EN EL XML.

        @param field Elemento XML con la descripción del campo
        @param v Valor utilizado por defecto para la propiedad visible
        @param ed Valor utilizado por defecto para la propiedad editable
        @return Objeto FLFieldMetaData que contiene la descripción del campo
        """
        if not field:
            return None

        util = FLUtil()

        ck = False
        n = None
        a = None
        ol = False
        rX = None
        assocBy = None
        assocWith = None
        so = None

        aN = True
        iPK = True
        c = False
        iNX = False
        uNI = False
        coun = False
        oT = False
        vG = True
        fullCalc = False
        trimm = False

        t = -1
        length = 0
        pI = 4
        pD = 0

        dV = None

        no = field.firstChild()

        while not no.isNull():
            e = no.toElement()
            if not e.isNull():
                if e.tagName() in ("relation", "associated"):
                    no = no.nextSibling()
                    continue

                if e.tagName() == "name":
                    n = e.text()
                    no = no.nextSibling()
                    continue

                if e.tagName() == "alias":
                    a = auto_qt_translate_text(e.text())
                    no = no.nextSibling()
                    continue

                if e.tagName() == "null":
                    aN = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "pk":
                    iPK = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "type":
                    if e.text() == "int":
                        t = "int"
                    elif e.text() == "uint":
                        t = "uint"
                    elif e.text() == "bool":
                        t = "bool"
                    elif e.text() == "double":
                        t = "double"
                    elif e.text() == "time":
                        t = "time"
                    elif e.text() == "date":
                        t = "date"
                    elif e.text() == "pixmap":
                        t = "pixmap"
                    elif e.text() == "bytearray":
                        t = "bytearray"
                    elif e.text() == "string":
                        t = "string"
                    elif e.text() == "stringlist":
                        t = "stringlist"
                    elif e.text() == "unlock":
                        t = "unlock"
                    elif e.text() == "serial":
                        t = "serial"
                    no = no.nextSibling()
                    continue

                if e.tagName() == "length":
                    length = int(e.text())
                    no = no.nextSibling()
                    continue

                if e.tagName() == "regexp":
                    rX = e.text()
                    no = no.nextSibling()
                    continue

                if e.tagName() == "default":
                    if e.text().find("QT_TRANSLATE_NOOP") > -1:
                        dV = auto_qt_translate_text(e.text())
                    else:
                        dV = e.text()

                    no = no.nextSibling()
                    continue

                if e.tagName() == "outtransaction":
                    oT = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "counter":
                    coun = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "calculated":
                    c = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "fullycalculated":
                    fullCalc = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "trimmed":
                    trimm = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "visible":
                    v = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "visiblegrid":
                    vG = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "editable":
                    ed = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "partI":
                    pI = int(e.text())
                    no = no.nextSibling()
                    continue

                if e.tagName() == "partD":
                    pD = int(e.text())
                    no = no.nextSibling()
                    continue

                if e.tagName() == "index":
                    iNX = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "unique":
                    uNI = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "ck":
                    ck = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "optionslist":
                    ol = e.text()
                    no = no.nextSibling()
                    continue

                if e.tagName() == "searchoptions":
                    so = e.text()
                    no = no.nextSibling()
                    continue

            no = no.nextSibling()

        f = FLFieldMetaData(n, util.translate("Metadata",
                                              a), aN, iPK, t, length, c, v, ed,
                            pI, pD, iNX, uNI, coun, dV, oT, rX, vG, True, ck)
        f.setFullyCalculated(fullCalc)
        f.setTrimed(trimm)

        if ol:
            f.setOptionsList(ol)
        if so is not None:
            f.setSearchOptions(so)

        no = field.firstChild()

        while not no.isNull():
            e = no.toElement()
            if not e.isNull():
                if e.tagName() == "relation":
                    f.addRelationMD(self.metadataRelation(e))
                    no = no.nextSibling()
                    continue

                if e.tagName() == "associated":
                    noas = e.firstChild()
                    while not noas.isNull():
                        eas = noas.toElement()
                        if not eas.isNull():
                            if eas.tagName() == "with":
                                assocWith = eas.text()
                                noas = noas.nextSibling()
                                continue

                            if eas.tagName() == "by":
                                assocBy = eas.text()
                                noas = noas.nextSibling()
                                continue

                        noas = noas.nextSibling()

                    no = no.nextSibling()
                    continue

            no = no.nextSibling()

        if assocWith and assocBy:
            f.setAssociatedField(assocWith, assocBy)

        return f
예제 #2
0
def getTableObj(tree, root):
    table = Struct()
    table.xmltree = tree
    table.xmlroot = root
    query_name = one(table.xmlroot.xpath("query/text()"), None)
    name = table.xmlroot.xpath("name/text()")[0]
    if query_name:
        table.name = query_name
        table.query_table = name
    else:
        table.name = name
    table.fields = []
    table.pk = []
    table.fields_idx = {}
    for xmlfield in table.xmlroot.xpath("field"):
        try:
            field = Struct()
            field.name = None
            field.alias = None
            field.allowNull = False
            field.pk = False
            field.mtd_type = None
            field.length_ = 0
            field.calculated = False
            field.visible = True
            field.editable = True
            field.pI = 4
            field.pD = 0
            field.iNX = False
            field.uNI = False
            field.coun = False
            field.defValue = None
            field.oT = False
            field.rX = None
            field.vG = True
            field.gene = False
            field.iCK = False

            field.name = xmlfield.xpath("name/text()")[0]
            field.alias = one(xmlfield.xpath("alias/text()"))
            build_field_type(field, xmlfield)
            field.length_ = one(xmlfield.xpath("length/text()"), 0)
            field.allowNull = text2bool(one(xmlfield.xpath("null/text()"), "true"))
            field.pk = text2bool(one(xmlfield.xpath("pk/text()"), "false"))
            field.editable = text2bool(one(xmlfield.xpath("editable/text()"), "true"))
            field.visible = text2bool(one(xmlfield.xpath("visible/text()"), "true"))
            field.iCK = text2bool(one(xmlfield.xpath("ck/text()"), "false"))
            field.defValue = one(xmlfield.xpath("default/text()"), None)
            field.optionsList = one(xmlfield.xpath("optionslist/text()"), None)
            field.vG = text2bool(one(xmlfield.xpath("visiblegrid/text()"), "true"))
            field.rX = QString()
            field.pI = one(xmlfield.xpath("partI/text()"), 4)
            field.pD = one(xmlfield.xpath("partD/text()"), 0)
            field.calculated = text2bool(one(xmlfield.xpath("counter/text()"), "false"))

            if field.pk:
                table.pk.append(field.name)
            if field.name in table.fields_idx:
                raise ValueError("La tabla %s tiene el campo %s repetido" % (table.name, field.name))
            field.number = len(table.fields)
            table.fields_idx[field.name] = field.number
            fieldMD = FLFieldMetaData(
                field.name,
                field.alias,
                field.allowNull,
                field.pk,
                field.mtd_type,
                field.length_,
                field.calculated,
                field.visible,
                field.editable,
                field.pI,
                field.pD,
                field.iNX,
                field.uNI,
                field.coun,
                field.defValue,
                field.oT,
                field.rX,
                field.vG,
                field.gene,
                field.iCK,
            )
            relations = xmlfield.xpath("relation")
            for xmlRelation in relations:
                tableNameR = one(xmlRelation.xpath("table/text()"))
                fieldRelation = one(xmlRelation.xpath("field/text()"))
                cardR = one(xmlRelation.xpath("card/text()"))
                delC = text2bool(one(xmlRelation.xpath("delC/text()"), "false"))
                updC = text2bool(one(xmlRelation.xpath("updC/text()"), "false"))
                checkIn = one(xmlRelation.xpath("checkIn/text()"), "true")
                relation = FLRelationMetaData(tableNameR, fieldRelation, cardR, delC, updC, checkIn)
                fieldMD.addRelationMD(relation)

            associateds = xmlfield.xpath("associated")
            for xmlAssoc in associateds:
                aWith = one(xmlRelation.xpath("with/text()"))
                aBy = one(xmlRelation.xpath("by/text()"))

                fieldMD.setAssociatedField(aWith, aBy)

            if field.optionsList:
                fieldMD.setOptionsList(field.optionsList)

            table.fields.append(fieldMD)

            # table.fields.append(fieldMD)

            # fieldMD.addRelationMD(relation)
            # print(relationTableNameList_)
            """
            fieldMD = FLFieldMetaData(field.name, field.alias, field.allowNull, field.pk, field.mtd_type, field.length_, field.calculated, field.visible, field.editable, field.pI, field.pD, field.iNX, field.uNI, field.coun, field.defValue, field.oT, field.rX, field.vG, field.gene, field.iCK)

            i = 0
            l = len(relationTableNameList_)
            l1 = len(relationFieldRelationList_)
            l2 = len(relationCardList_)
            while i < l:
                print("%s.%s->%s de %s ojo (%s,%s) " % (table.name, field.name, i, l, l1, l2))
                #print("%s.%s --(%s)--> %s.%s" % (table.name, field.name, relationCardList_[i],relationTableNameList_[i], relationFieldRelationList_[i]))
                if relationDelCList_[i] == "false":
                    delC = False
                else:
                    delC = True
                
                if relationupdCList_[i] == "false":
                    updC = False
                else:
                    updC = True
                
                if relationCIList_[i] == "false":
                    cI = False
                else:
                    cI = True
                
                relation = FLRelationMetaData(relationTableNameList_[i],relationFieldRelationList_[i], relationCardList_[i], delC, updC ,cI)
                fieldMD.addRelationMD(relation)
                i = i + 1
            
            
            
            
            
            
            
            table.fields.append(fieldMD)
            """
        except Exception as e:
            print("ERROR: procesando tabla %r:" % table.name, e)
            print(traceback.format_exc())
    return table
예제 #3
0
def getTableObj(tree, root):
    table = SchemaTableStruct()
    table.xmltree = tree
    table.xmlroot = root
    query_name = one(table.xmlroot.xpath("query/text()"), None)
    name = table.xmlroot.xpath("name/text()")[0]
    table.tablename = name
    if query_name:
        table.name = query_name
        table.query_table = name
    else:
        table.name = name
        table.query_table = None
    table.fields = []
    table.pk = []
    table.fields_idx = {}
    for xmlfield in table.xmlroot.xpath("field"):
        try:
            field = SchemaFieldStruct()
            field.name = None
            field.alias = None
            field.allowNull = False
            field.pk = False
            field.mtd_type = None
            field.length_ = 0
            field.calculated = False
            field.visible = True
            field.editable = True
            field.pI = 4
            field.pD = 0
            field.iNX = False
            field.uNI = False
            field.coun = False
            field.defValue = None
            field.oT = False
            field.rX = None
            field.vG = True
            field.gene = False
            field.iCK = False
            fks = {}
            for fieldprop in xmlfield:
                if fieldprop.text: fks[fieldprop.tag] = fieldprop.text
                #else: fks[fieldprop.tag] = fieldprop
                #print("Field Prop: %r:%r" % (fieldprop.tag,fieldprop.text))

            field.name = fks.get("name")
            field.alias = fks.get("alias")
            build_field_type(field, xmlfield, fks)
            field.length_ = fks.get("length", 0)
            field.allowNull = text2bool(fks.get("null", "true"))
            field.pk = text2bool(fks.get("pk", "false"))
            field.editable = text2bool(fks.get("editable", "true"))
            field.visible = text2bool(fks.get("visible", "true"))
            field.iCK = text2bool(fks.get("ck", "false"))
            field.defValue = fks.get("default")
            field.optionsList = fks.get("optionslist")
            field.vG = text2bool(fks.get("visiblegrid", "true"))
            field.rX = ""
            field.pI = fks.get("partI", 4)
            field.pD = fks.get("partD", 0)
            field.calculated = text2bool(fks.get("counter", "false"))

            # TODO: la lectura insistente con xpath parece ralentizar el parseo de las MTD

            if field.pk: table.pk.append(field.name)
            if field.name in table.fields_idx:
                raise ValueError("La tabla %s tiene el campo %s repetido" %
                                 (table.name, field.name))
            field.number = len(table.fields)
            table.fields_idx[field.name] = field.number
            fieldMD = FLFieldMetaData(field.name, field.alias, field.allowNull,
                                      field.pk, field.mtd_type, field.length_,
                                      field.calculated, field.visible,
                                      field.editable, field.pI, field.pD,
                                      field.iNX, field.uNI, field.coun,
                                      field.defValue, field.oT, field.rX,
                                      field.vG, field.gene, field.iCK)
            relations = xmlfield.xpath("relation")
            for xmlRelation in relations:
                rks = {}
                for rel in xmlRelation:
                    if rel.text: rks[rel.tag] = rel.text

                tableNameR = rks.get("table")
                fieldRelation = rks.get("field")
                cardR = rks.get("card")
                delC = text2bool(rks.get("delC", "false"))
                updC = text2bool(rks.get("updC", "false"))
                checkIn = rks.get("checkIn")
                relation = FLRelationMetaData(tableNameR, fieldRelation, cardR,
                                              delC, updC, checkIn)
                fieldMD.addRelationMD(relation)

            associateds = xmlfield.xpath("associated")
            for xmlAssoc in associateds:
                aks = {}
                for assoc in xmlAssoc:
                    if assoc.text: aks[assoc.tag] = assoc.text
                aWith = aks.get("with")
                aBy = aks.get("by")

                fieldMD.setAssociatedField(aWith, aBy)

            if field.optionsList:
                fieldMD.setOptionsList(field.optionsList)

            table.fields.append(fieldMD)

            #table.fields.append(fieldMD)

            #fieldMD.addRelationMD(relation)
            #print(relationTableNameList_)
            """
            fieldMD = FLFieldMetaData(field.name, field.alias, field.allowNull, field.pk, field.mtd_type, field.length_, field.calculated, field.visible, field.editable, field.pI, field.pD, field.iNX, field.uNI, field.coun, field.defValue, field.oT, field.rX, field.vG, field.gene, field.iCK)

            i = 0
            l = len(relationTableNameList_)
            l1 = len(relationFieldRelationList_)
            l2 = len(relationCardList_)
            while i < l:
                print("%s.%s->%s de %s ojo (%s,%s) " % (table.name, field.name, i, l, l1, l2))
                #print("%s.%s --(%s)--> %s.%s" % (table.name, field.name, relationCardList_[i],relationTableNameList_[i], relationFieldRelationList_[i]))
                if relationDelCList_[i] == "false":
                    delC = False
                else:
                    delC = True
                
                if relationupdCList_[i] == "false":
                    updC = False
                else:
                    updC = True
                
                if relationCIList_[i] == "false":
                    cI = False
                else:
                    cI = True
                
                relation = FLRelationMetaData(relationTableNameList_[i],relationFieldRelationList_[i], relationCardList_[i], delC, updC ,cI)
                fieldMD.addRelationMD(relation)
                i = i + 1
            
            
            
            
            
            
            
            table.fields.append(fieldMD)
            """
        except Exception as e:
            print("ERROR: procesando tabla %r:" % table.name, e)
            print(traceback.format_exc())
    return table
예제 #4
0
    def metadataField(self, field, v=True, ed=True):
        if not field:
            return None

        util = FLUtil()

        ck = False
        n = None
        a = None
        ol = False
        rX = None
        assocBy = None
        assocWith = None
        so = None

        aN = True
        iPK = True
        c = False
        iNX = False
        uNI = False
        coun = False
        oT = False
        vG = True
        fullCalc = False
        trimm = False

        t = -1
        l = 0
        pI = 4
        pD = 0

        dV = None

        no = field.firstChild()

        while not no.isNull():
            e = no.toElement()
            if not e.isNull():
                if e.tagName() in ("relation", "associated"):
                    no = no.nextSibling()
                    continue

                if e.tagName() == "name":
                    n = e.text()
                    no = no.nextSibling()
                    continue

                if e.tagName() == "alias":
                    a = auto_qt_translate_text(e.text())
                    no = no.nextSibling()
                    continue

                if e.tagName() == "null":
                    aN = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "pk":
                    iPK = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "type":
                    if e.text() == "int":
                        t = "int"
                    elif e.text() == "uint":
                        t = "uint"
                    elif e.text() == "bool":
                        t = "bool"
                    elif e.text() == "double":
                        t = "double"
                    elif e.text() == "time":
                        t = "time"
                    elif e.text() == "date":
                        t = "date"
                    elif e.text() == "pixmap":
                        t = "pixmap"
                    elif e.text() == "bytearray":
                        t = "bytearray"
                    elif e.text() == "string":
                        t = "string"
                    elif e.text() == "stringlist":
                        t = "stringlist"
                    elif e.text() == "unlock":
                        t = "unlock"
                    elif e.text() == "serial":
                        t = "serial"
                    no = no.nextSibling()
                    continue

                if e.tagName() == "length":
                    l = int(e.text())
                    no = no.nextSibling()
                    continue

                if e.tagName() == "regexp":
                    rX = e.text()
                    no = no.nextSibling()
                    continue

                if e.tagName() == "default":
                    if e.text().find("QT_TRANSLATE_NOOP") > -1:
                        dV = auto_qt_translate_text(e.text())
                    else:
                        dV = e.text()

                    no = no.nextSibling()
                    continue

                if e.tagName() == "outtransaction":
                    oT = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "counter":
                    coun = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "calculated":
                    c = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "fullycalculated":
                    fullCalc = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "trimmed":
                    trimm = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "visible":
                    v = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "visiblegrid":
                    vG = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "editable":
                    ed = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "partI":
                    pI = int(e.text())
                    no = no.nextSibling()
                    continue

                if e.tagName() == "partD":
                    pD = int(e.text())
                    no = no.nextSibling()
                    continue

                if e.tagName() == "index":
                    iNX = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "unique":
                    uNI = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "ck":
                    ck = (e.text() == "true")
                    no = no.nextSibling()
                    continue

                if e.tagName() == "optionslist":
                    ol = e.text()
                    no = no.nextSibling()
                    continue

                if e.tagName() == "searchoptions":
                    so = e.text()
                    no = no.nextSibling()
                    continue

            no = no.nextSibling()

        f = FLFieldMetaData(n, util.translate("Metadata",
                                              a), aN, iPK, t, l, c, v, ed, pI,
                            pD, iNX, uNI, coun, dV, oT, rX, vG, True, ck)
        f.setFullyCalculated(fullCalc)
        f.setTrimed(trimm)

        if ol:
            f.setOptionsList(ol)
        if not so == None:
            f.setSearchOptions(so)

        no = field.firstChild()

        while not no.isNull():
            e = no.toElement()
            if not e.isNull():
                if e.tagName() == "relation":
                    f.addRelationMD(self.metadataRelation(e))
                    no = no.nextSibling()
                    continue

                if e.tagName() == "associated":
                    noas = e.firstChild()
                    while not noas.isNull():
                        eas = noas.toElement()
                        if not eas.isNull():
                            if eas.tagName() == "with":
                                assocWith = eas.text()
                                noas = noas.nextSibling()
                                continue

                            if eas.tagName() == "by":
                                assocBy = eas.text()
                                noas = noas.nextSibling()
                                continue

                        noas = noas.nextSibling()

                    no = no.nextSibling()
                    continue

            no = no.nextSibling()

        if assocWith and assocBy:
            f.setAssociatedField(assocWith, assocBy)

        return f