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
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
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
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