236 lines
10 KiB
Python
236 lines
10 KiB
Python
# -*- 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 QAction, QMenu, QDialog, QMessageBox,QDialogButtonBox
|
|
from qgis.PyQt.QtGui import QIcon
|
|
from PyQt5.QtCore import *
|
|
from PyQt5.QtGui import *
|
|
from PyQt5 import QtGui
|
|
from qgis.core import *
|
|
from qgis.core import QgsDataSourceUri
|
|
|
|
from .tools.PythonSQL import login_base
|
|
from .tools.SQLRequet import *
|
|
|
|
from .tools.resources import (
|
|
load_ui,
|
|
resources_path,
|
|
send_issues,
|
|
create_vierge,
|
|
create_contour,
|
|
create_travaux,
|
|
create_habita
|
|
)
|
|
from .issues import CenRa_Issues
|
|
|
|
import os.path
|
|
import webbrowser, os
|
|
import psycopg2
|
|
import psycopg2.extras
|
|
import base64
|
|
from qgis.utils import iface
|
|
|
|
EDITOR_CLASS = load_ui('CenRa_PostgisRename_base.ui')
|
|
ch = [u"à", u"À", u"â", u"Â", u"ä", u"Ä", u"å", u"Å", u"ç", u"Ç", u"é", u"É", u"è", u"È", u"ê", u"Ê", u"ë", u"Ë", u"î", u"Î", u"ï", u"Ï", u"ô", u"Ô", u"ö", u"Ö", u"ù", u"Ù", u"û", u"Û", u"ü", u"Ü", u"ÿ", u"Ÿ", u"'", u"-", u" "]
|
|
try:
|
|
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]
|
|
except:
|
|
print('')
|
|
class Postgis_Rename(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
|
|
|
|
self.schema.currentIndexChanged.connect(self.Test)
|
|
self.buttonBox.accepted.connect(self.msgBox)
|
|
### Outil Ajout de nouvelles couche a un dossier
|
|
def raise_(self):
|
|
self.activateWindow()
|
|
self.groupBox_3.hide()
|
|
self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
|
|
GET_ALL_SCHEMA = """SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema LIKE '_form_%' OR table_schema LIKE '_01_%' OR table_schema LIKE '_07_%' OR table_schema LIKE '_26_%' OR table_schema LIKE '_42_%' OR table_schema LIKE '_69_%' ORDER BY table_schema;"""
|
|
cur.execute(GET_ALL_SCHEMA)
|
|
AllSchema = cur.fetchall()
|
|
last_value_schema = self.schema.currentText()
|
|
last_value_departement = self.departement.currentText()
|
|
self.schema.clear()
|
|
self.departement.clear()
|
|
self.schema.addItems([''])
|
|
for Schema in AllSchema:
|
|
self.schema.addItems(Schema)
|
|
self.departement.addItems(['','01','07','26','42','69','form'])
|
|
if last_value_schema != '':
|
|
self.schema.setCurrentIndex(self.schema.findText(last_value_schema))
|
|
if last_value_departement != '':
|
|
self.departement.setCurrentIndex(self.departement.findText(last_value_departement))
|
|
|
|
def Test(self):
|
|
oldSchema = self.schema.currentText()
|
|
if oldSchema != '':
|
|
allIsGood = 0
|
|
|
|
GET_COUNT_LEFT = "SELECT count(*) FROM information_schema.tables WHERE table_schema LIKE left(table_name,"+str(len(oldSchema))+") AND table_schema LIKE '"+oldSchema+"';"
|
|
GET_COUNT_TOT = "SELECT count(*) FROM information_schema.tables WHERE table_schema LIKE '"+oldSchema+"';"
|
|
|
|
cur.execute(GET_COUNT_TOT)
|
|
CountTot = cur.fetchall()[0]
|
|
cur.execute(GET_COUNT_LEFT)
|
|
CountLeft = cur.fetchall()[0]
|
|
|
|
if CountLeft[0] == CountTot[0]:
|
|
allIsGood = allIsGood+1
|
|
self.couche.setChecked(1)
|
|
else:
|
|
self.couche.setChecked(0)
|
|
|
|
GET_GRANTEE_PRIVILEGE = "SELECT DISTINCT count(*) FROM information_schema.role_table_grants WHERE table_schema LIKE '"+oldSchema+"' AND grantee LIKE 'grp_qgis' AND privilege_type LIKE 'UPDATE';"
|
|
cur.execute(GET_GRANTEE_PRIVILEGE)
|
|
CountPrivilege = cur.fetchall()[0]
|
|
|
|
if CountTot[0] == CountPrivilege[0]:
|
|
allIsGood = allIsGood+1
|
|
self.compte.setChecked(1)
|
|
else:
|
|
self.compte.setChecked(0)
|
|
|
|
if allIsGood == 2:
|
|
self.groupBox_3.show()
|
|
self.loadValue()
|
|
self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(True)
|
|
else:
|
|
self.groupBox_3.hide()
|
|
self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
|
|
else:
|
|
self.old_name.setText('')
|
|
self.compte.setChecked(0)
|
|
self.couche.setChecked(0)
|
|
self.groupBox_3.hide()
|
|
|
|
def loadValue(self):
|
|
oldSchema = self.schema.currentText()
|
|
if oldSchema[:6] == '_form_':
|
|
oldSchema = self.schema.currentText()[6:]
|
|
prefixSchema = self.schema.currentText()[1:5]
|
|
else:
|
|
oldSchema = self.schema.currentText()[4:]
|
|
prefixSchema = self.schema.currentText()[1:3]
|
|
if oldSchema[:3] == 'at_':
|
|
oldSchema = oldSchema[3:]
|
|
self.animation.setChecked(1)
|
|
else:
|
|
self.animation.setChecked(0)
|
|
self.old_name.setText(oldSchema)
|
|
self.departement.setCurrentIndex(self.departement.findText(prefixSchema))
|
|
|
|
def updateName(self):
|
|
if self.departement.currentText() != '':
|
|
oldTableName = self.old_name.text()
|
|
newTableName = ((self.new_name.text()).lower()).replace(' ','_')
|
|
newPrefixSchema = '_'+self.departement.currentText()+'_'
|
|
if self.schema.currentText()[:6] == '_form_':
|
|
oldPrefixSchema = self.schema.currentText()[:6]
|
|
if (self.schema.currentText()[6:9]) == "at_":
|
|
oldPrefixSchema=oldPrefixSchema+'at_'
|
|
else:
|
|
oldPrefixSchema = self.schema.currentText()[:4]
|
|
if (self.schema.currentText()[4:7]) == 'at_':
|
|
oldPrefixSchema=oldPrefixSchema+'at_'
|
|
|
|
if self.animation.isChecked():
|
|
newPrefixSchema=newPrefixSchema+'at_'
|
|
oldSchemaName = oldPrefixSchema+oldTableName
|
|
newSchemaName = newPrefixSchema+newTableName
|
|
|
|
if oldSchemaName != newSchemaName:
|
|
global AllSQLrun
|
|
allSQLrun=''
|
|
|
|
SQL_UPDATE = """UPDATE public.layer_styles SET f_table_schema = '"""+newSchemaName+"""',f_table_name = replace(replace(f_table_name,'"""+oldTableName+"""','"""+newTableName+"""'),'"""+oldPrefixSchema+"""','"""+newPrefixSchema+"""') WHERE f_table_schema LIKE '"""+oldSchemaName+"""';"""
|
|
allSQLrun = allSQLrun+SQL_UPDATE
|
|
cur.execute(SQL_UPDATE)
|
|
|
|
SQL_GET_TABLE_RENAME = """SELECT table_name,replace(replace(table_name,'"""+oldTableName+"""','"""+newTableName+"""'),'"""+oldPrefixSchema+"""','"""+newPrefixSchema+"""') from information_schema.tables WHERE table_schema LIKE '"""+oldSchemaName+"""';"""
|
|
cur.execute(SQL_GET_TABLE_RENAME)
|
|
allTableRename = cur.fetchall()
|
|
allTableList = []
|
|
for TableRename in allTableRename:
|
|
oldTable = TableRename[0]
|
|
newTable = TableRename[1]
|
|
allTableList.append([oldTable,newSchemaName,newTable])
|
|
SQL_RENAME_TABLE = """ALTER TABLE """+oldSchemaName+'.'+oldTable+""" RENAME TO """+newTable+""";"""
|
|
allSQLrun = allSQLrun+SQL_RENAME_TABLE
|
|
cur.execute(SQL_RENAME_TABLE)
|
|
|
|
SQL_RENAME_SCHEMA = 'ALTER SCHEMA '+oldSchemaName+' RENAME TO '+newSchemaName
|
|
allSQLrun = allSQLrun+SQL_RENAME_SCHEMA
|
|
cur.execute(SQL_RENAME_SCHEMA)
|
|
#print(allSQLrun)
|
|
con.commit()
|
|
for LayerOpen in allTableList:
|
|
self.UnloadLoadLayers(LayerOpen[0],LayerOpen[1],LayerOpen[2])
|
|
|
|
|
|
def UnloadLoadLayers(self,OldName,NewSchema,NewTable):
|
|
allLayers = (QgsProject.instance().mapLayers().values())
|
|
listLayers = []
|
|
listLayersName = []
|
|
for layer in allLayers:
|
|
listLayers.append(layer)
|
|
listLayersName.append(layer.name())
|
|
if OldName in listLayersName:
|
|
layer = (listLayers[listLayersName.index(OldName)])
|
|
provider = layer.dataProvider()
|
|
dbname = (QgsDataSourceUri(provider.dataSourceUri()).database())
|
|
user = QgsDataSourceUri(provider.dataSourceUri()).username()
|
|
mdp = QgsDataSourceUri(provider.dataSourceUri()).password()
|
|
host = QgsDataSourceUri(provider.dataSourceUri()).host()
|
|
port = QgsDataSourceUri(provider.dataSourceUri()).port()
|
|
|
|
### 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(NewSchema, NewTable, 'geom')
|
|
QgsProject.instance().removeMapLayer(layer.id())
|
|
layer = self.iface.addVectorLayer(uri.uri(), NewTable, "postgres")
|
|
|
|
def msgBox(self):
|
|
self.QMBquestion = QMessageBox()
|
|
self.QMBquestion.setWindowTitle(u"Attention !")
|
|
self.QMBquestion.setIcon(QMessageBox.Warning)
|
|
self.QMBquestion.setText("Attention, le renommage de dossier PostGIS peut engendrer des pertes de liaisons avec des projets QGIS !")
|
|
self.QMBquestion.setStandardButtons(QMessageBox.Yes|QMessageBox.No)
|
|
if self.new_name.text() != '':
|
|
error_caracteres = 0
|
|
for caracteres in ch :
|
|
if self.new_name.text().find(caracteres) != -1 :
|
|
error_caracteres = 1
|
|
if error_caracteres == 0:
|
|
self.QMBquestion = self.QMBquestion.exec()
|
|
else:
|
|
QMessageBox.warning(None, "Oups :", u"Le nom de dossier ne doit pas comporter de caractères spéciaux, ni d'espaces !\n\n\t" + self.new_name.text().lower() )
|
|
else:
|
|
QMessageBox.warning(None, "Oups :", "Votre projet doit avoire un nom !")
|
|
if self.QMBquestion == QMessageBox.Yes:
|
|
self.updateName()
|