Esempio n. 1
0
 def _query(self, querystring, **mappings):
     querystring = querystring.replace(r"\r\n", " ")
     query = QSqlQuery(self.db)
     query.prepare(querystring)
     for key, value in mappings.items():
         bindvalue = ":{}".format(key)
         if re.search(r"{}\b".format(bindvalue), querystring):
             query.bindValue(bindvalue, value)
     return query
Esempio n. 2
0
 def getFavorits(self, usuari=getpass.getuser().upper()):
     '''Comentari explicant'''
     if not self.__CONNECTA_BASE_DADES__(usuari):
         return []
     query = QSqlQuery(self.db)
     query.prepare(
         "select nom_mapa from QV_MAPES_FAVORITS where iduser=:IDUSER")
     query.bindValue(':IDUSER', usuari)
     query.exec()
     res = []
     while query.next():
         res.append(query.value(0))
     #Consulta
     self.__DESCONNECTA_BASE_DADES__(usuari, False)
     return res
    def checkUserExists(self):
        sql = "SELECT lower(username) as username FROM postnas_search_access_control WHERE lower(username) = :username"

        self.__openDB()
        queryCheckUserExists = QSqlQuery(self.db)
        queryCheckUserExists.prepare(sql)
        queryCheckUserExists.bindValue(":username", self.getUsername())
        queryCheckUserExists.exec_()

        if (queryCheckUserExists.lastError().number() == -1):
            if (queryCheckUserExists.size() > 0):
                return True
            else:
                return False
        else:
            return False
    def deleteUser(self):
        sql = "DELETE FROM postnas_search_access_control WHERE lower(username) = :username"
        self.__openDB()
        queryDeleteUser = QSqlQuery(self.db)
        queryDeleteUser.prepare(sql)
        queryDeleteUser.bindValue(":username", self.getUsername())
        queryDeleteUser.exec_()

        if (queryDeleteUser.lastError().number() == -1):
            return True
        else:
            QgsMessageLog.logMessage(
                "Datenbankfehler beim Löschen: " +
                queryDeleteUser.lastError().text(), 'PostNAS-Suche',
                Qgis.Critical)
            return False
    def __insertLogEntry(self,requestType,search,result):
        self.__openDB()
        sql = "INSERT INTO postnas_search_logging (datum,username,requestType,search,result) VALUES (:datum,:username,:requestType,:search,:result)"

        query = QSqlQuery(self.db)
        query.prepare(sql)
        query.bindValue(":datum",datetime.datetime.now().isoformat())
        query.bindValue(":username",self.username)
        query.bindValue(":requestType",requestType)
        query.bindValue(":search",search)
        query.bindValue(":result",str(result).replace("u'","'").replace("\'","\"").replace("[","{").replace("]","}"))
        query.exec_()

        if(query.lastError().number() == -1):
            return True
        else:
            return False
 def checkUserHasEigentuemerAccess(self):
     if (self.getUsername() != None):
         self.__openDB()
         sql = "SELECT lower(username) as username FROM postnas_search_access_control WHERE access IN (0,1) AND lower(username) = :username"
         queryEigentuemerAccess = QSqlQuery(self.db)
         queryEigentuemerAccess.prepare(sql)
         queryEigentuemerAccess.bindValue(":username", self.getUsername())
         queryEigentuemerAccess.exec_()
         if (queryEigentuemerAccess.lastError().number() == -1):
             if (queryEigentuemerAccess.size() > 0):
                 return True
             else:
                 return False
         else:
             return False
     else:
         return False
    def setUsername(self, username):
        self.username = username
        if (self.checkUserExists()):
            sql = "SELECT name,access FROM postnas_search_access_control WHERE lower(username) = :username"
            self.__openDB()
            queryLoadUserData = QSqlQuery(self.db)
            queryLoadUserData.prepare(sql)
            queryLoadUserData.bindValue(":username", self.getUsername())
            queryLoadUserData.exec_()

            if (queryLoadUserData.size() == 1):
                while (queryLoadUserData.next()):
                    self.setName(
                        queryLoadUserData.value(
                            queryLoadUserData.record().indexOf("name")))
                    self.setAccess(
                        queryLoadUserData.value(
                            queryLoadUserData.record().indexOf("access")))
Esempio n. 8
0
 def eliminaFavorit(self, mapa, usuari=getpass.getuser().upper()):
     if not self.__CONNECTA_BASE_DADES__(usuari):
         QMessageBox.critical(
             "Atenció",
             "No s'ha pogut eliminar el mapa de favorits. Intenteu-ho més tard, si us plau"
         )
         return False
     query = QSqlQuery(self.db)
     query.prepare(
         "delete from QV_MAPES_FAVORITS where iduser=:IDUSER and nom_mapa=:NOM_MAPA"
     )
     query.bindValue(':IDUSER', usuari)
     query.bindValue(':NOM_MAPA', mapa)
     if not query.exec():
         QMessageBox.critical(
             "Atenció",
             "No s'ha pogut eliminar el mapa de favorits. Intenteu-ho més tard, si us plau"
         )
     self.__DESCONNECTA_BASE_DADES__(usuari)
     return True
Esempio n. 9
0
 def afegeixFavorit(self, mapa, usuari=getpass.getuser().upper()):
     if not self.__CONNECTA_BASE_DADES__(usuari):
         QMessageBox.critical(
             None, "Atenció",
             "No s'ha pogut afegir el mapa a favorits. Intenteu-ho més tard, si us plau"
         )
         return False
     query = QSqlQuery(self.db)
     query.prepare(
         "insert into QV_MAPES_FAVORITS (iduser, nom_mapa) values (:IDUSER,:NOM_MAPA)"
     )
     query.bindValue(':IDUSER', usuari)
     query.bindValue(':NOM_MAPA', mapa)
     if not query.exec():
         QMessageBox.critical(
             None, "Atenció",
             "No s'ha pogut afegir el mapa a favorits. Intenteu-ho més tard, si us plau"
         )
     self.__DESCONNECTA_BASE_DADES__(usuari)
     return True
 def updateUser(self, username_old):
     if (self.getUsername() != None):
         self.__openDB()
         sql = "UPDATE postnas_search_access_control SET username = :username, name = :name, access = :access WHERE username = :username_old"
         query = QSqlQuery(self.db)
         query.prepare(sql)
         query.bindValue(":username", self.getUsername().lower())
         query.bindValue(":username_old", username_old)
         query.bindValue(":name", self.name)
         query.bindValue(":access", self.access)
         query.exec_()
         if (query.lastError().number() == -1):
             return True
         else:
             QgsMessageLog.logMessage(
                 "Datenbankfehler beim Update: " + query.lastError().text(),
                 'PostNAS-Suche', Qgis.Critical)
             return False
     else:
         return False
 def insertUser(self):
     if (self.getUsername() != None):
         self.__openDB()
         sql = "INSERT INTO postnas_search_access_control (username,name,access) VALUES (:username,:name,:access)"
         query = QSqlQuery(self.db)
         query.prepare(sql)
         query.bindValue(":username", self.getUsername().lower())
         query.bindValue(":name", self.name)
         query.bindValue(":access", self.access)
         query.exec_()
         if (query.lastError().number() == -1):
             return True
         else:
             return False
     else:
         return False
Esempio n. 12
0
class QtSqlDBCursor(object):
    def __init__(self, conn):
        self.qry = QSqlQuery(conn)
        self.description = None
        self.rowcount = -1
        self.arraysize = 1

    def close(self):
        self.qry.finish()

    def execute(self, operation, parameters=[]):
        if len(parameters) == 0:
            if not self.qry.exec_(operation):
                raise ExecError(self.qry.lastError().databaseText())
        else:
            if not self.qry.prepare(operation):
                raise ExecError(self.qry.lastError().databaseText())

            for i in range(len(parameters)):
                self.qry.bindValue(i, parameters[i])

            if not self.qry.exec_():
                raise ExecError(self.qry.lastError().databaseText())

        self.rowcount = self.qry.size()
        self.description = []
        for c in range(self.qry.record().count()):
            f = self.qry.record().field(c)

            if f.type() == QVariant.Date:
                t = Date
            elif f.type() == QVariant.Time:
                t = Time
            elif f.type() == QVariant.DateTime:
                t = Timestamp
            elif f.type() == QVariant.Double:
                t = float
            elif f.type() == QVariant.Int:
                t = int
            elif f.type() == QVariant.String:
                t = str
            elif f.type() == QVariant.ByteArray:
                t = str
            else:
                continue

            self.description.append([
                f.name(),  # name
                t,  # type_code
                f.length(),  # display_size
                f.length(),  # internal_size
                f.precision(),  # precision
                None,  # scale
                f.requiredStatus() != QSqlField.Required  # null_ok
            ])

    def executemany(self, operation, seq_of_parameters):
        if len(seq_of_parameters) == 0:
            return

        if not self.qry.prepare(operation):
            raise ExecError(self.qry.lastError().databaseText())

        for r in seq_of_parameters:
            for i in range(len(r)):
                self.qry.bindValue(i, r[i])

            if not self.qry.exec_():
                raise ExecError(self.qry.lastError().databaseText())

    def scroll(self, row):
        return self.qry.seek(row)

    def fetchone(self):
        if not self.qry.next():
            return None

        row = []
        for i in range(len(self.description)):
            value = self.qry.value(i)
            if (isinstance(value, QDate) or isinstance(value, QTime)
                    or isinstance(value, QDateTime)):
                value = value.toString()
            elif isinstance(value, QByteArray):
                value = u"GEOMETRY"
                # value = value.toHex()

            row.append(value)

        return row

    def fetchmany(self, size=10):
        rows = []
        while len(rows) < size:
            row = self.fetchone()
            if row is None:
                break
            rows.append(row)

        return rows

    def fetchall(self):
        rows = []
        while True:
            row = self.fetchone()
            if row is None:
                break
            rows.append(row)

        return rows

    def setinputsize(self, sizes):
        raise ExecError("nyi")

    def setoutputsize(self, size, column=None):
        raise ExecError("nyi")
Esempio n. 13
0
class QvApp(Singleton):

    def __init__(self):
        if hasattr(self, 'gh'):                     # Se inicializa una vez
            return

        self.gh = None
        self.ruta, self.rutaBase = self.calcRuta()  # Path de la aplicación
        self.cfg = self.readCfg()                   # Config de instalación
        val = self.paramCfg("Debug", "False")       # Errores no controlados
        if val != "True":
            sys.excepthook = _fatalError

        self.entorn = self.calcEntorn()             # 'DSV' o 'PRO'

        self.usuari = getpass.getuser().upper()     # Id de usuario
        self.sessio = str(uuid.uuid1())             # Id único de sesión

        self.intranet = self.calcIntranet()         # True si en la intranet
        self.dbQvista = _DB_QVISTA[self.entorn]     # Conexión Oracle entorno
        self.dbGeo = QvSqlite().dbGeoConnexio()     # Conexión Geocod SQlite

        self.proxy = self.setProxy()                # Establecer proxy

        val = self.paramCfg('Log', 'False')         # Activación log
        if val == 'True':
            self.log = True
        else:
            self.log = False

        val = self.paramCfg('Github', 'False')      # Establecer rama Github
        if val == 'False':
            self.github = None
        elif val == 'True':
            self.github = 'master'
        else:
            self.github = val

        if self.github is None:
            self.gh = None
        else:
            val = self.paramCfg('Id', '')
            self.gh = QvGithub(self.data(), self.github, val)

        val = self.paramCfg('Stdout', 'False')      # Activación fichero salida
        if val == 'True':
            try:
                # print(os.getcwd())
                sys.stdout = open('../Salida.txt', 'w')
            except Exception:
                print('Error al redirigir stdout')

        self.dbLog = None
        self.queryLog = None
        self.familyLog = None
        self.nameLog = None
        self.queryGeo = None
        self.appQgis = None
        self.idioma = None
        self.qtTranslator = None
        self.qgisTranslator = None
        self.locale = QLocale("ca-ES")

        QgsPythonRunner.setInstance(QvPythonRunner())   # Ejecuciones Python

    def data(self):
        txt = ''
        txt += 'Nom: ' + self.paramCfg('Nom', '???') + '\n'
        txt += 'Entorn: ' + self.entorn + '\n'
        txt += 'Branca: ' + self.github + '\n'
        txt += 'Intranet: ' + str(self.intranet) + '\n'
        txt += 'Usuari: ' + self.usuari + '\n'
        txt += 'Sessió: ' + self.sessio + '\n'
        txt += '___' + '\n'
        return txt

    def calcRuta(self):
        try:
            q1 = 'qVista/'
            q2 = 'Codi/'
            f = sys.argv[0]
            f = f.replace('\\', '/')
            fUp = f.upper()
            q = q1 + q2
            qUp = q.upper()
            n = fUp.find(qUp)
            if n >= 0:
                ruta = f[:n+len(q)]
                rutaBase = f[:n+len(q1)]
                return ruta, rutaBase
            else:
                return '', ''
        except Exception as err:
            self.bugException(err)
            return '', ''

    def readCfg(self):
        try:
            nom = 'install.cfg'
            fich = self.rutaBase + nom
            if not os.path.isfile(fich):
                fich = self.ruta + nom
            fp = open(fich, 'r', encoding='utf-8-sig')
            cfg = json.load(fp)
            fp.close()
            return cfg
        except Exception as err:
            self.bugException(err)
            return dict()

    def paramCfg(self, name, default):
        if hasattr(self, 'cfg') and self.cfg is not None:
            return self.cfg.get(name, default)
        else:
            return default

    def setProxy(self):
        try:
            val = self.paramCfg('Proxy', 'False')
            if self.intranet and val == 'True':
                proxy = QNetworkProxy()
                proxy.setType(QNetworkProxy.DefaultProxy)
                proxy.setHostName = _PROXY['HostName']
                proxy.setPort = _PROXY['Port']
                proxy.setApplicationProxy(proxy)
                return proxy
            else:
                return None
        except Exception as err:
            self.bugException(err)
            return None

    def calcEntorn(self):
        val = self.paramCfg('Producció', 'False')
        if val == 'True':
            return 'PRO'
        else:
            return 'DSV'

    def calcIntranet(self):
        return os.path.isdir(_PATH_PRO)

    def carregaIdioma(self, app, idioma='ca'):
        if app is None:
            return
        self.appQgis = app
        self.idioma = self.paramCfg('Idioma', idioma)
        self.qtTranslator = QTranslator()
        self.qgisTranslator = QTranslator()

        path = QLibraryInfo.location(QLibraryInfo.TranslationsPath)
        self.qtTranslator.load("qt_" + idioma, path)
        app.installTranslator(self.qtTranslator)

        path = app.i18nPath()
        path = path.replace('/./', '/')
        self.qgisTranslator.load("qgis_" + idioma, path)
        app.installTranslator(self.qgisTranslator)

        self.locale = QLocale(self.idioma + "-ES")

    def llegirFitxerText(self, nomFich):
        try:
            txt = ''
            file = Path(nomFich)
            if file.is_file():
                with file.open():
                    txt = file.read_text()
            return txt
        except Exception:
            return ''

    def carregaAjuda(self, objecte):
        try:
            nom = type(objecte).__name__
            if self.idioma is not None and self.idioma != '':
                nomFich = nom + '_' + self.idioma + '.html'
            else:
                nomFich = nom + '.html'
            txt = self.llegirFitxerText(_PATH_HELP + nomFich)
            if txt == '':
                txt = self.llegirFitxerText(_PATH_HELP + 'WorkInProgress.html')
            return txt
        except Exception as e:
            print(str(e))
            return ''

    def zoomFactor(self):
        zoomFactor = QApplication.desktop().screen().logicalDpiX() / QvFuncions.DPI
        return zoomFactor

    def nomUsuari(self):
        return QvFuncions.getUserName(self.usuari)

    def versioQgis(self):
        return Qgis.QGIS_VERSION

    # Metodos db QVISTA

    def dbLogConnexio(self):
        if not self.intranet:
            return
        try:
            if self.dbLog is None:
                db = QSqlDatabase.addDatabase(self.dbQvista['Database'], 'LOG')
                if db.isValid():
                    db.setHostName(self.dbQvista['HostName'])
                    db.setPort(self.dbQvista['Port'])
                    db.setDatabaseName(self.dbQvista['DatabaseName'])
                    db.setUserName(self.dbQvista['UserName'])
                    db.setPassword(self.dbQvista['Password'])
                    if db.open():
                        self.dbLog = db
        except Exception:
            self.dbLog = None

    def dbLogDesconnexio(self):
        if not self.intranet:
            return
        try:
            if self.dbLog is not None:
                conName = self.dbLog.connectionName()
                self.dbLog.close()
                self.dbLog = None
                QSqlDatabase.removeDatabase(conName)
        except Exception:
            self.dbLog = None

    # Metodos de LOG en Oracle

    def logInici(self, family='QVISTA', logname='DESKTOP', params=None):
        if not self.log:
            return False
        self.dbLogConnexio()
        if self.dbLog is None:
            return False
        self.familyLog = family.upper()
        self.nameLog = logname.upper()
        self.queryLog = QSqlQuery(self.dbLog)
        return self.logRegistre('LOG_INICI', params)

    def logRegistre(self, topic, params=None):
        if not self.log or self.dbLog is None or self.queryLog is None:
            return False
        try:
            self.queryLog.prepare("CALL QV_LOG_WRITE(:IDUSER, :IDSESSION, :FAMILY, :LOGNAME, :TOPIC, :PARAMS)")
            self.queryLog.bindValue(':IDUSER', self.usuari)
            self.queryLog.bindValue(':IDSESSION', self.sessio)
            self.queryLog.bindValue(':FAMILY', self.familyLog)
            self.queryLog.bindValue(':LOGNAME', self.nameLog)
            self.queryLog.bindValue(':TOPIC', topic)
            self.queryLog.bindValue(':PARAMS', params)
            ok = self.queryLog.exec_()
            return ok
        except Exception:
            return False

    def logFi(self, params=None):
        ok = self.logRegistre('LOG_FI', params)
        self.dbLogDesconnexio()
        return ok

    def logError(self):
        if not self.log or self.dbLog is None or self.queryLog is None:
            return 'Log no actiu'
        try:
            return self.queryLog.lastError().text()
        except Exception:
            return None

    # Metodos de geocodificación

    def geocod(self, tipusVia, variant, codi, numIni, lletraIni='', numFi='', lletraFi=''):
        self.dbLogConnexio()
        if self.dbLog is None:
            return None, None
        if self.queryGeo is None:
            self.queryGeo = QSqlQuery(self.dbLog)
        try:
            self.queryGeo.prepare("CALL QV_GEOCOD(:TIPUSVIA, :VARIANTE, :CODIGO, " +
                                  ":NUMINI, :LETRAINI, :NUMFIN, :LETRAFIN, :X, :Y)")
            self.queryGeo.bindValue(':TIPUSVIA', tipusVia)
            self.queryGeo.bindValue(':VARIANTE', variant)
            self.queryGeo.bindValue(':CODIGO', codi)
            self.queryGeo.bindValue(':NUMINI', numIni)
            self.queryGeo.bindValue(':LETRAINI', lletraIni)
            self.queryGeo.bindValue(':NUMFIN', numFi)
            self.queryGeo.bindValue(':LETRAFIN', lletraFi)
            self.queryGeo.bindValue(':X', 0.0, QSql.Out)
            self.queryGeo.bindValue(':Y', 0.0, QSql.Out)
            ok = self.queryGeo.exec_()
            if ok:
                x = self.queryGeo.boundValue(':X')
                if not isinstance(x, float):
                    x = None
                y = self.queryGeo.boundValue(':Y')
                if not isinstance(y, float):
                    y = None
            return x, y
        except Exception:
            return None, None

    # Métodos de reporte de bugs con Github

    def bugUser(self, tit, desc):
        if self.gh is not None:
            return self.gh.postUser(tit, desc)
        else:
            return False

    def bugException(self, err):
        ok = False
        if self.gh is not None:
            ok = self.gh.reportBug()
        val = self.paramCfg('Debug', 'False')
        if val == 'True':
            raise err
        return ok

    def bugFatalError(self, type, value, tb):
        if self.gh is not None:
            return self.gh.reportBug(type, value, tb)
        else:
            return False
Esempio n. 14
0
class QvLog(Singleton):
    def __init__(self, family='QVISTA', logname='DESKTOP', dbLog=_DB_QVISTA):
        if hasattr(self, 'db'):  # Solo se inicializa una vez
            return
        self.family = family.upper()
        self.logname = logname.upper()
        self.usuari = getpass.getuser().upper()
        self.db = self.connexio(dbLog)
        self.sessio = str(uuid.uuid1())
        self.query = QSqlQuery()

    def connexio(self, dbLog):
        db = QSqlDatabase.addDatabase(dbLog['Database'])
        if db.isValid():
            db.setHostName(dbLog['HostName'])
            db.setPort(dbLog['Port'])
            db.setDatabaseName(dbLog['DatabaseName'])
            db.setUserName(dbLog['UserName'])
            db.setPassword(dbLog['Password'])
            if db.open():
                return db
        return None

    def desconnexio(self):
        if self.db is None:
            return
        conName = self.db.connectionName()
        self.db.close()
        self.db = None
        QSqlDatabase.removeDatabase(conName)

    def registre(self, topic, params=None):
        if self.db is None or self.query is None:
            return False
        self.query.prepare(
            "CALL QV_LOG_WRITE(:IDUSER, :IDSESSION, :FAMILY, :LOGNAME, :TOPIC, :PARAMS)"
        )
        self.query.bindValue(':IDUSER', self.usuari)
        self.query.bindValue(':IDSESSION', self.sessio)
        self.query.bindValue(':FAMILY', self.family)
        self.query.bindValue(':LOGNAME', self.logname)
        self.query.bindValue(':TOPIC', topic)
        self.query.bindValue(':PARAMS', params)
        ok = self.query.exec_()
        return ok

    def inici(self):
        ok = self.registre('LOG_INICI')
        return ok

    def fi(self):
        ok = self.registre('LOG_FI')
        self.desconnexio()
        return ok

    def error(self):
        if self.db is None or self.query is None:
            return None
        else:
            return self.query.lastError().text()
Esempio n. 15
0
class QtSqlDBCursor(object):

    def __init__(self, conn):
        self.qry = QSqlQuery(conn)
        self.description = None
        self.rowcount = -1
        self.arraysize = 1

    def close(self):
        self.qry.finish()

    def execute(self, operation, parameters=[]):
        if len(parameters) == 0:
            if not self.qry.exec_(operation):
                raise ExecError(self.qry.lastError().databaseText())
        else:
            if not self.qry.prepare(operation):
                raise ExecError(self.qry.lastError().databaseText())

            for i in range(len(parameters)):
                self.qry.bindValue(i, parameters[i])

            if not self.qry.exec_():
                raise ExecError(self.qry.lastError().databaseText())

        self.rowcount = self.qry.size()
        self.description = []
        for c in range(self.qry.record().count()):
            f = self.qry.record().field(c)

            if f.type() == QVariant.Date:
                t = Date
            elif f.type() == QVariant.Time:
                t = Time
            elif f.type() == QVariant.DateTime:
                t = Timestamp
            elif f.type() == QVariant.Double:
                t = float
            elif f.type() == QVariant.Int:
                t = int
            elif f.type() == QVariant.String:
                t = str
            elif f.type() == QVariant.ByteArray:
                t = str
            else:
                continue

            self.description.append([
                f.name(),                                 # name
                t,                                        # type_code
                f.length(),                               # display_size
                f.length(),                               # internal_size
                f.precision(),                            # precision
                None,                                     # scale
                f.requiredStatus() != QSqlField.Required  # null_ok
            ])

    def executemany(self, operation, seq_of_parameters):
        if len(seq_of_parameters) == 0:
            return

        if not self.qry.prepare(operation):
            raise ExecError(self.qry.lastError().databaseText())

        for r in seq_of_parameters:
            for i in range(len(r)):
                self.qry.bindValue(i, r[i])

            if not self.qry.exec_():
                raise ExecError(self.qry.lastError().databaseText())

    def scroll(self, row):
        return self.qry.seek(row)

    def fetchone(self):
        if not next(self.qry):
            return None

        row = []
        for i in range(len(self.description)):
            value = self.qry.value(i)
            if (isinstance(value, QDate) or
                    isinstance(value, QTime) or
                    isinstance(value, QDateTime)):
                value = value.toString()
            elif isinstance(value, QByteArray):
                value = u"GEOMETRY"
                # value = value.toHex()

            row.append(value)

        return row

    def fetchmany(self, size=10):
        rows = []
        while len(rows) < size:
            row = self.fetchone()
            if row is None:
                break
            rows.append(row)

        return rows

    def fetchall(self):
        rows = []
        while True:
            row = self.fetchone()
            if row is None:
                break
            rows.append(row)

        return rows

    def setinputsize(self, sizes):
        raise ExecError("nyi")

    def setoutputsize(self, size, column=None):
        raise ExecError("nyi")