def test_basic_2(self) -> None: """Test Deleteting.""" from pineboolib.application.database import pnsqlcursor from pineboolib.qsa import qsa cursor = pnsqlcursor.PNSqlCursor("fltest") cursor.select() self.assertEqual(cursor.size(), 100) cursor.select("string_field ='Linea 10'") self.assertEqual(cursor.size(), 1) self.assertTrue(cursor.first()) cursor.setModeAccess(cursor.Edit) self.assertTrue(cursor.refreshBuffer()) cursor.setValueBuffer("string_field", "Linea 10 m.") qsa.FLUtil().sqlDelete("fltest", "string_field='Linea 10'") cursor_2 = pnsqlcursor.PNSqlCursor("fltest") cursor_2.select() self.assertEqual(cursor_2.size(), 99) self.assertTrue(cursor.commitBuffer()) cursor.select("string_field ='Linea 9'") self.assertEqual(cursor.size(), 1) self.assertTrue(cursor.first()) cursor.setModeAccess(cursor.Edit) self.assertTrue(cursor.refreshBuffer()) cursor.setValueBuffer("string_field", "Linea 9 m.") self.assertTrue(cursor.commitBuffer()) cursor.refresh() self.assertEqual(cursor.size(), 99) cursor_3 = pnsqlcursor.PNSqlCursor("fltest") cursor_3.select() i = 0 size = 99 while cursor_3.next(): if i == 10: qsa.FLUtil().sqlDelete("fltest", "string_field='Linea 20'") size -= 1 i += 1 self.assertTrue( cursor_3.valueBuffer("string_field").find("Linea %s" % i) > -1) self.assertEqual(cursor_3.size(), 99) i += 1 cursor_3.refresh() self.assertEqual(cursor_3.size(), 98)
def afterCommit_flfiles(self, cur_files_: "isqlcursor.ISqlCursor") -> bool: """After commit flfiles.""" if cur_files_.modeAccess() != cur_files_.Browse: _qry = qsa.FLSqlQuery() _qry.setTablesList(u"flserial") _qry.setSelect(u"sha") _qry.setFrom(u"flfiles") _qry.setForwardOnly(True) _serial_value = cur_files_.valueBuffer(u"sha") if _qry.exec_(): if _qry.first(): util = qsa.FLUtil() _v = util.sha1(_qry.value(0)) while _qry.next(): if _qry.value(0) is not None: _v = util.sha1(_v + _qry.value(0)) _serial_value = _v _cur_serial = qsa.FLSqlCursor(u"flserial") _cur_serial.select() if _cur_serial.first(): _cur_serial.setModeAccess(_cur_serial.Edit) else: _cur_serial.setModeAccess(_cur_serial.Insert) _cur_serial.refreshBuffer() _cur_serial.setValueBuffer(u"sha", _serial_value) _cur_serial.commitBuffer() return True
def cargarModulo(self, nombre_fichero: str) -> bool: """Load a module and return True if loaded.""" util = qsa.FLUtil() if util.getOS() == u"WIN32": nombre_fichero = nombre_fichero[0 : len(nombre_fichero) - 1] return qsa.from_project("formflreloadlast").cargarModulo(nombre_fichero)
def grabarValorGlobal(self, valor_name: str, value: Union[str, bool]) -> None: """Set global value.""" util = qsa.FLUtil() if not util.sqlSelect("flsettings", "flkey", "flkey='%s'" % valor_name): util.sqlInsert("flsettings", "flkey,valor", "%s,%s" % (valor_name, value)) else: util.sqlUpdate("flsettings", u"valor", str(value), "flkey = '%s'" % valor_name)
def editarFicheroXML(self) -> None: """Edit xml file.""" cursor = self.cursor() util = qsa.FLUtil() if cursor.checkIntegrity(): temporal = qsa.System.getenv(u"TMP") if temporal == "": temporal = qsa.System.getenv(u"TMPDIR") if temporal == "": temporal = qsa.System.getenv(u"HOME") if temporal == "": from pineboolib.core.settings import config temporal = config.value("ebcomportamiento/temp_dir") temporal = qsa.ustr(temporal, "/", cursor.valueBuffer(u"nombre")) comando = "" contenido = self.child("contenido").toPlainText() if util.getOS() == "MACX": qsa.FileStatic.write(temporal, qsa.ustr(contenido, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n")) comando = qsa.ustr(qsa.sys.installPrefix(), "/bin/teddy.app/Contents/MacOS/teddy") else: qsa.FileStatic.write(temporal, contenido) comando = qsa.ustr(qsa.sys.installPrefix(), "/bin/teddy") self.setDisabled(True) qsa.ProcessStatic.execute([comando, temporal]) self.child("contenido").setText(qsa.FileStatic.read(temporal)) self.setDisabled(False)
def test_dates(self) -> None: """Test dates functions.""" from pineboolib.qsa import qsa util = qsa.FLUtil() self.assertEqual(str(util.addDays("30-11-2020", 2)), "2020-12-02T00:00:00") self.assertEqual(str(util.addDays("2021-12-31", 2)), "2022-01-02T00:00:00") self.assertEqual(str(util.addDays("2021-12-31T00:01:00", 2)), "2022-01-02T00:00:00") self.assertEqual(str(util.addMonths("2021-12-31", 12)), "2022-12-31T00:00:00") self.assertEqual(str(util.addMonths("01-10-2021", 12)), "2022-10-01T00:00:00") self.assertEqual(str(util.addYears("01-10-2021", 12)), "2033-10-01T00:00:00") self.assertEqual(str(util.addYears("2021-10-01", 12)), "2033-10-01T00:00:00") self.assertEqual( util.daysTo(qsa.Date("2019-07-12"), qsa.Date("2019-07-15")), 3) self.assertEqual( util.daysTo(qsa.Date("2019-07-01"), qsa.Date("2019-11-15")), 137) self.assertEqual( util.daysTo(qsa.Date("2019-07-01"), qsa.Date("2019-03-15")), -108) self.assertEqual(util.dateAMDtoDMA("2019-12-01"), "01-12-2019") self.assertEqual(util.dateAMDtoDMA("20"), "") self.assertEqual(util.dateDMAtoAMD("20"), "")
def test_basic_1(self) -> None: """"Test basic 1.""" from pineboolib.qsa import qsa util = qsa.FLUtil() self.assertEqual(util.partDecimal(1.21), 21) self.assertEqual(util.partInteger(12.345), 12) result = "CIENTO VEINTITRES MILLONES CUATROCIENTOS CINCUENTA Y SEIS MIL SETECIENTOS OCHENTA" result += " Y NUEVE EUROS CON VEINTIUN CÉNTIMOS" self.assertEqual(util.enLetraMonedaEuro(123456789.21), result) self.assertEqual(util.enLetraMonedaEuro(100), "CIEN EUROS") self.assertEqual(util.enLetraMonedaEuro(5000), "CINCO MIL EUROS") self.assertEqual(util.enLetraMonedaEuro(6002), "SEIS MIL DOS EUROS") self.assertEqual(util.enLetraMonedaEuro(13), "TRECE EUROS") self.assertEqual(util.enLetraMonedaEuro(-10), "MENOS DIEZ EUROS") self.assertEqual(util.enLetraMonedaEuro(5125), "CINCO MIL CIENTO VEINTICINCO EUROS") self.assertEqual(util.letraDni(12345678), "Z") self.assertEqual(util.nombreCampos("flareas"), ["3", "bloqueo", "idarea", "descripcion"]) self.assertEqual(util.calcularDC(30660001), "2") self.assertEqual(util.formatoMiles("12345"), "12.345") self.assertEqual(util.formatoMiles("-12.05"), "-12,05") self.assertFalse(util.numCreditCard("5539110012141618")) self.assertTrue(util.numCreditCard("3716820019271998"))
def test_sqlSelect(self) -> None: """Test sqlSelect.""" from pineboolib.qsa import qsa cursor_areas = qsa.FLSqlCursor("flareas") cursor_areas.setModeAccess(cursor_areas.Insert) cursor_areas.refreshBuffer() cursor_areas.setValueBuffer("idarea", "Y") cursor_areas.setValueBuffer("descripcion", "123oX") self.assertTrue(cursor_areas.commitBuffer()) cx = cursor_areas.db() util = qsa.FLUtil() self.assertEqual( util.sqlSelect("flareas", "descripcion", "idarea='Y'"), "123oX") self.assertEqual( util.sqlSelect("flareas", "descripcion", "idarea='Y'", ["flareas"]), "123oX") self.assertEqual( util.sqlSelect("flareas", "descripcion", "idarea='Y'", ["flareas"], 0), "123oX") self.assertEqual( util.sqlSelect("flareas", "descripcion", "idarea='Y'", ["flareas"], cx), "123oX") self.assertEqual( util.sqlSelect("flareas", "descripcion", "idarea='Y'", ["flareas"], 0, "default"), "123oX", ) self.assertEqual( util.sqlSelect("flareas", "descripcion", "idarea='Y'", ["flareas"], 0, cx), "123oX")
def leerValorGlobal(self, valor_name: str = None) -> Any: """Return global value.""" util = qsa.FLUtil() value = util.sqlSelect("flsettings", "valor", "flkey='%s'" % valor_name) if value is None or valor_name == "verticalName" and isinstance(value, bool): value = "" return value
def elegirOpcion(self, opciones: qsa.Array) -> qsa.Array: """Show a choose option dialog and return selected values.""" util = qsa.FLUtil() dialog = qsa.Dialog() dialog.okButtonText = util.translate(u"scripts", u"Aceptar") dialog.cancelButtonText = util.translate(u"scripts", u"Cancelar") bgroup = qsa.GroupBox() bgroup.setTitle(util.translate(u"scripts", u"Seleccione módulos a cargar")) dialog.add(bgroup) resultado = qsa.Array() cB = qsa.Array() i = 0 while_pass = True while i < len(opciones): if not while_pass: i += 1 while_pass = True continue while_pass = False cB[i] = qsa.CheckBox() bgroup.add(cB[i]) cB[i].text = opciones[i] cB[i].checked = True i += 1 while_pass = True try: i < len(opciones) except Exception: break indice = 0 if dialog.exec_(): i = 0 while_pass = True while i < len(opciones): if not while_pass: i += 1 while_pass = True continue while_pass = False if cB[i].checked: resultado[indice] = opciones[i] indice += 1 i += 1 while_pass = True try: i < len(opciones) except Exception: break else: return qsa.Array() if len(resultado) == 0: return qsa.Array() return resultado
def init(self) -> None: """Init function.""" settings = qsa.AQSettings() app_ = qsa.aqApp if not app_: return flfactppal = qsa.SysType().isLoadedModule("flfactppal") if flfactppal is True: try: codEjercicio = qsa.from_project("flfactppal").iface.pub_ejercicioActual() except Exception as e: logger.error( "Module flfactppal was loaded but not able to execute <flfactppal.iface.pub_ejercicioActual()>" ) logger.error( "... this usually means that flfactppal has failed translation to python" ) logger.exception(e) codEjercicio = None if codEjercicio: util = qsa.FLUtil() nombreEjercicio = util.sqlSelect( u"ejercicios", u"nombre", qsa.ustr(u"codejercicio='", codEjercicio, u"'") ) if qsa.AQUtil.sqlSelect(u"flsettings", u"valor", u"flkey='PosInfo'") == "True": texto = "" if nombreEjercicio: texto = qsa.ustr(u"[ ", nombreEjercicio, u" ]") texto = qsa.ustr( texto, u" [ ", app_.db().driverNameToDriverAlias(app_.db().driverName()), u" ] * [ ", qsa.SysType().nameBD(), u" ] * [ ", qsa.SysType().nameUser(), u" ] ", ) app_.setCaptionMainWidget(texto) else: if nombreEjercicio: app_.setCaptionMainWidget(nombreEjercicio) oldApi = settings.readBoolEntry(u"application/oldApi") if not oldApi: valor = util.readSettingEntry(u"ebcomportamiento/ebCallFunction") if valor: funcion = qsa.Function(valor) try: funcion() except Exception: qsa.debug(traceback.format_exc()) if settings.readBoolEntry("ebcomportamiento/git_updates_enabled", False): qsa.sys.AQTimer.singleShot(2000, qsa.SysType.search_git_updates)
def main(self) -> None: """Entry function.""" util = qsa.FLUtil() setting = "scripts/sys/modLastModule_%s" % qsa.sys.nameBD() fichMod = util.readSettingEntry(setting) if not fichMod: fichMod = qsa.FileDialog.getOpenFileName( util.translate(u"scripts", u"Módulo a cargar (*.mod)"), util.translate(u"scripts", u"Módulo a cargar"), ) if not fichMod: return util.writeSettingEntry(setting, fichMod) qsa.sys.processEvents() self.cargarModulo(fichMod) qsa.sys.reinit()
def test_translate(self) -> None: """Test Translations.""" from pineboolib.qsa import qsa qsa.aqApp.loadTranslationFromModule("sys", "es") util = qsa.FLUtil() self.assertEqual(util.translate("scripts", "single"), "simple!") self.assertEqual( util.translate("scripts", "variable %s") % "uno", "con variable uno!") self.assertEqual( util.translate("scripts", "multiple variable %s , %s") % ("uno", "dos"), "Test uno y dos", )
def traducirCadena(self, cadena: str, path: str, modulo: str) -> str: """Translate string.""" util = qsa.FLUtil() if cadena.find(u"QT_TRANSLATE_NOOP") == -1: return cadena cadena = qsa.QString(cadena).mid(41, len(cadena) - 43) nombre_fichero = None try: nombre_fichero = qsa.ustr(path, u"/translations/", modulo, u".", util.getIdioma(), u".ts") except Exception as e: qsa.debug(str(e)) return cadena if not qsa.FileStatic.exists(nombre_fichero): return cadena fichero = qsa.File(nombre_fichero) fichero.open(qsa.File.ReadOnly) f = fichero.read() xmlTranslations = qsa.FLDomDocument() if xmlTranslations.setContent(f): nodeMess = xmlTranslations.elementsByTagName(u"message") i = 0 while_pass = True while i < len(nodeMess): if not while_pass: i += 1 while_pass = True continue while_pass = False if nodeMess.item(i).namedItem( u"source").toElement().text() == cadena: traduccion = nodeMess.item(i).namedItem( u"translation").toElement().text() if traduccion: cadena = traduccion i += 1 while_pass = True try: i < len(nodeMess) except Exception: break return cadena
def main(self) -> None: """Entry function.""" util = qsa.FLUtil() setting = "scripts/sys/modLastDirModules_%s" % qsa.sys.nameBD() dirAnt = util.readSettingEntry(setting) dirMods = qsa.FileDialog.getExistingDirectory( dirAnt, util.translate(u"scripts", u"Directorio de Módulos") ) if not dirMods: return qsa.Dir().setCurrent(dirMods) resComando = qsa.Array() if util.getOS() == u"WIN32": resComando = self.ejecutarComando("cmd.exe /C dir /B /S *.mod") else: resComando = self.ejecutarComando("find . -name *.mod") if not resComando.ok: qsa.MessageBox.warning( util.translate(u"scripts", u"Error al buscar los módulos en el directorio:\n") + dirMods, qsa.MessageBox.Ok, qsa.MessageBox.NoButton, qsa.MessageBox.NoButton, ) return opciones = resComando.salida.split(u"\n") opciones.pop() modulos = self.elegirOpcion(opciones) if not modulos: return i = 0 while_pass = True while i < len(modulos): if not while_pass: i += 1 while_pass = True continue while_pass = False qsa.sys.processEvents() if not self.cargarModulo(modulos[i]): qsa.MessageBox.warning( util.translate(u"scripts", u"Error al cargar el módulo:\n") + modulos[i], qsa.MessageBox.Ok, qsa.MessageBox.NoButton, qsa.MessageBox.NoButton, ) return i += 1 while_pass = True try: i < len(modulos) except Exception: break util.writeSettingEntry(setting, dirMods) app_ = qsa.aqApp if app_ is None: return app_.reinit()
def editarFichero(self) -> None: """Edit a file.""" qsa.MessageBox.warning( qsa.util.translate("scripts", "Opción no disponible"), qsa.MessageBox.Yes, qsa.MessageBox.NoButton, ) return cursor = self.cursor() util = qsa.FLUtil() if cursor.checkIntegrity(): self.child("nombre").setDisabled(True) nombre = cursor.valueBuffer("nombre") tipo = self.tipoDeFichero(nombre) temporal = qsa.System.getenv("TMP") if temporal == "": temporal = qsa.System.getenv("TMPDIR") if temporal == "": temporal = qsa.System.getenv("HOME") if temporal == "": from pineboolib.core.settings import config temporal = config.value("ebcomportamiento/temp_dir") temporal = qsa.ustr(temporal, "/", cursor.valueBuffer("nombre")) contenido = self.child("contenido").toPlainText() comando = "" if tipo == ".ui": if util.getOS() == "MACX": qsa.FileStatic.write( temporal, qsa.ustr(contenido, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n") ) comando = qsa.ustr( qsa.sys.installPrefix(), "/bin/designer.app/Contents/MacOS/designer" ) else: qsa.FileStatic.write(temporal, contenido) comando = qsa.ustr(qsa.sys.installPrefix(), "/bin/designer") self.setDisabled(True) qsa.ProcessStatic.execute(qsa.Array([comando, temporal])) self.child(u"contenido").setText(qsa.FileStatic.read(temporal)) self.setDisabled(False) elif tipo == ".ts": if util.getOS() == "MACX": qsa.FileStatic.write( temporal, qsa.ustr(contenido, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n") ) comando = qsa.ustr( qsa.sys.installPrefix(), "/bin/linguist.app/Contents/MacOS/linguist" ) else: qsa.FileStatic.write(temporal, contenido) comando = qsa.ustr(qsa.sys.installPrefix(), "/bin/linguist") self.setDisabled(True) qsa.ProcessStatic.execute(qsa.Array([comando, temporal])) self.child("contenido").setText(qsa.FileStatic.read(temporal)) self.setDisabled(False) elif tipo == ".kut": if util.getOS() == "MACX": qsa.FileStatic.write( temporal, qsa.ustr(contenido, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n") ) comando = qsa.ustr( qsa.sys.installPrefix(), "/bin/kudesigner.app/Contents/MacOS/kudesigner" ) else: qsa.FileStatic.write(temporal, contenido) comando = qsa.ustr(qsa.sys.installPrefix(), "/bin/kudesigner") self.setDisabled(True) qsa.ProcessStatic.execute(qsa.Array([comando, temporal])) self.child("contenido").setText(qsa.FileStatic.read(temporal)) self.setDisabled(False) elif tipo in (".qs", ".py"): self.setDisabled(True) editor_ = qsa.FLScriptEditor(nombre) editor_.exec_() self.child("contenido").setText(editor_.code()) self.setDisabled(False) else: self.setDisabled(True) dialog = qsa.Dialog() dialog.setWidth(600) dialog.cancelButtonText = "" editor = qsa.TextEdit() if editor is None: raise Exception("editor is empty!") editor.textFormat = editor.PlainText editor.text = contenido dialog.add(editor) dialog.exec_() self.child("contenido").setText(editor.text) self.setDisabled(False)
def calculateField(self, fN: str) -> Any: """Return a value.""" if fN == "sha": util = qsa.FLUtil() return util.sha1(self.cursor().valueBuffer("contenido"))
def _class_init(self) -> None: """Inicialize.""" self.util = qsa.FLUtil()
def cargarModulo(self, nombre_fichero: str) -> bool: """Load modules.""" util = qsa.FLUtil() fichero = qsa.File(nombre_fichero, "iso-8859-15") modulo = None descripcion = None area = None desArea = None version = None nombreIcono = None # versionMinimaFL = None dependencias = qsa.Array() fichero.open(qsa.File.ReadOnly) f = fichero.read() xmlModule = qsa.FLDomDocument() if xmlModule.setContent(f): nodeModule = xmlModule.namedItem(u"MODULE") if not nodeModule: qsa.MessageBox.critical( util.translate(u"scripts", u"Error en la carga del fichero xml .mod"), qsa.MessageBox.Ok, qsa.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: if not isinstance(f, str): raise Exception("data must be str, not bytes!!") aF = f.split(u"\n") modulo = self.dameValor(aF[0]) descripcion = self.dameValor(aF[1]) area = self.dameValor(aF[2]) or "" desArea = self.dameValor(aF[3]) version = self.dameValor(aF[4]) nombreIcono = self.dameValor(aF[5]) descripcion = self.traducirCadena(descripcion or "", fichero.path or "", modulo or "") desArea = self.traducirCadena(desArea or "", fichero.path or "", modulo or "") fichIcono = qsa.File(qsa.ustr(fichero.path, u"/", nombreIcono)) fichIcono.open(qsa.File.ReadOnly) icono = fichIcono.read() if not util.sqlSelect(u"flareas", u"idarea", qsa.ustr(u"idarea = '", area, u"'")): if not util.sqlInsert(u"flareas", u"idarea,descripcion", qsa.ustr(area, u",", desArea)): qsa.MessageBox.warning( util.translate(u"scripts", u"Error al crear el área:\n") + area, qsa.MessageBox.Ok, qsa.MessageBox.NoButton, ) return False recargar = util.sqlSelect(u"flmodules", u"idmodulo", qsa.ustr(u"idmodulo = '", modulo, u"'")) curModulo = qsa.FLSqlCursor(u"flmodules") if recargar: # WITH_START curModulo.select(qsa.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 = qsa.FLSqlCursor(u"flmodules") curModulo.setMainFilter(qsa.ustr(u"idmodulo = '", modulo, u"'")) curModulo.editRecord(False) qsa.from_project("formRecordflmodules").cargarDeDisco( qsa.ustr(fichero.path, u"/"), False) qsa.from_project("formRecordflmodules").accept() setting = "scripts/sys/modLastModule_%s" % qsa.sys.nameBD() nombre_fichero = "%s" % os.path.abspath(nombre_fichero) qsa.util.writeSettingEntry(setting, nombre_fichero) qsa.sys.processEvents() return True