# -*- coding: utf-8 -*- from __future__ import absolute_import # Import the PyQt and QGIS libraries from builtins import next from builtins import str # from builtins import object # import qgis from qgis.PyQt.QtCore import QSettings from qgis.PyQt.QtWidgets import QDialog, QMessageBox from qgis.PyQt import QtGui from qgis.core import QgsDataSourceUri, QgsSettings, QgsWkbTypes, Qgis try: from .tools.PythonSQL import login_base except ValueError: print('Pas de fichier PythonSQL') from .tools.resources import ( load_ui, resources_path, # send_issues, ) # from .issues import CenRa_Issues from qgis.utils import iface # import os # import os.path # import webbrowser # import psycopg2 # import psycopg2.extras # import base64 EDITOR_CLASS = load_ui('CenRa_Copie_base.ui') class Copie_Editor(QDialog, EDITOR_CLASS): def __init__(self, parent=None): _ = parent super().__init__() self.setupUi(self) self.settings = QgsSettings() self.s = QSettings() self.setWindowIcon(QtGui.QIcon(resources_path('icons', 'icon.png'))) self.iface = iface def raise_(self): """Run method that performs all the real work""" layer = self.iface.activeLayer() if layer is None: # self.iface.messageBar().pushMessage(u"Vous devez sélectionner une table !", level=QgsMessageBar.WARNING, duration=5) self.iface.messageBar().pushMessage("Ooops", u"Vous devez sélectionner une table !", level=Qgis.Warning, duration=5) else: # Récupération des sources de la couche active list_sources = layer.source().split(" ") # dbname source_db = [s for s in list_sources if "dbname" in s][0].split("'")[1] # schema source_schema = [s for s in list_sources if "table" in s][0].split('"')[1] # tablename source_tablename = [s for s in list_sources if "table" in s][0].split('"')[3] account = login_base("account") sigdb = account[5] if source_db != sigdb: # self.iface.messageBar().pushMessage(u"Un référentiel ne peut être copié, utilisez les filtres !", level=QgsMessageBar.CRITICAL, duration=10) self.iface.messageBar().pushMessage("Ooops", u"Vous ne pouvez copier des couches que dans sigXX", level=Qgis.Critical, duration=5) else: user = account[0] mdp = account[1] host = account[2] port = account[3] dbname = account[4] cur = account[7] con = account[8] # Creation de la liste des schemas de la base de donnees SQL = """WITH list_schema AS ( SELECT catalog_name, schema_name FROM information_schema.schemata WHERE schema_name <> 'information_schema' AND schema_name !~ E'^pg_' ORDER BY schema_name ) SELECT string_agg(schema_name,',') FROM list_schema GROUP BY catalog_name""" cur.execute(SQL) list_brut = str(next(cur)) list = list_brut[2:-3] listItems = list.split(",") con.close() self.schema.clear() self.schema.addItems(listItems) # Pour ne pas commencer la liste au premier schema self.schema.setCurrentIndex(-1) # Affiche le nom de la table source self.table_source.setText(source_schema + "." + source_tablename) # show the dialog self.show() # Run the dialog event loop result = self.exec() # See if OK was pressed if result: # ******************************debut script********************************* account = login_base("account") user = account[0] mdp = account[1] host = account[2] port = account[3] dbname = account[4] cur = account[7] con = account[8] # Récupération de la couche active layer = self.iface.activeLayer() # Récupération des sources de la couche active list_sources = layer.source().split(" ") # dbname source_db = [s for s in list_sources if "dbname" in s][0].split("'")[1] # schema source_schema = [s for s in list_sources if "table" in s][0].split('"')[1] # tablename source_tablename = [s for s in list_sources if "table" in s][0].split('"')[3] if self.schema.currentIndex() == - 1: QMessageBox.warning(None, "Oups :", "Veuillez choisir un dossier de destination.") return schema = self.schema.currentText() if self.table_destination.text() == '': QMessageBox.warning(None, "Oups :", "Veuillez choisir un nom de destination.") return if self.annee.text() == 'aaaa' or self.annee.text() == '': tablename = schema + "_" + self.table_destination.text().lower() else: tablename = schema + "_" + self.table_destination.text().lower() + "_" + self.annee.text() tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis if self.table_vide.isChecked() == 1: SQL_table = "CREATE TABLE " + schema + "." + tablename + " AS SELECT * FROM " + source_schema + "." + source_tablename + " LIMIT 0;" else: SQL_table = "CREATE TABLE " + schema + "." + tablename + " AS SELECT * FROM " + source_schema + "." + source_tablename SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" SQL_sequence_01 = "CREATE SEQUENCE " + schema + "." + tablename + "_gid_seq" + " INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;" SQL_sequence_02 = "ALTER TABLE " + schema + "." + tablename + " ALTER COLUMN gid SET DEFAULT nextval(\'" + schema + "." + tablename + "_gid_seq\'::regclass);" SQL_sequence_03 = "SELECT setval(\'" + schema + "." + tablename + "_gid_seq\'::regclass, (SELECT max(gid) AS max_gid FROM " + schema + "." + tablename + "));" SQL_sequence_04 = "ALTER SEQUENCE " + schema + "." + tablename + "_gid_seq" + " OWNED BY " + schema + "." + tablename + ".gid;" SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" SQL_trigger_length_m = "CREATE TRIGGER length_m" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_m();" SQL_trigger_length_km = "CREATE TRIGGER length_km" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_km();" SQL_trigger_coordonnees = "CREATE TRIGGER coordonnees" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.coordonnees();" cur.execute(SQL_table) cur.execute(SQL_pkey) cur.execute(SQL_sequence_01) cur.execute(SQL_sequence_02) cur.execute(SQL_sequence_03) cur.execute(SQL_sequence_04) RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename + "','gid')" cur.execute(RETURNE) sequence_name = cur.fetchone()[0] print(sequence_name) SQL_GRANT_TABLE = "GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_qgis;GRANT DELETE, INSERT, REFERENCES, SELECT, TRIGGER, TRUNCATE, UPDATE ON " + schema + "." + tablename + " TO grp_sig;GRANT ALL ON SEQUENCE " + sequence_name + " TO grp_qgis;" cur.execute(SQL_GRANT_TABLE) if layer.wkbType() == QgsWkbTypes.PointGeometry: cur.execute(SQL_trigger_coordonnees) if layer.wkbType() == QgsWkbTypes.LineGeometry: cur.execute(SQL_trigger_length_m) cur.execute(SQL_trigger_length_km) if layer.wkbType() == QgsWkbTypes.PolygonGeometry: cur.execute(SQL_trigger_area_m2) cur.execute(SQL_trigger_area_ha) con.commit() # Affichage de la table uri = QgsDataSourceUri() # set host name, port, database name, username and password uri.setConnection(host, port, dbname, user, mdp) # set database schema, table name, geometry column and optionaly subset (WHERE clause) uri.setDataSource(schema, tablename, "geom") layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") con.commit() con.close() # self.iface.messageBar().pushMessage("Table \"" + source_schema + "." + source_tablename + u"\" copiée dans \"" + schema + "." + tablename + "\"." , level=QgsMessageBar.INFO, duration=10) self.iface.messageBar().pushMessage("Bravo!", "Table \"" + source_schema + "." + source_tablename + u"\" copiée dans \"" + schema + "." + tablename + "\".", level=Qgis.Info, duration=5) pass