This commit is contained in:
Tom LAVEILLE 2025-07-28 16:23:25 +02:00
parent 94cac31fbb
commit 1cd816c706
7 changed files with 225 additions and 455 deletions

View File

@ -4,28 +4,25 @@ __email__ = "info@3liz.org"
from qgis.core import QgsApplication from qgis.core import QgsApplication
from qgis.PyQt.QtCore import QCoreApplication, Qt, QTranslator, QUrl from qgis.PyQt.QtCore import QUrl, QSettings
from qgis.PyQt.QtGui import QDesktopServices, QIcon 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 from qgis.utils import iface
import qgis import qgis
# include <QSettings> # include <QSettings>
import socket
import os import os
from .tools.resources import ( from .tools.resources import (
plugin_path,
pyperclip, pyperclip,
resources_path, resources_path,
maj_verif, maj_verif,
) )
pyperclip() pyperclip()
from .flux_editor import Flux_Editor from .flux_editor import Flux_Editor
from .about_form import AboutDialog from .about_form import AboutDialog
from qgis.PyQt.QtCore import *
class PgFlux: class PgFlux:
def __init__(self): def __init__(self):
@ -65,8 +62,6 @@ class PgFlux:
self.help_action.triggered.connect(self.open_help) self.help_action.triggered.connect(self.open_help)
if not self.action_editor: if not self.action_editor:
self.action_editor = Flux_Editor() self.action_editor = Flux_Editor()
self.flux_editor = QAction(icon, 'SigCEN', None) self.flux_editor = QAction(icon, 'SigCEN', None)
self.toolBar.addAction(self.flux_editor) self.toolBar.addAction(self.flux_editor)
self.flux_editor.triggered.connect(self.open_editor) self.flux_editor.triggered.connect(self.open_editor)
@ -80,6 +75,7 @@ class PgFlux:
""" """
dialog = AboutDialog(iface) dialog = AboutDialog(iface)
dialog.exec() dialog.exec()
def open_help(): def open_help():
""" Open the online help. """ """ Open the online help. """
QDesktopServices.openUrl(QUrl('https://plateformesig.cenra-outils.org/')) QDesktopServices.openUrl(QUrl('https://plateformesig.cenra-outils.org/'))
@ -93,7 +89,6 @@ class PgFlux:
if self.action_editor: if self.action_editor:
iface.removePluginMenu('CenRa_Flux', self.flux_editor) iface.removePluginMenu('CenRa_Flux', self.flux_editor)
if self.provider: if self.provider:
QgsApplication.processingRegistry().removeProvider(self.provider) QgsApplication.processingRegistry().removeProvider(self.provider)
del self.provider del self.provider

View File

@ -3,7 +3,7 @@ import os.path
from pathlib import Path from pathlib import Path
from qgis.PyQt import uic from qgis.PyQt import uic
from qgis.PyQt.QtGui import QPixmap # from qgis.PyQt.QtGui import QPixmap
from qgis.PyQt.QtWidgets import QDialog from qgis.PyQt.QtWidgets import QDialog
from .tools.resources import devlog from .tools.resources import devlog

View File

@ -2,59 +2,55 @@
from __future__ import absolute_import from __future__ import absolute_import
# Import the PyQt and QGIS libraries # Import the PyQt and QGIS libraries
from builtins import next # from builtins import next
from builtins import str from builtins import str
from builtins import object # from builtins import object
import qgis
from qgis.PyQt import QtCore from qgis.PyQt import QtCore, QtGui
from qgis.PyQt.QtCore import QSettings from qgis.PyQt.QtCore import QSettings
from qgis.PyQt import QtWidgets from qgis.PyQt import QtWidgets
from qgis.PyQt.QtWidgets import QAction, QMenu, QDialog # from qgis.PyQt.QtWidgets import QDialog
from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtGui import QIcon
try:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import QtGui
except:
from PyQt6.QtCore import *
from PyQt6.QtGui import *
from PyQt6 import QtGui
from qgis.core import * # from qgis.PyQt.QtCore import *
from qgis.core import QgsDataSourceUri
# from qgis.core import QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsProject, QgsSettings
from qgis.core import QgsDataSourceUri, QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsProject, QgsSettings, QgsApplication, QgsVectorLayer, QgsRasterLayer, QgsWkbTypes
from qgis.PyQt.QtWidgets import ( from qgis.PyQt.QtWidgets import (
QDialog, QDialog,
QAction, # QAction,
QDockWidget, # QDockWidget,
QFileDialog, # QFileDialog,
QInputDialog, # QInputDialog,
QMenu, # QMenu,
QToolButton, # QToolButton,
QTableWidget, # QTableWidget,
QTableWidgetItem, QTableWidgetItem,
QMessageBox, QMessageBox,
QVBoxLayout, QVBoxLayout,
) )
from .tools.SQLRequet import * from .tools.SQLRequet import schemaname_list, schemaname_list_ref, schemaname_distinct
from .tools.resources import ( from .tools.resources import (
load_ui, load_ui,
resources_path, resources_path,
send_issues, # send_issues,
) )
try: try:
from .tools.PythonSQL import login_base from .tools.PythonSQL import login_base
except: except NameError:
print('Pas de fichier PythonSQL') print('Pas de fichier PythonSQL')
from .issues import CenRa_Issues
from ast import literal_eval # from .issues import CenRa_Issues
# from ast import literal_eval
from qgis.utils import iface from qgis.utils import iface
import os.path # import os.path
import webbrowser, os # import os
# import webbrowser
import psycopg2 import psycopg2
import psycopg2.extras import psycopg2.extras
import base64 # import base64
global DeBUG global DeBUG
DeBUG = 0 DeBUG = 0
@ -79,125 +75,17 @@ try:
sigdb = account[5] sigdb = account[5]
refdb = account[6] refdb = account[6]
except: except NameError:
print('Fails to login DB for account') print('Fails to login DB for account')
EDITOR_CLASS = load_ui('CenRa_Flux_base.ui') EDITOR_CLASS = load_ui('CenRa_Flux_base.ui')
html = '''<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
crossorigin=""></script>
<style>
body { padding: 0; margin: 0; }
html, body, #map { height: 100%; }
.leaflet-control-layers-toggle {
background-image: url(https://intranet.cenra-outils.org/Intranet/css/images/layers.png);
}
.legend_parc {
border-radius: 15px;
box-shadow: 2px 2px 3px 0 #6a6a6a;
background-color: #fefafab3;
opacity:0;
}
.legend_parc:hover{
opacity:1;
}
.popup-with-no-events {
pointer-events: none;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="map.js"></script>
</body>
</html>
<script>'''
font = '''var OrthoIGN = L.tileLayer('https://wmts.geopf.fr/wmts?'+
'&LAYER={ignLayer}&STYLE={style}&TILEMATRIXSET=PM'+
'&SERVICE={service}&REQUEST=GetTile&VERSION=1.0.0'+
'&FORMAT={format}&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}',
{
ignLayer: 'ORTHOIMAGERY.ORTHOPHOTOS',
style: 'normal',
service: 'WMTS',
format: 'image/jpeg',
minZoom: 0,
maxZoom: 19,
attribution: '&copy; IGN'
}).addTo(map);
// Plan IGN avec une transparence de 50%
var PlanIGN = L.tileLayer('https://wmts.geopf.fr/wmts?'+
'&LAYER={ignLayer}&STYLE={style}&TILEMATRIXSET=PM'+
'&SERVICE={service}&REQUEST=GetTile&VERSION=1.0.0'+
'&FORMAT={format}&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}',
{
ignLayer: 'GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2',
style: 'normal',
service: 'WMTS',
format: 'image/png',
minZoom: 0,
maxZoom: 19,
attribution: '&copy; IGN'
});
var baseMaps = {
// "BDORTHO2" : bdortho,
// "Openstreetmap": openStreetMap,
// "Opentopomap": openTopoMap,
"BDORTHO" : OrthoIGN,
"PlanIGN": PlanIGN
};
var overlayMaps = {
"Sites": Sites,
//"Parcelle":JSON
};
L.control.layers(baseMaps,overlayMaps).addTo(map);
var scale = L.control.scale({position: 'bottomleft', metric:true, imperial:false});
scale.addTo(map);
var legend = L.control({position: 'bottomleft'});
legend.onAdd = function (map) {
var div = L.DomUtil.create('div', 'info legend_parc'),
labels = [];
labels.push('<i style="background:#73004c;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Acquisition')
labels.push('<i style="background:#ff00c5;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Acquis en partie BND')
labels.push('<i style="background:#f0ade1ab;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Acquisition pour partie')
labels.push('<i style="background:#73462e;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Acquisition / Convention')
labels.push('<i style="background:#e69800;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Convention')
labels.push('<i style="background:#ffd37f;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Convention en partie BND')
labels.push('<i style="background:#ffebaf;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Convention pour partie')
labels.push('<i style="background:#c8c8c8;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Autre')
labels.push('<i style="background:#f9ff08;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Projet en cours')
labels.push('<i style="background:#fe0000;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Problème de mise à jour')
labels.push('<i style="background:#000;width:18px;height:18px;float:left;margin-right:8px;opacity: 0.7;"></i> Pas de maitrise')
div.innerHTML = labels.join('<br>');
return div;
};
legend.addTo(map);
</script>'''
targetCrs = QgsCoordinateReferenceSystem('EPSG:4326') targetCrs = QgsCoordinateReferenceSystem('EPSG:4326')
layerCrs = QgsCoordinateReferenceSystem('EPSG:2154') layerCrs = QgsCoordinateReferenceSystem('EPSG:2154')
TranformCRS = QgsCoordinateTransform(layerCrs, targetCrs, QgsProject.instance()) TranformCRS = QgsCoordinateTransform(layerCrs, targetCrs, QgsProject.instance())
class Flux_Editor(QDialog, EDITOR_CLASS):
class Flux_Editor(QDialog, EDITOR_CLASS):
def __init__(self, parent=None): def __init__(self, parent=None):
_ = parent _ = parent
super().__init__() super().__init__()
@ -211,7 +99,6 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
self.commandLinkButton.setIcon(QtGui.QIcon(resources_path('ui', 'arrow-bottom.png'))) self.commandLinkButton.setIcon(QtGui.QIcon(resources_path('ui', 'arrow-bottom.png')))
self.commandLinkButton_2.setIcon(QtGui.QIcon(resources_path('ui', 'arrow-up.png'))) self.commandLinkButton_2.setIcon(QtGui.QIcon(resources_path('ui', 'arrow-up.png')))
#self.tableWidget.setSelectionBehavior(QTableWidget.selectRow)
self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger(0)) self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger(0))
self.toolButton.setIcon(QtGui.QIcon(resources_path('ui', 'find.png'))) self.toolButton.setIcon(QtGui.QIcon(resources_path('ui', 'find.png')))
self.comboBox_2.addItem("SIG") self.comboBox_2.addItem("SIG")
@ -224,11 +111,11 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
self.tableWidget_2.itemDoubleClicked.connect(self.suppression_flux) self.tableWidget_2.itemDoubleClicked.connect(self.suppression_flux)
self.comboBox_2.currentIndexChanged.connect(self.bd_source) self.comboBox_2.currentIndexChanged.connect(self.bd_source)
self.checkBox.hide() self.checkBox.hide()
self.checkBox.stateChanged.connect(self.modeCarte) # self.checkBox.stateChanged.connect(self.modeCarte)
self.toolButton.clicked.connect(self.getCanevas) self.toolButton.clicked.connect(self.getCanevas)
layout = QVBoxLayout() layout = QVBoxLayout()
self.lineEdit.textChanged.connect(self.filtre_dynamique) self.lineEdit.textChanged.connect(self.filtre_dynamique)
self.viewer.textChanged.connect(self.NewTitle) # self.viewer.textChanged.connect(self.NewTitle)
layout.addWidget(self.lineEdit) layout.addWidget(self.lineEdit)
self.viewer.hide() self.viewer.hide()
self.DeBUG.addItem('') self.DeBUG.addItem('')
@ -237,14 +124,11 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
self.DeBUG.addItem('4269') self.DeBUG.addItem('4269')
self.DeBUG.hide() self.DeBUG.hide()
#self.lineEdit.mousePressEvent = self._mousePressEvent
#metadonnees_plugin = open(self.plugin_path + '/metadata.txt')
#infos_metadonnees = metadonnees_plugin.readlines()
def raise_(self): def raise_(self):
"""Run method that performs all the real work""" """Run method that performs all the real work"""
self.bd_source() self.bd_source()
def ModeDeBUG(self): def ModeDeBUG(self):
self.DeBUG.show() self.DeBUG.show()
@ -259,127 +143,13 @@ class Flux_Editor(QDialog, EDITOR_CLASS):
DeBUG = 0 DeBUG = 0
self.DeBUG.hide() self.DeBUG.hide()
"""
def NewTitle(self): def NewTitle(self):
if self.viewer.title() != '': if self.viewer.title() != '':
Tsplit = ((self.viewer.title()).split('.')) Tsplit = ((self.viewer.title()).split('.'))
print(Tsplit[0], Tsplit[1]) print(Tsplit[0], Tsplit[1])
self.openPostGIS(Tsplit[0], Tsplit[1]) self.openPostGIS(Tsplit[0], Tsplit[1])
"""
def modeCarte(self):
if self.checkBox.isChecked():
self.viewer.show()
cur.execute("SELECT ST_AsGeoJSON(st_centroid(ST_Transform(geom,4326))) FROM _agregation_ra._agreg_contour")
varcenter = literal_eval(cur.fetchall()[0][0])
varcenter = [varcenter['coordinates'][1],varcenter['coordinates'][0]]
cur.execute("SELECT ST_AsGeoJSON(ST_Transform(st_collect(geom),4326)),tschema,tname FROM _agregation_ra._agreg_contour WHERE geom IS NOT NULL GROUP BY tschema,tname;" )
varSite = cur.fetchall()
cur.execute("SELECT ST_AsGeoJSON(ST_Transform(st_collect(geom),4326)),tschema,tname FROM _agregation_ra._agreg_travaux_prevus_poly WHERE geom IS NOT NULL GROUP BY tschema,tname;")
varTravaux = cur.fetchall()
cur.execute("SELECT ST_AsGeoJSON(ST_Transform(geom,4326)),milieu_libelle ,lb_eu_01,tschema,tname FROM _agregation_ra._agreg_eu_habitat WHERE geom IS NOT NULL;")
varHabitat = cur.fetchall()
vargeomS = literal_eval(varSite[0][0])
vargeomT = literal_eval(varTravaux[0][0])
vargeomH = literal_eval(varHabitat[0][0])
#new_objectS = self.SwitchGeom(vargeomS)
#new_objectT = self.SwitchGeom(vargeomT)
#new_objectH = self.SwitchGeom(vargeomH)
script = 'var map = L.map("map").setView('+str(varcenter)+', 13);'
id = 0
varSiteJSON = '''var ParcelleJSON = {
"type": "FeatureCollection",
"features":['''
for varP in varSite:
id = id+1
varSiteJSON = varSiteJSON+'{"properties": {"code": "'+str(varP[1])+'.'+str(varP[2])+'" },'+str(varP[0][1:])+','
varSiteJSON = varSiteJSON[:-1]+''']};
var Sites = L.geoJSON(ParcelleJSON,{
style: function(feature) {
switch (feature.geometry.properties.code) {
case 'Ensemble de sites': return {fillColor: "#9a7863",color:"white",weight: 1,fillOpacity: 0.7};
case 'Sous-site conservatoire': return {fillColor: "#e69800",color:"white",weight: 1,fillOpacity: 0.7};
case 'Site non géré': return {fillColor: "#73004c",color:"white",weight: 1,fillOpacity: 0.7};
case 'Animation territoriale': return {fillColor: "#ffebaf",color:"white",weight: 1,fillOpacity: 0.7};
case 'Site conservatoire': return {fillColor: "#f9ff08",color:"white",weight: 1,fillOpacity: 0.7};
default: return {fillColor: "#c8c8c8",color:"white",weight: 1,fillOpacity: 0.7};
}
},
onEachFeature: function (feature,layer) {
layer.on('click', function(e) {
map.fitBounds(layer.getBounds());
document.title = feature.properties.code.toString();
});
layer.on('mouseover', function(e) {
layer.setStyle({
weight: 5,
color: '#fe0000',
dashArray: '',
});
});
//layer.on('mousemove', function(e) {
//layer.openPopup(e.latlng);
//});
layer.on('mouseout', function(e) {
layer.setStyle({
color:"white",
weight: 1,
});
});
layer.bindTooltip(feature.properties.code.toString(), {
sticky: true,
permanent: false,
direction: 'right',
className: 'label_parc'
});
}
}).addTo(map);'''
id = 0
varTravauxJSON = '''var TravauxJSON = {
"type": "FeatureCollection",
"features":['''
for varT in varTravaux:
id = id+1
varTravauxJSON = varTravauxJSON+'{"properties": {"code": "'+str(varT[1])+'.'+str(varT[2])+'" },'+str(varT[0][1:])+','
varTravauxJSON = varTravauxJSON[:-1]+''']};
var Travaux = L.geoJSON(TravauxJSON,{
onEachFeature: function (feature,layer) {
layer.on('click', function(e) {
map.fitBounds(layer.getBounds());
document.title = feature.properties.code.toString();
});
layer.on('mouseover', function(e) {
layer.setStyle({
weight: 5,
color: '#fe0000',
dashArray: '',
});
});
//layer.on('mousemove', function(e) {
//layer.openPopup(e.latlng);
//});
layer.on('mouseout', function(e) {
layer.setStyle({
color:"white",
weight: 1,
});
});
layer.bindTooltip(feature.properties.code.toString(), {
sticky: true,
permanent: false,
direction: 'right',
className: 'label_parc'
});
}
}).addTo(map);'''
script = script+varSiteJSON+varTravauxJSON
self.viewer.setHtml(html+script+font)
else:
self.viewer.hide()
def bd_source(self): def bd_source(self):
self.activateWindow() self.activateWindow()
@ -402,7 +172,7 @@ var Travaux = L.geoJSON(TravauxJSON,{
self.combobox_custom() self.combobox_custom()
# Create the dialog with elements (after translation) and keep reference # Create the dialog with elements (after translation) and keep reference
# Only create GUI ONCE in callback, so that it will only load when the plugin is started # Only create GUI ONCE in callback, so that it will only load when the plugin is started
if self.first_start == True: if self.first_start is True:
self.first_start = False self.first_start = False
# show the dialog # show the dialog
self.show() self.show()
@ -426,7 +196,7 @@ var Travaux = L.geoJSON(TravauxJSON,{
self.combobox_custom() self.combobox_custom()
# Create the dialog with elements (after translation) and keep reference # Create the dialog with elements (after translation) and keep reference
# Only create GUI ONCE in callback, so that it will only load when the plugin is started # Only create GUI ONCE in callback, so that it will only load when the plugin is started
if self.first_start == True: if self.first_start is True:
self.first_start = False self.first_start = False
# show the dialog # show the dialog
self.show() self.show()
@ -441,9 +211,6 @@ var Travaux = L.geoJSON(TravauxJSON,{
def suppression_flux(self): def suppression_flux(self):
self.tableWidget_2.removeRow(self.tableWidget_2.currentRow()) self.tableWidget_2.removeRow(self.tableWidget_2.currentRow())
def open_url(self, item):
url = item.data(Qt.UserRole)
def initialisation_flux(self): def initialisation_flux(self):
if dbtype == sigdb: if dbtype == sigdb:
# self.toolButton.setEnabled(1) # self.toolButton.setEnabled(1)
@ -454,7 +221,7 @@ var Travaux = L.geoJSON(TravauxJSON,{
where schemaname like '""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) UNION (SELECT schemaname,matviewname AS tablename FROM pg_catalog.pg_matviews where schemaname like '""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) order by schemaname,tablename;""" where schemaname like '""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) UNION (SELECT schemaname,matviewname AS tablename FROM pg_catalog.pg_matviews where schemaname like '""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) order by schemaname,tablename;"""
else: else:
custom_list = """(SELECT schemaname,tablename from pg_catalog.pg_tables custom_list = """(SELECT schemaname,tablename from pg_catalog.pg_tables
where schemaname like '\_"""+ str(self.comboBox.currentText()) +"""%' order by schemaname,tablename) UNION (SELECT schemaname,matviewname AS tablename FROM pg_catalog.pg_matviews where schemaname like '\_"""+ str(self.comboBox.currentText()) +"""%' order by schemaname,tablename) order by schemaname,tablename;""" where schemaname like '\\_""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) UNION (SELECT schemaname,matviewname AS tablename FROM pg_catalog.pg_matviews where schemaname like '\\_""" + str(self.comboBox.currentText()) + """%' order by schemaname,tablename) order by schemaname,tablename;"""
else: else:
if self.comboBox.currentText() == 'toutes les catégories': if self.comboBox.currentText() == 'toutes les catégories':
custom_list = schemaname_list_ref custom_list = schemaname_list_ref
@ -549,15 +316,12 @@ var Travaux = L.geoJSON(TravauxJSON,{
self.tableWidget_2.setColumnWidth(2, 300) self.tableWidget_2.setColumnWidth(2, 300)
self.tableWidget_2.setColumnWidth(3, 300) self.tableWidget_2.setColumnWidth(3, 300)
def item_already_exists(self, new_item_text): def item_already_exists(self, new_item_text):
# Assuming you want to compare items in the first column for uniqueness # Assuming you want to compare items in the first column for uniqueness
existing_items = self.tableWidget_2.findItems(new_item_text, QtCore.Qt.MatchFlag(0)) existing_items = self.tableWidget_2.findItems(new_item_text, QtCore.Qt.MatchFlag(0))
# Check if there are any existing items with the same text in the first column # Check if there are any existing items with the same text in the first column
return len(existing_items) > 0 return len(existing_items) > 0
def limite_flux(self): def limite_flux(self):
if self.tableWidget_2.rowCount() > 5: if self.tableWidget_2.rowCount() > 5:
@ -573,11 +337,13 @@ var Travaux = L.geoJSON(TravauxJSON,{
if self.tableWidget_2.rowCount() <= 5: if self.tableWidget_2.rowCount() <= 5:
self.chargement_flux() self.chargement_flux()
"""
def openPostGIS(self, schema, table): def openPostGIS(self, schema, table):
uri = QgsDataSourceUri() uri = QgsDataSourceUri()
uri.setConnection(host, port, sigdb, user, mdp) uri.setConnection(host, port, sigdb, user, mdp)
if (schema+'.'+table) in RasterList: if (schema + '.' + table) in LRasterList:
uri.setDataSource(schema, table, "rast") uri.setDataSource(schema, table, "rast")
uri.setKeyColumn('rid') uri.setKeyColumn('rid')
uri.setSrid('2154') uri.setSrid('2154')
@ -589,11 +355,11 @@ var Travaux = L.geoJSON(TravauxJSON,{
layer = QgsVectorLayer(uri.uri(), table, "postgres") layer = QgsVectorLayer(uri.uri(), table, "postgres")
# Ajout de la couche au canevas QGIS # Ajout de la couche au canevas QGIS
QgsProject.instance().addMapLayer(layer) QgsProject.instance().addMapLayer(layer)
"""
def chargement_flux(self): def chargement_flux(self):
managerAU = QgsApplication.authManager() managerAU = QgsApplication.authManager()
k = managerAU.availableAuthMethodConfigs().keys() managerAU.availableAuthMethodConfigs().keys()
def REQUEST(type): def REQUEST(type):
switcher = { switcher = {
@ -605,10 +371,8 @@ var Travaux = L.geoJSON(TravauxJSON,{
} }
return switcher.get(type, "nothing") return switcher.get(type, "nothing")
# def displayOnWindows(type, uri, name):
# p = []
def displayOnWindows(type, uri, name):
p = []
SQLraster = """SELECT concat(r_table_schema,'.',r_table_name) from public.raster_columns; """ SQLraster = """SELECT concat(r_table_schema,'.',r_table_name) from public.raster_columns; """
cur.execute(SQLraster) cur.execute(SQLraster)
@ -619,8 +383,8 @@ var Travaux = L.geoJSON(TravauxJSON,{
for row in range(0, self.tableWidget_2.rowCount()): for row in range(0, self.tableWidget_2.rowCount()):
color_rgba = 855030089 color_rgba = 855030089
if self.tableWidget_2.item(row, 1).background().color().rgba() != 855030089: if self.tableWidget_2.item(row, 1).background().color().rgba() != color_rgba:
## supression de la partie de l'url après le point d'interrogation # supression de la partie de l'url après le point d'interrogation
if dbtype == sigdb: if dbtype == sigdb:
code = self.tableWidget_2.item(row, 1).text() code = self.tableWidget_2.item(row, 1).text()
schema = '_' + code + '_' + self.tableWidget_2.item(row, 2).text() schema = '_' + code + '_' + self.tableWidget_2.item(row, 2).text()
@ -633,7 +397,8 @@ var Travaux = L.geoJSON(TravauxJSON,{
elif dbtype == refdb: elif dbtype == refdb:
# code = self.tableWidget_2.item(row,1).text() # code = self.tableWidget_2.item(row,1).text()
schema = self.tableWidget_2.item(row, 2).text() schema = self.tableWidget_2.item(row, 2).text()
table = self.tableWidget_2.item(row,3).text()#.split("?", 1)[0] table = self.tableWidget_2.item(row, 3).text()
# .split("?", 1)[0]
uri = QgsDataSourceUri() uri = QgsDataSourceUri()
uri.setConnection(host, port, dbtype, user, mdp) uri.setConnection(host, port, dbtype, user, mdp)
@ -666,7 +431,7 @@ var Travaux = L.geoJSON(TravauxJSON,{
uri.setWkbType(QgsWkbTypes.LineString) uri.setWkbType(QgsWkbTypes.LineString)
elif typegeom[0] == 'MultiPoint': elif typegeom[0] == 'MultiPoint':
uri.setWkbType(QgsWkbTypes.MultiPoint) uri.setWkbType(QgsWkbTypes.MultiPoint)
if (typegeom[0] != None and typegeom[0] != 'Polygon'): if (typegeom[0] is not None and typegeom[0] != 'Polygon'):
uri.setSrid('2154') uri.setSrid('2154')
layer = QgsVectorLayer(uri.uri(), table, "postgres") layer = QgsVectorLayer(uri.uri(), table, "postgres")
# Ajout de la couche au canevas QGIS # Ajout de la couche au canevas QGIS
@ -677,6 +442,7 @@ var Travaux = L.geoJSON(TravauxJSON,{
QgsProject.instance().addMapLayer(layer) QgsProject.instance().addMapLayer(layer)
else: else:
self.QMBquestion = QMessageBox.question(iface.mainWindow(), u"Attention !", "La couche «" + str(self.tableWidget_2.item(row, 1).text()) + ' ' + str(self.tableWidget_2.item(row, 2).text()) + "» ne ce trouve pas dans cette BD !", QMessageBox.StandardButton(0x00004000)) self.QMBquestion = QMessageBox.question(iface.mainWindow(), u"Attention !", "La couche «" + str(self.tableWidget_2.item(row, 1).text()) + ' ' + str(self.tableWidget_2.item(row, 2).text()) + "» ne ce trouve pas dans cette BD !", QMessageBox.StandardButton(0x00004000))
def combobox_custom(self): def combobox_custom(self):
if dbtype == sigdb: if dbtype == sigdb:
self.toolButton.setEnabled(1) self.toolButton.setEnabled(1)
@ -777,7 +543,6 @@ var Travaux = L.geoJSON(TravauxJSON,{
new_object = new_object[:-1] + ']' new_object = new_object[:-1] + ']'
return (new_object) return (new_object)
def popup(self): # def popup(self):
# self.dialog = Popup() # +++ - self
self.dialog = Popup() # +++ - self # self.dialog.text_edit.show()
self.dialog.text_edit.show()

View File

@ -1,9 +1,4 @@
import os import os
plugin_dir = os.path.dirname(__file__)
end_find = plugin_dir.rfind('\\')+1
NAME = plugin_dir[end_find:]
from qgis.gui import * from qgis.gui import *
from qgis.core import ( from qgis.core import (
@ -34,14 +29,18 @@ from qgis.utils import iface
from .tools.resources import ( from .tools.resources import (
load_ui, load_ui,
resources_path, # resources_path,
send_issues, send_issues,
) )
plugin_dir = os.path.dirname(__file__)
end_find = plugin_dir.rfind('\\') + 1
NAME = plugin_dir[end_find:]
EDITOR_CLASS = load_ui('CenRa_IssuesSend.ui') EDITOR_CLASS = load_ui('CenRa_IssuesSend.ui')
class CenRa_Issues(QDialog, EDITOR_CLASS):
class CenRa_Issues(QDialog, EDITOR_CLASS):
def __init__(self, parent=None): def __init__(self, parent=None):
_ = parent _ = parent
super().__init__() super().__init__()
@ -62,11 +61,16 @@ class CenRa_Issues(QDialog, EDITOR_CLASS):
statu_autre = self.check_autre.isChecked() statu_autre = self.check_autre.isChecked()
statu = [] statu = []
if statu_bug == True : statu = statu + [1] if statu_bug is True:
if statu_aide == True : statu = statu + [3] statu = statu + [1]
if statu_question == True : statu = statu + [5] if statu_aide is True:
if statu_amelioration == True : statu = statu + [2] statu = statu + [3]
if statu_autre == True : statu = statu + [6] if statu_question is True:
statu = statu + [5]
if statu_amelioration is True:
statu = statu + [2]
if statu_autre is True:
statu = statu + [6]
if len(statu) >= 1: if len(statu) >= 1:
import qgis import qgis

View File

@ -1,5 +1,6 @@
from qgis.core import QgsApplication from qgis.core import QgsApplication
def gitea(): def gitea():
file_url = QgsApplication.qgisSettingsDirPath() + 'QGIS/QGIS3.ini' file_url = QgsApplication.qgisSettingsDirPath() + 'QGIS/QGIS3.ini'
recherche_1 = 'plugin_repositories\\github\\url=https://github.com/CEN-Rhone-Alpes/Plugin_QGIS/releases/latest/download/plugins.xml' recherche_1 = 'plugin_repositories\\github\\url=https://github.com/CEN-Rhone-Alpes/Plugin_QGIS/releases/latest/download/plugins.xml'

View File

@ -6,7 +6,7 @@ schemaname_list_ref="""SELECT schemaname,tablename from pg_catalog.pg_tables
WHERE schemaname NOT LIKE '_archives' AND schemaname NOT LIKE 'topology' AND schemaname NOT LIKE 'information_schema' AND schemaname NOT LIKE 'pg_catalog' and schemaname NOT LIKE 'public' AND schemaname NOT LIKE '_trier' WHERE schemaname NOT LIKE '_archives' AND schemaname NOT LIKE 'topology' AND schemaname NOT LIKE 'information_schema' AND schemaname NOT LIKE 'pg_catalog' and schemaname NOT LIKE 'public' AND schemaname NOT LIKE '_trier'
order by schemaname,tablename;""" order by schemaname,tablename;"""
schemaname_list = """(SELECT schemaname,tablename from pg_catalog.pg_tables schemaname_list = """(SELECT schemaname,tablename from pg_catalog.pg_tables
where schemaname like 'trav%' or schemaname like '\_ag%' or schemaname like '\_00%' or schemaname like '\_01%' or schemaname like '\_07%' or schemaname like '\_26%' or schemaname like '\_form%' or schemaname like '\_42%' or schemaname like '\_69%' order by schemaname,tablename) where schemaname like 'trav%' or schemaname like '\\_ag%' or schemaname like '\\_00%' or schemaname like '\\_01%' or schemaname like '\\_07%' or schemaname like '\\_26%' or schemaname like '\\_form%' or schemaname like '\\_42%' or schemaname like '\\_69%' order by schemaname,tablename)
UNION UNION
(SELECT schemaname,matviewname AS tablename FROM pg_catalog.pg_matviews order by schemaname,tablename) order by schemaname,tablename;""" (SELECT schemaname,matviewname AS tablename FROM pg_catalog.pg_matviews order by schemaname,tablename) order by schemaname,tablename;"""
geom = "geom" geom = "geom"

View File

@ -77,15 +77,17 @@ def plugin_test_data_path(*args, copy=False):
else: else:
return path return path
def pyperclip(): def pyperclip():
dst = dirname(dirname(__file__)) + "\\tools\\" dst = dirname(dirname(__file__)) + "\\tools\\"
if os.access('N:/', os.R_OK): if os.access('N:/', os.R_OK):
src = 'N:/SI_Systeme d information/Z_QGIS/PLUGIN/PythonSQL.py' src = 'N:/SI_Systeme d information/Z_QGIS/PLUGIN/PythonSQL.py'
try: try:
shutil.copy(src, dst) shutil.copy(src, dst)
except: except NameError:
print('404') print('404')
def resources_path(*args): def resources_path(*args):
"""Get the path to our resources folder. """Get the path to our resources folder.
@ -112,37 +114,39 @@ def load_ui(*args):
ui_class, _ = uic.loadUiType(resources_path("ui", *args)) ui_class, _ = uic.loadUiType(resources_path("ui", *args))
return ui_class return ui_class
def send_issues(url, titre, body, labels): def send_issues(url, titre, body, labels):
import requests import requests
import json import json
import os # import os
import qgis # import qgis
usr = os.environ['USERNAME'] # usr = os.environ['USERNAME']
token = '9d0a4e0bea561710e0728f161f7edf4e5201e112' token = '9d0a4e0bea561710e0728f161f7edf4e5201e112'
url = url + '?token=' + token url = url + '?token=' + token
headers = {'Authorization': 'token ' + token, 'accept': 'application/json', 'Content-Type': 'application/json'} headers = {'Authorization': 'token ' + token, 'accept': 'application/json', 'Content-Type': 'application/json'}
payload = {'title': titre, 'body': body, 'labels': labels} payload = {'title': titre, 'body': body, 'labels': labels}
try: try:
urllib.request.urlopen('https://google.com') urllib.request.urlopen('https://google.com')
binar = True binar = True
except: except NameError:
binar = False binar = False
r = '' r = ''
if binar: if binar:
r = requests.post(url, data=json.dumps(payload), headers=headers) r = requests.post(url, data=json.dumps(payload), headers=headers)
return r return r
def maj_verif(NAME): def maj_verif(NAME):
import qgis import qgis
import urllib.request import urllib.request
iface = qgis.utils.iface iface = qgis.utils.iface
from qgis.core import Qgis 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 = url+'/raw/branch/main/plugins.xml'
URL = 'https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/plugins.xml' URL = 'https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/latest/plugins.xml'
# print(URL) # print(URL)
@ -151,7 +155,7 @@ def maj_verif(NAME):
try: try:
urllib.request.urlopen('https://google.com') urllib.request.urlopen('https://google.com')
binar = True binar = True
except: except NameError:
binar = False binar = False
if binar: if binar:
try: try:
@ -161,11 +165,12 @@ def maj_verif(NAME):
version_plugin = version_web[valeur_version_web: valeur_version_web + len_version] version_plugin = version_web[valeur_version_web: valeur_version_web + len_version]
if version_plugin != version: if version_plugin != version:
iface.messageBar().pushMessage("MAJ :", "Des mise à jour de plugin sont disponibles.", level=Qgis.Info, duration=30) iface.messageBar().pushMessage("MAJ :", "Des mise à jour de plugin sont disponibles.", level=Qgis.Info, duration=30)
except: except NameError:
print("error gitea version ssl") print("error gitea version ssl")
else: else:
iface.messageBar().pushMessage("WiFi :", "Pas de connection à internet.", level=Qgis.Warning, duration=30) iface.messageBar().pushMessage("WiFi :", "Pas de connection à internet.", level=Qgis.Warning, duration=30)
def devlog(NAME): def devlog(NAME):
import qgis import qgis
devmaj = '<head><style>* {margin:0; padding:0; }</style></head>' devmaj = '<head><style>* {margin:0; padding:0; }</style></head>'