Compare commits

..
3 Commits
Author SHA1 Message Date
tlaveille 7df08ae02a flake8 postgis 2025-07-29 13:35:11 +02:00
tlaveille 133e785568 flake8 automap 2025-07-29 10:53:30 +02:00
tlaveille 9b7ab9ab15 3.5 flux 2025-07-29 10:24:51 +02:00
13 changed files with 656 additions and 718 deletions
+3 -36
View File
@@ -4,9 +4,9 @@ __email__ = "info@3liz.org"
from qgis.core import QgsApplication
from qgis.PyQt.QtCore import QCoreApplication, Qt, QTranslator, QUrl
from qgis.PyQt.QtCore import Qt, QUrl
from qgis.PyQt.QtGui import QDesktopServices, QIcon
from qgis.PyQt.QtWidgets import QAction, QMessageBox
from qgis.PyQt.QtWidgets import QAction
from qgis.utils import iface
import qgis
@@ -25,6 +25,7 @@ from pg_metadata.qgis_plugin_tools.tools.custom_logging import setup_logger
'''
import os
from qgis.PyQt.QtCore import QSettings
from .about_form import AboutDialog
from .tools.resources import (
# plugin_path,
resources_path,
@@ -35,7 +36,6 @@ pyperclip()
from .canvas_editor import AutoMap_Editor
from .style_invoke import AutoMap_Style
from .about_form import AboutDialog
class PgAutoMap:
@@ -88,39 +88,6 @@ class PgAutoMap:
if os.environ['USERNAME'] == 'tlaveille' or os.environ['USERNAME'] == 'lpoulin' or os.environ['USERNAME'] == 'rclement':
iface.addDockWidget(Qt.DockWidgetArea(0x1), self.style_dock)
'''
if not self.locator_filter:
self.locator_filter = LocatorFilter(iface)
iface.registerLocatorFilter(self.locator_filter)
@staticmethod
def check_invalid_connection_names():
""" Check for invalid connection names in the QgsSettings. """
valid, invalid = validate_connections_names()
n_invalid = len(invalid)
if n_invalid == 0:
return
invalid_text = ', '.join(invalid)
msg = QMessageBox()
msg.setIcon(QMessageBox.Warning)
msg.setWindowTitle(tr('PgMetadata: Database connection(s) not available'))
msg.setText(tr(
f'{n_invalid} connection(s) listed in PgMetadata’s settings are invalid or '
f'no longer available: {invalid_text}'))
msg.setInformativeText(tr(
'Do you want to remove these connection(s) from the PgMetadata settings? '
'(You can also do this later with the “Set Connections” tool.)'))
msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
clicked = msg.exec()
if clicked == QMessageBox.Yes:
iface.messageBar().pushSuccess('PgMetadata', tr(f'{n_invalid} invalid connection(s) removed.'))
store_connections(valid)
if clicked == QMessageBox.No:
iface.messageBar().pushInfo('PgMetadata', tr(f'Keeping {n_invalid} invalid connections.'))
'''
def open_about_dialog(self):
"""
About dialog
+1 -1
View File
@@ -3,7 +3,7 @@ import os.path
from pathlib import Path
from qgis.PyQt import uic
from qgis.PyQt.QtGui import QPixmap
# from qgis.PyQt.QtGui import QPixmap
from qgis.PyQt.QtWidgets import QDialog
from .tools.resources import devlog
+10 -48
View File
@@ -1,79 +1,41 @@
import logging
import os
from collections import namedtuple
from enum import Enum
from functools import partial
from pathlib import Path
from xml.dom.minidom import parseString
from qgis.gui import *
import qgis
from importlib import import_module
from qgis.core import (
NULL,
QgsApplication,
QgsScaleBarSettings,
QgsDataSourceUri,
QgsProject,
QgsProviderConnectionException,
QgsProviderRegistry,
QgsRasterLayer,
QgsSettings,
QgsVectorLayer,
QgsGeometry,
QgsPrintLayout,
QgsReadWriteContext,
QgsLayoutItemMap,
QgsLayoutItemPage,
QgsLayoutSize,
QgsUnitTypes,
QgsLayoutPoint,
QgsLayoutItemLabel,
QgsLayoutItemPicture,
QgsLayoutItemLegend,
QgsLegendStyle,
QgsLayoutItemScaleBar,
QgsLayerTreeGroup,
QgsCoordinateReferenceSystem,
QgsCoordinateTransform,
QgsLayerTree,
QgsLayoutTableColumn,
QgsRectangle,
QgsLayoutItemMapOverviewStack,
)
from qgis.PyQt.QtCore import QLocale, QUrl, QDateTime, Qt
from qgis.PyQt.QtGui import QDesktopServices, QIcon, QColor, QFont, QMovie
from qgis.PyQt.QtPrintSupport import QPrinter
# from qgis.PyQt.QtWebKitWidgets import QWebPage
from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtGui import QColor, QFont
from qgis.PyQt.QtWidgets import (
QDialog,
QAction,
QMessageBox,
QPushButton,
QDockWidget,
QFileDialog,
QInputDialog,
QMenu,
QToolButton,
QTableWidget,
QTableWidgetItem,
QVBoxLayout,
)
from qgis.PyQt.QtCore import QSettings
from qgis.PyQt import QtGui, QtWidgets
from qgis.PyQt import QtGui
from qgis.PyQt.QtXml import QDomDocument
from qgis.utils import iface
import glob
from .tools.resources import (
load_ui,
resources_path,
# send_issues,
)
from .issues import CenRa_Issues
from datetime import date
EDITOR_CLASS = load_ui('CenRa_AutoMap_base.ui')
@@ -210,11 +172,11 @@ class AutoMap_Editor(QDialog, EDITOR_CLASS):
self.mComboBox_4.clear()
logo_library = []
custome_bibliotech = glob.glob(self.s.value("automap/logoteck", 1, type=str) + '*.*')
for l, logo_x in enumerate(custome_bibliotech):
for number, logo_x in enumerate(custome_bibliotech):
logo_library.append(' ' + os.path.basename(logo_x))
bibliotech = glob.glob(resources_path("logo_library", "*.png"))
for l, logo_x in enumerate(bibliotech):
for number, logo_x in enumerate(bibliotech):
logo_library.append(os.path.basename(logo_x))
self.mComboBox_4.addItems(sorted(logo_library))
@@ -452,13 +414,13 @@ class AutoMap_Editor(QDialog, EDITOR_CLASS):
layout_name = self.comboBox_7.currentText()
else:
layout_name = self.lineEdit_2.text()
layouts_list = self.manager.printLayouts()
# layouts_list = self.manager.printLayouts()
for filename in glob.glob(resources_path("mises_en_pages", "*.qpt")):
with open(os.path.join(os.getcwd(), filename), 'r') as f:
self.layout = QgsPrintLayout(project)
self.layout.initializeDefaults()
myAtlas = self.layout.atlas()
# myAtlas = self.layout.atlas()
template_content = f.read()
doc = QDomDocument()
doc.setContent(template_content)
@@ -466,7 +428,7 @@ class AutoMap_Editor(QDialog, EDITOR_CLASS):
try:
cutLayout = layout_name.index("")
except:
except ValueError:
cutLayout = 0
if cutLayout >= 1:
@@ -782,7 +744,7 @@ class AutoMap_Editor(QDialog, EDITOR_CLASS):
# if self.radioButton_12.isChecked() != 1:
if self.QMBquestion == QMessageBox.StandardButton(0x00004000):
project.layoutManager().removeLayout(existing_layout)
result = project.layoutManager().addLayout(self.layout)
# result = project.layoutManager().addLayout(self.layout)
elif self.QMBquestion != QMessageBox.StandardButton(0x00010000):
LayoutCOUNT = 0
arrayManager = []
@@ -817,7 +779,7 @@ class AutoMap_Editor(QDialog, EDITOR_CLASS):
else:
TryMessage = False
del self.QMBquestion
except:
except ValueError:
TryMessage = True
if TryMessage is True:
+1 -2
View File
@@ -11,7 +11,7 @@ from qgis.utils import iface
import qgis
# include <QSettings>
from .about_form import AboutDialog
import os
from .tools.resources import (
pyperclip,
@@ -21,7 +21,6 @@ from .tools.resources import (
pyperclip()
from .flux_editor import Flux_Editor
from .about_form import AboutDialog
class PgFlux:
+2 -2
View File
@@ -7,7 +7,7 @@ name=CenRa_FLUX
qgisMinimumVersion=3.0
supportsQt6=True
description=Permet d'ouvrire une table dans la base PostGis
version=3.4
version=3.5
author=Conservatoire d'Espaces Naturels de Rhône-Alpes
email=si_besoin@cen-rhonealpes.fr
@@ -32,7 +32,7 @@ icon=icon.png
# experimental flag
experimental=False
changelog=<h2>CenRa_FLUX:</h2></br><p><h3>23/07/2025 - Version 3.4: </h3> - Ouverture raster dans la base SIG.</p></br><p><h3>23/07/2025 - Version 3.3: </h3> - Optimisation des chargement.</p></br><p><h3>22/07/2025 - Version 3.2: </h3> - Visualisation des format raster et vecteur dans REF.</p></br><p><h3>21/07/2025 - Version 3.1: </h3> - Bug fix pour l'ouverture de plus de 5 couches.</p></br><p><h3>19/05/2025 - Version 3.0: </h3> - Compatible PyQt5 et PyQt6.</p></br><p><h3>09/04/2025 - Version 2.9: </h3> - Correctif bug en TT.</p></br><p><h3>09/04/2025 - Version 2.8: </h3> - Optimisation pour le TT.</p></br><p><h3>07/04/2025 - Version 2.7: </h3> - mode debug.</p></br><p><h3>03/04/2025 - Version 2.6: </h3> - Mise a jour de securite.</p></br><p><h3>20/03/2025 - Version 2.5: </h3> - Visualisation distincte des couches ne se trouvant pas dans l'antenne.</p></br><p><h3>13/02/2025 - Version 2.4: </h3> - Ajoute redimensionnement et déplacement mollette.</p></br><p><h3>05/02/2025 - Version 2.3: </h3> - Bouton de visualisation des couches se trouvent uniquement dans le canva de la carte.</p></br><p><h3>07/01/2025 - Version 2.2: </h3> - ByPass du certif ssl ci erreur.</p></br><p><h3>22/10/2024 - Version 2.1:</h3> - Correctif de bug.</br> - Evolution de la limit de 3 à 5. </br></p></br><p><h3>22/10/2024 - Version 2.0:</h3> - Reformatage du code.</br></p></br><p><h3>03/10/2024 - Version 1.14:</h3> - Remonte la fênetre dans la pille.</br></p><p><h3>13/09/2024 - Version 1.13:</h3>- MAJ sur le lien du changelog</br>- Bug-fix: Ouvre MultiPolygone et Polygon séparément.</p></br><p><h3>10/09/2024 - Version 1.11:</h3>- Ouverture de table contenant plusieurs géométries.</p></br><p><h3>26/08/2024 - Version 1.10:</h3>- Ajoute d'un changelog et vérification de mise à jour.</p>
changelog=<h2>CenRa_FLUX:</h2></br><p><h3>29/07/2025 - Version 3.5: </h3> - Bug fix sur les donnee raster.</p></br><p><h3>23/07/2025 - Version 3.4: </h3> - Ouverture raster dans la base SIG.</p></br><p><h3>23/07/2025 - Version 3.3: </h3> - Optimisation des chargement.</p></br><p><h3>22/07/2025 - Version 3.2: </h3> - Visualisation des format raster et vecteur dans REF.</p></br><p><h3>21/07/2025 - Version 3.1: </h3> - Bug fix pour l'ouverture de plus de 5 couches.</p></br><p><h3>19/05/2025 - Version 3.0: </h3> - Compatible PyQt5 et PyQt6.</p></br><p><h3>09/04/2025 - Version 2.9: </h3> - Correctif bug en TT.</p></br><p><h3>09/04/2025 - Version 2.8: </h3> - Optimisation pour le TT.</p></br><p><h3>07/04/2025 - Version 2.7: </h3> - mode debug.</p></br><p><h3>03/04/2025 - Version 2.6: </h3> - Mise a jour de securite.</p></br><p><h3>20/03/2025 - Version 2.5: </h3> - Visualisation distincte des couches ne se trouvant pas dans l'antenne.</p></br><p><h3>13/02/2025 - Version 2.4: </h3> - Ajoute redimensionnement et déplacement mollette.</p></br><p><h3>05/02/2025 - Version 2.3: </h3> - Bouton de visualisation des couches se trouvent uniquement dans le canva de la carte.</p></br><p><h3>07/01/2025 - Version 2.2: </h3> - ByPass du certif ssl ci erreur.</p></br><p><h3>22/10/2024 - Version 2.1:</h3> - Correctif de bug.</br> - Evolution de la limit de 3 à 5. </br></p></br><p><h3>22/10/2024 - Version 2.0:</h3> - Reformatage du code.</br></p></br><p><h3>03/10/2024 - Version 1.14:</h3> - Remonte la fênetre dans la pille.</br></p><p><h3>13/09/2024 - Version 1.13:</h3>- MAJ sur le lien du changelog</br>- Bug-fix: Ouvre MultiPolygone et Polygon séparément.</p></br><p><h3>10/09/2024 - Version 1.11:</h3>- Ouverture de table contenant plusieurs géométries.</p></br><p><h3>26/08/2024 - Version 1.10:</h3>- Ajoute d'un changelog et vérification de mise à jour.</p>
# deprecated flag (applies to the whole plugin, not just a single version)
deprecated=False
+7 -6
View File
@@ -4,9 +4,9 @@ __email__ = "info@3liz.org"
from qgis.core import QgsApplication
from qgis.PyQt.QtCore import QCoreApplication, Qt, QTranslator, QUrl
from qgis.PyQt.QtCore import QUrl
from qgis.PyQt.QtGui import QDesktopServices, QIcon
from qgis.PyQt.QtWidgets import QAction, QMessageBox
from qgis.PyQt.QtWidgets import QAction
from qgis.utils import iface
import qgis
@@ -15,8 +15,10 @@ import qgis
import socket
import os
from qgis.PyQt.QtCore import QSettings
from .about_form import AboutDialog
from .tools.resources import (
plugin_path,
# plugin_path,
pyperclip,
resources_path,
maj_verif,
@@ -26,13 +28,11 @@ pyperclip()
from .postgis_editor import Postgis_Editor
from .postgis_creator import Postgis_Creator
from .postgis_rename import Postgis_Rename
from .about_form import AboutDialog
from qgis.PyQt.QtCore import *
IPAddr = socket.gethostbyname(socket.gethostname())
class PgPostgis:
def __init__(self):
""" Constructor. """
@@ -121,6 +121,7 @@ class PgPostgis:
"""
dialog = AboutDialog(iface)
dialog.exec()
def open_help():
""" Open the online help. """
QDesktopServices.openUrl(QUrl('https://plateformesig.cenra-outils.org/'))
+26 -27
View File
@@ -2,50 +2,50 @@
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 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
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QDialog, QMessageBox
# from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtCore import *
from qgis.PyQt.QtGui import *
# from qgis.PyQt.QtCore import *
# from qgis.PyQt.QtGui import *
from qgis.PyQt import QtGui
from qgis.core import *
from qgis.core import QgsDataSourceUri
# from qgis.core import *
from qgis.core import QgsSettings
try:
from .tools.PythonSQL import login_base
except:
except ValueError:
print('Pas de fichier PythonSQL')
from .tools.SQLRequet import *
# from .tools.SQLRequet import *
from .tools.resources import (
load_ui,
resources_path,
send_issues,
# send_issues,
create_vierge,
create_contour,
create_travaux,
create_habita
)
from .issues import CenRa_Issues
# from .issues import CenRa_Issues
from qgis.utils import iface
import os.path
import webbrowser, os
import psycopg2
import psycopg2.extras
import base64
# import os.path
# import webbrowser, os
# import psycopg2
# import psycopg2.extras
# import base64
EDITOR_CLASS = load_ui('CenRa_Postgis_base.ui')
class Postgis_Creator(QDialog, EDITOR_CLASS):
class Postgis_Creator(QDialog, EDITOR_CLASS):
def __init__(self, parent=None):
_ = parent
super().__init__()
@@ -64,14 +64,14 @@ class Postgis_Creator(QDialog, EDITOR_CLASS):
result = self.exec()
# See if OK was pressed
if result == 1:
# **********************************Debut_script****************************************
### Creation du schema pour le nouveau site
# Creation du schema pour le nouveau site
if self.at.isChecked():
schema = "_" + self.dept.currentText() + "_at_" + self.nom.text().lower() # Ajout de "_" pour eviter pb de numero en premier caractere
# Ajout de "_" pour eviter pb de numero en premier caractere
schema = "_" + self.dept.currentText() + "_at_" + self.nom.text().lower()
else:
schema = "_" + self.dept.currentText() + "_" + self.nom.text().lower() # Ajout de "_" pour eviter pb de numero en premier caractere
# Ajout de "_" pour eviter pb de numero en premier caractere
schema = "_" + self.dept.currentText() + "_" + self.nom.text().lower()
if self.nom.text() == "" or self.nom.text() == "NULL":
QMessageBox.warning(None, "Oups :", "Veuillez renseigner un nom de dossier.")
@@ -98,13 +98,12 @@ class Postgis_Creator(QDialog, EDITOR_CLASS):
cur.execute(SQL_schema)
cur.execute(SQL_GRANT_SCHEMA)
else:
iface.messageBar().pushMessage("POSTGRESQL :", "Pas de couche sélectionnée, création refusée.", level=Qgis.Warning, duration=30)
iface.messageBar().pushMessage("POSTGRESQL :", "Pas de couche sélectionnée, création refusée.", level=1, duration=30)
create_contour(self, schema, cur, con, host, port, dbname, user, mdp)
create_habita(self, schema, cur, con, host, port, dbname, user, mdp)
create_travaux(self, schema, cur, con, host, port, dbname, user, mdp)
create_vierge(self, schema, cur, con, host, port, dbname, user, mdp)
con.close()
pass
+19 -21
View File
@@ -4,47 +4,45 @@ 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 builtins import object
# import qgis
from qgis.PyQt.QtCore import QSettings
from qgis.PyQt.QtWidgets import QAction, QMenu, QDialog
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QDialog, QMessageBox
# from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtCore import *
from qgis.PyQt.QtGui import *
from qgis.PyQt import QtGui
from qgis.core import *
from qgis.core import QgsDataSourceUri
# from qgis.core import *
from qgis.core import QgsSettings
try:
from .tools.PythonSQL import login_base
except:
except ValueError:
print('Pas de fichier PythonSQL')
from .tools.SQLRequet import *
# from .tools.SQLRequet import *
from .tools.resources import (
load_ui,
resources_path,
send_issues,
# send_issues,
create_vierge,
create_contour,
create_travaux,
create_habita
)
from .issues import CenRa_Issues
# from .issues import CenRa_Issues
import os.path
import webbrowser, os
import psycopg2
import psycopg2.extras
import base64
# import os.path
# import webbrowser
# import psycopg2
# import psycopg2.extras
# import base64
from qgis.utils import iface
EDITOR_CLASS = load_ui('CenRa_PostgisTable_base.ui')
class Postgis_Editor(QDialog, EDITOR_CLASS):
class Postgis_Editor(QDialog, EDITOR_CLASS):
def __init__(self, parent=None):
_ = parent
super().__init__()
@@ -54,7 +52,7 @@ class Postgis_Editor(QDialog, EDITOR_CLASS):
self.setWindowIcon(QtGui.QIcon(resources_path('icons', 'icon.png')))
self.iface = iface
### Outil Ajout de nouvelles couche a un dossier
# Outil Ajout de nouvelles couche a un dossier
def raise_(self):
self.activateWindow()
account = login_base("account")
@@ -71,7 +69,6 @@ class Postgis_Editor(QDialog, EDITOR_CLASS):
where schemaname ~ E'^_(0|1|2|3|4|6|7|f)'
group by schemaname
order by schemaname)
select string_agg(schemaname,',')
from list_schema
group by "group";"""
@@ -86,7 +83,8 @@ class Postgis_Editor(QDialog, EDITOR_CLASS):
self.schema.clear()
self.schema.addItems(listItems)
self.schema.setCurrentIndex(-1) # Pour ne pas commencer la liste au premier schema
# Pour ne pas commencer la liste au premier schema
self.schema.setCurrentIndex(-1)
# show the dialog
self.show()
+24 -28
View File
@@ -2,43 +2,39 @@
from __future__ import absolute_import
# Import the PyQt and QGIS libraries
from builtins import next
# from builtins import next
from builtins import str
from builtins import object
import qgis
# 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 qgis.PyQt.QtWidgets import QDialog, QMessageBox, QDialogButtonBox
# from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtCore import *
from qgis.PyQt.QtGui import *
# from qgis.PyQt.QtCore import *
# from qgis.PyQt.QtGui import *
from qgis.PyQt import QtGui
from qgis.core import *
from qgis.core import QgsDataSourceUri
# from qgis.core import *
from qgis.core import QgsSettings, QgsDataSourceUri, QgsProject
try:
from .tools.PythonSQL import login_base
except:
except ValueError:
print('Pas de fichier PythonSQL')
from .tools.SQLRequet import *
# from .tools.SQLRequet import *
from .tools.resources import (
load_ui,
resources_path,
send_issues,
create_vierge,
create_contour,
create_travaux,
create_habita
# send_issues,
)
from .issues import CenRa_Issues
# from .issues import CenRa_Issues
import os.path
import webbrowser, os
import psycopg2
import psycopg2.extras
import base64
# import os.path
# import webbrowser
# import psycopg2
# import psycopg2.extras
# import base64
from qgis.utils import iface
EDITOR_CLASS = load_ui('CenRa_PostgisRename_base.ui')
@@ -52,10 +48,11 @@ try:
dbname = account[4]
cur = account[7]
con = account[8]
except:
except ValueError:
print('')
class Postgis_Rename(QDialog, EDITOR_CLASS):
class Postgis_Rename(QDialog, EDITOR_CLASS):
def __init__(self, parent=None):
_ = parent
super().__init__()
@@ -67,7 +64,8 @@ class Postgis_Rename(QDialog, EDITOR_CLASS):
self.schema.currentIndexChanged.connect(self.Test)
self.buttonBox.accepted.connect(self.msgBox)
### Outil Ajout de nouvelles couche a un dossier
# Outil Ajout de nouvelles couche a un dossier
def raise_(self):
self.activateWindow()
self.groupBox_3.hide()
@@ -188,12 +186,10 @@ class Postgis_Rename(QDialog, EDITOR_CLASS):
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 = []
@@ -210,7 +206,7 @@ class Postgis_Rename(QDialog, EDITOR_CLASS):
host = QgsDataSourceUri(provider.dataSourceUri()).host()
port = QgsDataSourceUri(provider.dataSourceUri()).port()
### Affichage de la table
# Affichage de la table
uri = QgsDataSourceUri()
# set host name, port, database name, username and password
uri.setConnection(host, port, dbname, user, mdp)
+55 -39
View File
@@ -3,13 +3,13 @@
import configparser
import shutil
import tempfile
import base64
import psycopg2
import psycopg2.extras
# import base64
# import psycopg2
# import psycopg2.extras
import os
from os.path import abspath, join, pardir, dirname
from qgis.core import QgsDataSourceUri
from .SQLRequet import *
from .SQLRequet import geom, champ_contour, champ_travaux_prevus_multilinestring, champ_travaux_prevus_point, champ_travaux_prevus_multipolygon, champ_vegethab_multipolygon, champ_vegethab_multilinestring, champ_vegethab_point, champ_viergeLigne, champ_viergePoint, champ_viergePolygone
from qgis.PyQt import uic
__copyright__ = "Copyright 2019, 3Liz"
@@ -109,46 +109,51 @@ def load_ui(*args):
return ui_class
def pyperclip():
dst = dirname(dirname(__file__)) + "\\tools\\"
if os.access('N:/', os.R_OK):
src = 'N:/SI_Systeme d information/Z_QGIS/PLUGIN/PythonSQL.py'
try:
shutil.copy(src, dst)
except:
except FileNotFoundError:
print('404')
except UnboundLocalError:
print('404')
def send_issues(url, titre, body, labels):
import requests
import urllib.request
import json
import os
import qgis
# import os
# import qgis
usr = os.environ['USERNAME']
# usr = os.environ['USERNAME']
token = '9d0a4e0bea561710e0728f161f7edf4e5201e112'
url = url + '?token=' + token
headers = {'Authorization': 'token ' + token, 'accept': 'application/json', 'Content-Type': 'application/json'}
payload = {'title': titre, 'body': body, 'labels': labels}
try:
urllib.request.urlopen('https://google.com')
binar = True
except:
except ValueError:
binar = False
r = ''
if binar:
r = requests.post(url, data=json.dumps(payload), headers=headers)
return r
def maj_verif(NAME):
import qgis
import urllib.request
iface = qgis.utils.iface
from qgis.core import Qgis
url = qgis.utils.pluginMetadata(NAME,'repository')
# url = qgis.utils.pluginMetadata(NAME, 'repository')
# URL = url+'/raw/branch/main/plugins.xml'
URL = 'https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/plugins.xml'
# print(URL)
@@ -157,7 +162,7 @@ def maj_verif(NAME):
try:
urllib.request.urlopen('https://google.com')
binar = True
except:
except urllib.error.URLError:
binar = False
if binar:
try:
@@ -167,20 +172,23 @@ def maj_verif(NAME):
version_plugin = version_web[valeur_version_web:valeur_version_web + len_version]
if version_plugin != version:
iface.messageBar().pushMessage("MAJ :", "Des mise à jour de plugin sont disponibles.", level=Qgis.Info, duration=30)
except:
except urllib.error.URLError:
print("error gitea version ssl")
else:
iface.messageBar().pushMessage("WiFi :", "Pas de connection à internet.", level=Qgis.Warning, duration=30)
def devlog(NAME):
import qgis
devmaj = '<head><style>* {margin:0; padding:0; }</style></head>'
devmaj = devmaj + qgis.utils.pluginMetadata(NAME, 'changelog')
return devmaj
def create_contour(self, schema, cur, con, host, port, dbname, user, mdp):
### Creation de la table contour
if self.couche_contour.isChecked(): # Verifie si la checkbox est cochee
# Creation de la table contour
# Verifie si la checkbox est cochee
if self.couche_contour.isChecked():
if self.annee_1.text() == 'aaaa' or self.annee_1.text() == '':
tablename = schema + "_contour"
else:
@@ -211,21 +219,24 @@ def create_contour(self,schema,cur,con,host ,port ,dbname ,user ,mdp):
cur.execute(SQL_trigger_area_ha)
cur.execute(SQL_trigger_date_creation)
cur.execute(SQL_trigger_date_maj)
cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles
# Enregistrement du style (comme style par defaut) dans la table layer_styles
cur.execute(SQL_style)
cur.execute(SQL_GRANT_TABLE)
con.commit()
## Affichage de la table
# 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")
self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
def create_travaux(self, schema, cur, con, host, port, dbname, user, mdp):
### Creation de la table travaux prevus
# Creation de la table travaux prevus
if self.couche_travaux_prevus.isChecked():
# **********Poly
if self.annee_5.text() == 'aaaa' or self.annee_5.text() == '':
@@ -241,7 +252,6 @@ def create_travaux(self,schema,cur,con,host,port,dbname,user,mdp):
cur.execute(RETURNE)
sequence_name = cur.fetchone()[0]
SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename[len(schema):] + "_pkey" + " PRIMARY KEY (gid)"
SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();"
SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();"
@@ -259,19 +269,20 @@ def create_travaux(self,schema,cur,con,host,port,dbname,user,mdp):
cur.execute(SQL_trigger_date_maj)
cur.execute(SQL_trigger_area_m2)
cur.execute(SQL_trigger_area_ha)
cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles
# Enregistrement du style (comme style par defaut) dans la table layer_styles
cur.execute(SQL_style)
cur.execute(SQL_GRANT_TABLE)
con.commit()
## Affichage de la table
# 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")
self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
# **********ligne
if self.annee_5.text() == 'aaaa' or self.annee_5.text() == '':
@@ -304,19 +315,20 @@ def create_travaux(self,schema,cur,con,host,port,dbname,user,mdp):
cur.execute(SQL_trigger_date_maj)
cur.execute(SQL_trigger_length_m)
cur.execute(SQL_trigger_length_km)
cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles
# Enregistrement du style (comme style par defaut) dans la table layer_styles
cur.execute(SQL_style)
cur.execute(SQL_GRANT_TABLE)
con.commit()
## Affichage de la table
# 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")
self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
# **********point
if self.annee_5.text() == 'aaaa' or self.annee_5.text() == '':
@@ -347,22 +359,24 @@ def create_travaux(self,schema,cur,con,host,port,dbname,user,mdp):
cur.execute(SQL_trigger_date_creation)
cur.execute(SQL_trigger_date_maj)
cur.execute(SQL_trigger_coordonnees)
cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles
# Enregistrement du style (comme style par defaut) dans la table layer_styles
cur.execute(SQL_style)
cur.execute(SQL_GRANT_TABLE)
con.commit()
## Affichage de la table
# 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")
self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
def create_habita(self, schema, cur, con, host, port, dbname, user, mdp):
### Creation de la table habitat
# Creation de la table habitat
if self.couche_habitat.isChecked():
if self.annee_2.text() == 'aaaa' or self.annee_2.text() == '':
tablename = schema + "_habitat"
@@ -395,14 +409,14 @@ def create_habita(self,schema,cur,con,host ,port ,dbname ,user ,mdp):
cur.execute(SQL_GRANT_TABLE)
con.commit()
### Affichage de la table
# 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_1, geom)
layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
tablename_2 = tablename + "_lignes"
RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename_2 + "','gid')"
@@ -429,14 +443,14 @@ def create_habita(self,schema,cur,con,host ,port ,dbname ,user ,mdp):
cur.execute(SQL_GRANT_TABLE)
con.commit()
### Affichage de la table
# 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_2, geom)
layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
tablename_3 = tablename + "_polygones"
RETURNE = "SELECT pg_get_serial_sequence('" + schema + "." + tablename_3 + "','gid')"
@@ -463,16 +477,18 @@ def create_habita(self,schema,cur,con,host ,port ,dbname ,user ,mdp):
cur.execute(SQL_GRANT_TABLE)
con.commit()
### Affichage de la table
# 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_3, geom)
layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
def create_vierge(self, schema, cur, con, host, port, dbname, user, mdp):
### Creation de la table vierge
# Creation de la table vierge
if self.couche_vierge.isChecked():
if self.annee_4.text() == 'aaaa' or self.annee_4.text() == '':
tablename = schema + "_" + self.nom_couche_vierge.text().lower()
@@ -521,11 +537,11 @@ def create_vierge(self,schema,cur,con,host ,port ,dbname ,user ,mdp):
con.commit()
### Affichage de la table
# 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")
self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres")
+3 -3
View File
@@ -50,9 +50,9 @@
<tags>cenra,sicen</tags>
</pyqgis_plugin>
<pyqgis_plugin name="CenRa_FLUX" version="3.4">
<pyqgis_plugin name="CenRa_FLUX" version="3.5">
<description>Depot pour les extensiont QGIS du CEN Rhone-Alpes, sur GitHub.</description>
<version>3.4</version>
<version>3.5</version>
<qgis_minimum_version>3.16</qgis_minimum_version>
<homepage>https://plateformesig.cenra-outils.org/</homepage>
<file_name>CenRa_FLUX.zip</file_name>
@@ -61,7 +61,7 @@
<download_url>https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/CenRa_FLUX.zip</download_url>
<uploaded_by>CEN-Rhone-Alpes</uploaded_by>
<create_date>2024-02-06</create_date>
<update_date>2025-07-23</update_date>
<update_date>2025-07-29</update_date>
<experimental>False</experimental>
<deprecated>False</deprecated>
<tags>cenra,flux</tags>