def fetchLargeValue(self, refKey): """ Obtiene el valor de gran tamaño segun su clave de referencia. @param refKey Clave de referencia. Esta clave se suele obtener mediante FLManager::storeLargeValue @return Valor de gran tamaño almacenado """ if refKey is None: return None if not refKey[0:3] == "RK@": return None if self._prj.singleFLLarge(): tableName = "fllarge" else: tableName = "fllarge_" + refKey.split("@")[1] if not self.existsTable(tableName): return None q = FLSqlQuery() q.setSelect("contenido") q.setFrom(tableName) q.setWhere(" refkey = '%s'" % refKey) if q.exec_() and q.first(): v = q.value(0) del q # print(v) v = clearXPM(v) # print(v) return v
def parseKey(name=None): ret = None value = None if name is None: ret = None else: q = FLSqlQuery() # q.setForwardOnly(True) q.exec_("SELECT contenido FROM fllarge WHERE refkey='%s'" % name) if q.next(): value = clearXPM(q.value(0)) imgFile = filedir("../tempdata") imgFile += "/%s.png" % name if not os.path.exists(imgFile) and value: pix = QPixmap(value) if not pix.save(imgFile): self.logger.warn("rml:refkey2cache No se ha podido guardar la imagen %s" % imgFile) ret = None ret = imgFile return ret
def oficial_cargarModulo(self, nombreFichero=None): util = qsatype.FLUtil() if util.getOS() == u"WIN32": nombreFichero = nombreFichero[0:len(nombreFichero) - 1] if not isinstance(nombreFichero, str): nombreFichero = nombreFichero.data().decode("utf-8") fichero = qsatype.File(nombreFichero, "iso-8859-15") modulo = None descripcion = None area = None desArea = None version = None nombreIcono = None versionMinimaFL = None dependencias = qsatype.Array() fichero.open(qsatype.File.ReadOnly) f = fichero.read() xmlModule = qsatype.FLDomDocument() if xmlModule.setContent(f): nodeModule = xmlModule.namedItem(u"MODULE") if not nodeModule: MessageBox.critical( util.translate(u"scripts", u"Error en la carga del fichero xml .mod"), MessageBox.Ok, MessageBox.NoButton) modulo = nodeModule.namedItem(u"name").toElement().text() descripcion = nodeModule.namedItem(u"alias").toElement().text() area = nodeModule.namedItem(u"area").toElement().text() desArea = nodeModule.namedItem(u"areaname").toElement().text() version = nodeModule.namedItem(u"version").toElement().text() nombreIcono = nodeModule.namedItem(u"icon").toElement().text() if nodeModule.namedItem(u"flversion"): versionMinimaFL = nodeModule.namedItem( u"flversion").toElement().text() if nodeModule.namedItem(u"dependencies"): nodeDepend = xmlModule.elementsByTagName(u"dependency") i = 0 while_pass = True while i < len(nodeDepend): if not while_pass: i += 1 while_pass = True continue while_pass = False dependencias[i] = nodeDepend.item(i).toElement().text() i += 1 while_pass = True try: i < len(nodeDepend) except Exception: break else: aF = f.split(u"\n") modulo = self.iface.dameValor(aF[0]) descripcion = self.iface.dameValor(aF[1]) area = self.iface.dameValor(aF[2]) desArea = self.iface.dameValor(aF[3]) version = self.iface.dameValor(aF[4]) nombreIcono = self.iface.dameValor(aF[5]) if len(aF) > 6: versionMinimaFL = self.iface.dameValor(aF[6]) if len(aF) > 7: # DEBUG:: Argument 0 not understood # DEBUG:: <Value><Constant><regexbody><regexchar # arg00="LBRACKET"/><regexchar arg00="COMMA"/><regexchar # arg00="SEMI"/><regexchar # arg00="RBRACKET"/></regexbody></Constant></Value> dependencias = self.ifacedameValor(aF[7]).split(unknownarg) descripcion = self.iface.traducirCadena(descripcion, fichero.path, modulo) desArea = self.iface.traducirCadena(desArea, fichero.path, modulo) fichIcono = qsatype.File(ustr(fichero.path, u"/", nombreIcono)) fichIcono.open(qsatype.File.ReadOnly) icono = fichIcono.read() icono = clearXPM(icono) # DEBUG:: Argument 0 not understood # DEBUG:: <Value><Constant><regexbody><regexchar arg00="LBRACKET"/><regexchar arg00="ICONST:'0'"/><regexchar arg00="MINUS"/><regexchar arg00="ICONST:'9'"/><regexchar arg00="RBRACKET"/><regexchar arg00="PLUS"/><regexchar arg00="PERIOD"/><regexchar arg00="LBRACKET"/><regexchar arg00="ICONST:'0'"/><regexchar arg00="MINUS"/><regexchar arg00="ICONST:'9'"/><regexchar arg00="RBRACKET"/><regexchar arg00="PLUS"/></regexbody></Constant></Value> #versionSys = sys.version().match(unknownarg) # if self.iface.compararVersiones(versionSys, versionMinimaFL) == 2: # contVersion = MessageBox.warning(util.translate(u"scripts", u"Este módulo necesita la versión ") + versionMinimaFL + util.translate(u"scripts", u" o superior de la aplicación base,\nactualmente la versión instalada es la ") + sys.version() + util.translate(u"scripts", u".\nFacturaLUX puede fallar por esta causa.\n¿Desea continuar la carga?"), MessageBox.Yes, MessageBox.No) # if contVersion == MessageBox.No: # return if not util.sqlSelect(u"flareas", u"idarea", ustr(u"idarea = '", area, u"'")): if not util.sqlInsert(u"flareas", u"idarea,descripcion", ustr(area, u",", desArea)): MessageBox.warning( util.translate(u"scripts", u"Error al crear el área:\n") + area, MessageBox.Ok, MessageBox.NoButton) return False recargar = util.sqlSelect(u"flmodules", u"idmodulo", ustr(u"idmodulo = '", modulo, u"'")) curModulo = qsatype.FLSqlCursor(u"flmodules") if recargar: # WITH_START curModulo.select(ustr(u"idmodulo = '", modulo, u"'")) curModulo.first() curModulo.setModeAccess(curModulo.Edit) # WITH_END else: curModulo.setModeAccess(curModulo.Insert) # WITH_START curModulo.refreshBuffer() curModulo.setValueBuffer(u"idmodulo", modulo) curModulo.setValueBuffer(u"descripcion", descripcion) curModulo.setValueBuffer(u"idarea", area) curModulo.setValueBuffer(u"version", version) curModulo.setValueBuffer(u"icono", icono) curModulo.commitBuffer() # WITH_END curSeleccion = qsatype.FLSqlCursor(u"flmodules") curModulo.setMainFilter(ustr(u"idmodulo = '", modulo, u"'")) curModulo.editRecord() formRecordflmodules.cargarDeDisco(ustr(fichero.path, u"/"), False) formRecordflmodules.accept() sys.processEvents() return True
def run(self): # TODO: Refactorizar esta función en otras más sencillas # Preparar temporal if self.deleteCache and not not os.path.exists( self.dir("cache/%s" % self.dbname)): self.logger.debug("DEVELOP: DeleteCache Activado\nBorrando %s", self.dir("cache/%s" % self.dbname)) for root, dirs, files in os.walk(self.dir("cache/%s" % self.dbname), topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name)) # borrando de share # for root, dirs, files in os.walk(self.dir("../share/pineboo"), topdown=False): # for name in files: # if name.endswith("qs.py") or name.endswith("qs.py.debug") or name.endswith("qs.xml"): # os.remove(os.path.join(root, name)) if not os.path.exists(self.dir("cache")): os.makedirs(self.dir("cache")) # Conectar: if not self.conn: self.conn = PNConnection(self.dbname, self.dbserver.host, self.dbserver.port, self.dbauth.username, self.dbauth.password, self.dbserver.type) if self.conn.conn is False: return False # Se verifica que existen estas tablas for table in ("flareas", "flmodules", "flfiles", "flgroups", "fllarge", "flserial", "flusers", "flvar"): self.conn.manager().createSystemTable(table) util = FLUtil() util.writeSettingEntry(u"DBA/lastDB", self.dbname) self.cur = self.conn.cursor() self.areas = {} self.cur.execute( """ SELECT idarea, descripcion FROM flareas WHERE 1 = 1""") for idarea, descripcion in self.cur: self.areas[idarea] = Struct(idarea=idarea, descripcion=descripcion) self.areas["sys"] = Struct(idarea="sys", descripcion="Area de Sistema") # Obtener modulos activos self.cur.execute( """ SELECT idarea, idmodulo, descripcion, icono FROM flmodules WHERE bloqueo = %s """ % self.conn.driver().formatValue("bool", "True", False)) self.modules = {} for idarea, idmodulo, descripcion, icono in self.cur: icono = clearXPM(icono) self.modules[idmodulo] = Module(self, idarea, idmodulo, descripcion, icono) file_object = open(filedir("..", "share", "pineboo", "sys.xpm"), "r") icono = file_object.read() file_object.close() icono = clearXPM(icono) self.modules["sys"] = Module(self, "sys", "sys", "Administración", icono) # Descargar proyecto . . . self.cur.execute( """ SELECT idmodulo, nombre, sha FROM flfiles ORDER BY idmodulo, nombre """ ) size_ = len(self.cur.fetchall()) self.cur.execute( """ SELECT idmodulo, nombre, sha FROM flfiles ORDER BY idmodulo, nombre """ ) f1 = open(self.dir("project.txt"), "w") self.files = {} if self._DGI.useDesktop() and self._DGI.localDesktop(): tiempo_ini = time.time() if not os.path.exists(self.dir("cache")): raise AssertionError # if self.parseProject: if self._DGI.useDesktop() and self._DGI.localDesktop(): util.createProgressDialog("Pineboo", size_) p = 0 for idmodulo, nombre, sha in self.cur: p = p + 1 if self._DGI.useDesktop() and self._DGI.localDesktop(): util.setProgress(p) util.setLabelText("Convirtiendo %s." % nombre) if idmodulo not in self.modules: continue # I fileobj = File(self, idmodulo, nombre, sha) if nombre in self.files: self.logger.warn( "run: file %s already loaded, overwritting..." % nombre) self.files[nombre] = fileobj self.modules[idmodulo].add_project_file(fileobj) f1.write(fileobj.filekey + "\n") if os.path.exists(self.dir("cache", fileobj.filekey)): continue fileobjdir = os.path.dirname(self.dir("cache", fileobj.filekey)) if not os.path.exists(fileobjdir): os.makedirs(fileobjdir) cur2 = self.conn.cursor() sql = "SELECT contenido FROM flfiles WHERE idmodulo = %s AND nombre = %s AND sha = %s" % ( self.conn.driver().formatValue("string", idmodulo, False), self.conn.driver().formatValue("string", nombre, False), self.conn.driver().formatValue("string", sha, False)) cur2.execute(sql) for (contenido, ) in cur2: f2 = open(self.dir("cache", fileobj.filekey), "wb") # La cadena decode->encode corrige el bug de guardado de # AbanQ/Eneboo txt = "" try: # txt = contenido.decode("UTF-8").encode("ISO-8859-15") txt = contenido.encode("ISO-8859-15") except Exception: self.logger.exception("Error al decodificar %s %s", idmodulo, nombre) # txt = contenido.decode("UTF-8","replace").encode("ISO-8859-15","replace") txt = contenido.encode("ISO-8859-15", "replace") f2.write(txt) if self.parseProject and nombre.endswith(".qs"): self.parseScript(self.dir("cache", fileobj.filekey)) if self._DGI.useDesktop() and self._DGI.localDesktop(): tiempo_fin = time.time() self.logger.info( "Descarga del proyecto completo a disco duro: %.3fs", (tiempo_fin - tiempo_ini)) # Cargar el núcleo común del proyecto idmodulo = 'sys' for root, dirs, files in os.walk(filedir("..", "share", "pineboo")): for nombre in files: if root.find("modulos") == -1: fileobj = File(self, idmodulo, nombre, basedir=root) self.files[nombre] = fileobj self.modules[idmodulo].add_project_file(fileobj) if self.parseProject and nombre.endswith(".qs"): self.parseScript(self.dir(root, nombre)) if self._DGI.useDesktop() and self._DGI.localDesktop(): try: util.destroyProgressDialog() except Exception as e: self.logger.error(e) self.loadTranslations() self.readState() self.acl_ = FLAccessControlLists() self.acl_.init_()