Merge pull request 'Qt5 et Qt6 Compatible' (#4) from tlaveille/plugin_gn_tools:master into master

Reviewed-on: CEN38/plugin_gn_tools#4
This commit is contained in:
Colas 2026-04-22 14:38:09 +02:00
commit 9bd9a9ca56
10 changed files with 58 additions and 57 deletions

View File

@ -19,16 +19,16 @@ deprecated=False
experimental=True experimental=True
plugin_dependencies= plugin_dependencies=
qgisMinimumVersion=3.30 qgisMinimumVersion=3.30
qgisMaximumVersion=3.99 qgisMaximumVersion=4.99
supportsQt6=True supportsQt6=True
# versioning # versioning
version=0.1.0 version=0.1.1
changelog= changelog=
[service] [service]
domain_name=https://geonature.cen-isere.fr/geonature domain_name=https://geonature.cenra-outils.org/geonature
biodiv_aura=https://donnees.biodiversite-auvergne-rhone-alpes.fr biodiv_aura=https://donnees.biodiversite-auvergne-rhone-alpes.fr
[ref_taxon] [ref_taxon]

7
gn_tools/plugin_main.py Executable file → Normal file
View File

@ -24,7 +24,7 @@ from qgis.PyQt.QtCore import QCoreApplication, QLocale, QTranslator, QUrl
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, QMessageBox
from qgis.PyQt.QtNetwork import QNetworkAccessManager from qgis.PyQt.QtNetwork import QNetworkAccessManager
from PyQt5.QtWidgets import QCheckBox, QApplication from qgis.PyQt.QtWidgets import QCheckBox, QApplication
# project # project
from gn_tools.__about__ import ( from gn_tools.__about__ import (
@ -388,12 +388,13 @@ class GnToolsPlugin:
self.dlg.show() self.dlg.show()
# Run the dialog event loop # Run the dialog event loop
result = self.dlg.exec_() result = self.dlg.exec()
if result: if result:
# Do something useful here - delete the line containing pass and # Do something useful here - delete the line containing pass and
# substitute with you # substitute with you
print('ok') print('ok')
print(result) print(result)
self.dlg.activateWindow()
pass pass
@ -469,7 +470,7 @@ class GnToolsPlugin:
def activate_window(self): def activate_window(self):
# Put the dialog on top once the rectangle is drawn # Put the dialog on top once the rectangle is drawn
# self.activateWindow() self.dlg.activateWindow()
self.canvas.unsetMapTool(self.move_tool) self.canvas.unsetMapTool(self.move_tool)
self.check_valid() self.check_valid()

View File

@ -1,9 +1,9 @@
# Import PyQt libs # Import PyQt libs
from PyQt5.QtCore import ( from qgis.PyQt.QtCore import (
pyqtSignal, pyqtSignal,
Qt, Qt,
) )
from PyQt5.QtGui import QColor from qgis.PyQt.QtGui import QColor
# Import PyQgis libs # Import PyQgis libs
from qgis.core import ( from qgis.core import (
QgsRectangle, QgsRectangle,
@ -42,7 +42,7 @@ class RectangleFeatureTool(QgsMapTool):
# Mouse button pressed. # Mouse button pressed.
def canvasPressEvent(self, event: QgsMapMouseEvent): def canvasPressEvent(self, event: QgsMapMouseEvent):
if event.button() == Qt.LeftButton: if event.button() == Qt.MouseButton(0x00000001):
self.start_point = self.toMapCoordinates(event.pos()) self.start_point = self.toMapCoordinates(event.pos())
self.end_point = self.start_point self.end_point = self.start_point
self.is_left_button_pressed = True self.is_left_button_pressed = True
@ -58,7 +58,7 @@ class RectangleFeatureTool(QgsMapTool):
# The mouse button is released. # The mouse button is released.
def canvasReleaseEvent(self, event: QgsMapMouseEvent): def canvasReleaseEvent(self, event: QgsMapMouseEvent):
# if the left mouse button was released # if the left mouse button was released
if event.button() == Qt.LeftButton: if event.button() == Qt.MouseButton(0x00000001):
if event.type() == 3: if event.type() == 3:
# get the rectangle created from the click point and # get the rectangle created from the click point and
# left mouse button release points # left mouse button release points

View File

@ -77,15 +77,15 @@ class GetFilterFromAPI(QDialog):
self._pending_downloads -= 1 self._pending_downloads -= 1
# If reply is an error or reply is a redirection, login is not accepted # If reply is an error or reply is a redirection, login is not accepted
print(reply.attribute( print(reply.attribute(
QNetworkRequest.HttpStatusCodeAttribute QNetworkRequest.Attribute(0)
)) ))
print(reply.error(),' : ',reply.dtype) print(reply.error(),' : ',reply.dtype)
self.network_manager.cookieStatus = reply.attribute( self.network_manager.cookieStatus = reply.attribute(
QNetworkRequest.HttpStatusCodeAttribute QNetworkRequest.Attribute(0)
) )
QApplication.restoreOverrideCursor() QApplication.restoreOverrideCursor()
if ( if (
reply.error() != QNetworkReply.NoError reply.error() != QNetworkReply.NetworkError(0)
or self.network_manager.cookieStatus != 200 or self.network_manager.cookieStatus != 200
): ):
# Error code 299 means the logins are invalid # Error code 299 means the logins are invalid
@ -126,7 +126,7 @@ class GetFilterFromAPI(QDialog):
def get_jdd(self): def get_jdd(self):
self._pending_downloads += 1 self._pending_downloads += 1
QApplication.setOverrideCursor(Qt.WaitCursor) QApplication.setOverrideCursor(Qt.CursorShape(3))
self.dlg.jdd_box.setEnabled(True) self.dlg.jdd_box.setEnabled(True)
url_api = self.domain_url + 'api/meta/datasets?' url_api = self.domain_url + 'api/meta/datasets?'
@ -142,7 +142,7 @@ class GetFilterFromAPI(QDialog):
def get_phylog(self): def get_phylog(self):
self._pending_downloads += 2 self._pending_downloads += 2
QApplication.setOverrideCursor(Qt.WaitCursor) QApplication.setOverrideCursor(Qt.CursorShape(3))
self.dlg.regne.setEnabled(True) self.dlg.regne.setEnabled(True)
if self.parent.src_name == 'GéoNature': if self.parent.src_name == 'GéoNature':
@ -154,7 +154,7 @@ class GetFilterFromAPI(QDialog):
def get_taxon_tree(self): def get_taxon_tree(self):
QApplication.setOverrideCursor(Qt.WaitCursor) QApplication.setOverrideCursor(Qt.CursorShape(3))
if self.parent.src_name == 'GéoNature': if self.parent.src_name == 'GéoNature':
url_api = self.tax_url + 'api/synthese/taxons_tree' url_api = self.tax_url + 'api/synthese/taxons_tree'
@ -170,8 +170,8 @@ class GetFilterFromAPI(QDialog):
def send_request(self,url,type_request,type_param): def send_request(self,url,type_request,type_param):
print(url) print(url)
request = QNetworkRequest(url) request = QNetworkRequest(url)
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.KnownHeaders(0), "application/json")
request.setHeader(QNetworkRequest.CookieHeader, self.cookie) request.setHeader(QNetworkRequest.KnownHeaders(4), self.cookie)
if type_request == 'GET': if type_request == 'GET':
reply = self.network_manager.get(request) reply = self.network_manager.get(request)
elif type_request == 'POST': elif type_request == 'POST':

View File

@ -2,10 +2,10 @@
import json import json
import time import time
# Import PyQt libs # Import PyQt libs
from PyQt5.QtCore import QObject, pyqtSignal, QUrl, Qt, QVariant from qgis.PyQt.QtCore import QObject, pyqtSignal, QUrl, Qt, QVariant
from PyQt5.QtGui import QColor from qgis.PyQt.QtGui import QColor
from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from qgis.PyQt.QtNetwork import QNetworkRequest, QNetworkReply
from PyQt5.QtWidgets import QDialog, QPushButton, QApplication, QVBoxLayout, QHBoxLayout, QButtonGroup, QCheckBox, QLabel from qgis.PyQt.QtWidgets import QDialog, QPushButton, QApplication, QVBoxLayout, QHBoxLayout, QButtonGroup, QCheckBox, QLabel
# Import PyQgis libs # Import PyQgis libs
from qgis.utils import iface from qgis.utils import iface
from qgis.core import QgsProject, QgsFeature, QgsDataSourceUri, QgsRectangle, QgsNetworkAccessManager, QgsVectorLayer, QgsPointXY, QgsWkbTypes, QgsMapLayerProxyModel, QgsGeometry, QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsField from qgis.core import QgsProject, QgsFeature, QgsDataSourceUri, QgsRectangle, QgsNetworkAccessManager, QgsVectorLayer, QgsPointXY, QgsWkbTypes, QgsMapLayerProxyModel, QgsGeometry, QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsField
@ -60,7 +60,7 @@ class GetTaxrefId(QObject):
url = "https://api.checklistbank.org/nameusage/search?content=SCIENTIFIC_NAME&datasetKey=2008&facet=datasetKey&facet=rank&facet=issue&facet=status&facet=nomStatus&facet=nameType&facet=field&facet=authorship&facet=authorshipYear&facet=extinct&facet=environment&facet=origin&limit=50&offset=0&q={nom}&rank={rank}&type=PREFIX".format(nom=nom.split("(")[0], rank=rank.lower()) url = "https://api.checklistbank.org/nameusage/search?content=SCIENTIFIC_NAME&datasetKey=2008&facet=datasetKey&facet=rank&facet=issue&facet=status&facet=nomStatus&facet=nameType&facet=field&facet=authorship&facet=authorshipYear&facet=extinct&facet=environment&facet=origin&limit=50&offset=0&q={nom}&rank={rank}&type=PREFIX".format(nom=nom.split("(")[0], rank=rank.lower())
print(url) print(url)
request = QNetworkRequest(QUrl(url)) request = QNetworkRequest(QUrl(url))
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.KnownHeaders(0), "application/json")
reply = self.network_manager.get(request) reply = self.network_manager.get(request)
reply.finished.connect(lambda: self.handle_finished(reply, feature_id)) reply.finished.connect(lambda: self.handle_finished(reply, feature_id))
self._iterate_names += 1 self._iterate_names += 1
@ -68,7 +68,7 @@ class GetTaxrefId(QObject):
def handle_finished(self, reply, feature_id): def handle_finished(self, reply, feature_id):
self._pending_downloads -= 1 self._pending_downloads -= 1
if reply.error() != QNetworkReply.NoError: if reply.error() != QNetworkReply.NetworkError(0):
print(f"code: {reply.error()} message: {reply.errorString()}") print(f"code: {reply.error()} message: {reply.errorString()}")
if reply.error() == 403: if reply.error() == 403:
print("Service down") print("Service down")
@ -146,14 +146,14 @@ class ImportDataGbif(QObject):
self.nb_request = 1 self.nb_request = 1
print(url) print(url)
request = QNetworkRequest(url) request = QNetworkRequest(url)
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.KnownHeaders(0), "application/json")
reply = self.network_manager.get(request) reply = self.network_manager.get(request)
reply.finished.connect(lambda: self.handle_finished(reply)) reply.finished.connect(lambda: self.handle_finished(reply))
self._pending_downloads += 1 self._pending_downloads += 1
def handle_finished(self, reply): def handle_finished(self, reply):
self._pending_downloads -= 1 self._pending_downloads -= 1
if reply.error() != QNetworkReply.NoError: if reply.error() != QNetworkReply.NetworkError(0):
print(f"code: {reply.error()} message: {reply.errorString()}") print(f"code: {reply.error()} message: {reply.errorString()}")
if reply.error() == 403: if reply.error() == 403:
print("Service down") print("Service down")

View File

@ -8,8 +8,8 @@ from qgis.PyQt.QtCore import QByteArray, QJsonDocument, QObject, QUrl, pyqtSigna
from qgis.PyQt.QtNetwork import QNetworkReply, QNetworkRequest from qgis.PyQt.QtNetwork import QNetworkReply, QNetworkRequest
from qgis.PyQt.QtWidgets import QAction, QMessageBox, QDialog from qgis.PyQt.QtWidgets import QAction, QMessageBox, QDialog
from PyQt5.QtCore import Qt from qgis.PyQt.QtCore import Qt
from PyQt5.QtWidgets import QApplication from qgis.PyQt.QtWidgets import QApplication
# from PyQt6.QtCore import Qt # from PyQt6.QtCore import Qt
# from PyQt6.QtWidgets import QApplication # from PyQt6.QtWidgets import QApplication
@ -42,7 +42,7 @@ class GetLogin(QDialog):
# self.total_zh = 0 # self.total_zh = 0
# PyQt5 - Version # PyQt5 - Version
QApplication.setOverrideCursor(Qt.WaitCursor) QApplication.setOverrideCursor(Qt.CursorShape(3))
# PyQt6 - Version # PyQt6 - Version
# QApplication.setOverrideCursor(Qt.CursorShape.WaitCursor) # QApplication.setOverrideCursor(Qt.CursorShape.WaitCursor)
self._pending_downloads = 0 self._pending_downloads = 0
@ -57,14 +57,14 @@ class GetLogin(QDialog):
QApplication.restoreOverrideCursor() QApplication.restoreOverrideCursor()
# If reply is an error or reply is a redirection, login is not accepted # If reply is an error or reply is a redirection, login is not accepted
print(reply.attribute( print(reply.attribute(
QNetworkRequest.HttpStatusCodeAttribute QNetworkRequest.Attribute(0)
)) ))
print('Login : ',reply.error()) print('Login : ',reply.error())
self.network_manager.cookieStatus = reply.attribute( self.network_manager.cookieStatus = reply.attribute(
QNetworkRequest.HttpStatusCodeAttribute QNetworkRequest.Attribute(0)
) )
if ( if (
reply.error() != QNetworkReply.NoError reply.error() != QNetworkReply.NetworkError(0)
or self.network_manager.cookieStatus != 200 or self.network_manager.cookieStatus != 200
): ):
# Error code 299 means the logins are invalid # Error code 299 means the logins are invalid
@ -98,7 +98,7 @@ class GetLogin(QDialog):
else: else:
self.cookies = self.network_manager.cookieJar() self.cookies = self.network_manager.cookieJar()
self.is_connect.setText("Good Job !") self.is_connect.setText("Good Job !")
QApplication.setOverrideCursor(Qt.CursorShape(0))
# If the authenfication configuration already exists, # If the authenfication configuration already exists,
# modify it with the new values # modify it with the new values
# self.manager_config.setConfigMap( # self.manager_config.setConfigMap(
@ -156,7 +156,7 @@ class GetLogin(QDialog):
} }
print(url) print(url)
request = QNetworkRequest(url) request = QNetworkRequest(url)
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.KnownHeaders(0), "application/json")
document = QJsonDocument(data_json) document = QJsonDocument(data_json)
print(document.toJson()) print(document.toJson())
reply = self.network_manager.post(request, document.toJson()) reply = self.network_manager.post(request, document.toJson())

View File

@ -15,7 +15,7 @@ from qgis.PyQt.QtCore import (
pyqtSignal, pyqtSignal,
QJsonDocument, QJsonDocument,
Qt, Qt,
QTextCodec # QTextCodec
) )
from qgis.PyQt.QtNetwork import QNetworkReply, QNetworkRequest from qgis.PyQt.QtNetwork import QNetworkReply, QNetworkRequest
from qgis.PyQt.QtWidgets import ( from qgis.PyQt.QtWidgets import (
@ -294,7 +294,7 @@ class PivotStatus(QDialog):
self.cd_nom = cd_nom self.cd_nom = cd_nom
self.url_api = self.domain_url + __api_cd_sta__ self.url_api = self.domain_url + __api_cd_sta__
# QApplication.setOverrideCursor(Qt.WaitCursor) # QApplication.setOverrideCursor(Qt.CursorShape(3))
self.multi_dep = True self.multi_dep = True
self.cookie = (self.network_manager.cookieJar() self.cookie = (self.network_manager.cookieJar()
@ -325,17 +325,17 @@ class PivotStatus(QDialog):
+ ','.join(map(str,cd_nom)) + ','.join(map(str,cd_nom))
) )
request = QNetworkRequest(url) request = QNetworkRequest(url)
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.KnownHeaders(0), "application/json")
request.setHeader(QNetworkRequest.CookieHeader, self.cookie) request.setHeader(QNetworkRequest.KnownHeaders(4), self.cookie)
reply = self.network_manager.get(request) reply = self.network_manager.get(request)
reply.finished.connect(lambda: self.import_finished(reply)) reply.finished.connect(lambda: self.import_finished(reply))
def import_finished(self, reply): def import_finished(self, reply):
self._pending_downloads -= 1 self._pending_downloads -= 1
print(reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)) print(reply.attribute(QNetworkRequest.Attribute(0)))
if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200: if reply.attribute(QNetworkRequest.Attribute(0)) != 200:
print(f"code: {reply.error()} message: {reply.errorString()}") print(f"code: {reply.error()} message: {reply.errorString()}")
else: else:
data_request = reply.readAll().data().decode() data_request = reply.readAll().data().decode()
@ -449,9 +449,9 @@ class PivotStatus(QDialog):
layername = data['layer_name'] layername = data['layer_name']
fcString = json.dumps(data) fcString = json.dumps(data)
codec = QTextCodec.codecForName("UTF-8") # codec = QTextCodec.codecForName("UTF-8")
fields = QgsJsonUtils.stringToFields(fcString, codec) fields = QgsJsonUtils.stringToFields(fcString)
feats = QgsJsonUtils.stringToFeatureList(fcString, fields, codec) feats = QgsJsonUtils.stringToFeatureList(fcString, fields)
vl = QgsVectorLayer(geom_type, layername, "memory") vl = QgsVectorLayer(geom_type, layername, "memory")
if vl.sourceCrs() != self.layer_crs: if vl.sourceCrs() != self.layer_crs:

View File

@ -17,7 +17,7 @@ from qgis.PyQt.QtCore import (
QObject, QObject,
QUrl, QUrl,
pyqtSignal, pyqtSignal,
QTextCodec, # QTextCodec,
Qt Qt
) )
from qgis.PyQt.QtNetwork import QNetworkReply, QNetworkRequest from qgis.PyQt.QtNetwork import QNetworkReply, QNetworkRequest
@ -68,7 +68,8 @@ class ParamWidget(QDialog):
self.print_change self.print_change
) )
else : else :
QApplication.setOverrideCursor(Qt.WaitCursor) QApplication.setOverrideCursor(Qt.CursorShape(3))
print(network_manager.cookieJar().cookiesForUrl(QUrl(self.domain_url)))
self.cookie = (network_manager.cookieJar() self.cookie = (network_manager.cookieJar()
.cookiesForUrl(QUrl(self.domain_url))[0] .cookiesForUrl(QUrl(self.domain_url))[0]
) )
@ -104,9 +105,9 @@ class ParamWidget(QDialog):
def import_finished(self, reply): def import_finished(self, reply):
self._pending_downloads -= 1 self._pending_downloads -= 1
QApplication.restoreOverrideCursor() QApplication.restoreOverrideCursor()
print(reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)) print(reply.attribute(QNetworkRequest.Attribute(0)))
if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200: if reply.attribute(QNetworkRequest.Attribute(0)) != 200:
print(f"code: {reply.error()} message: {reply.errorString()}") print(f"code: {reply.error()} message: {reply.errorString()}")
else: else:
self.lst_exp = ['Synthèse taxons'] self.lst_exp = ['Synthèse taxons']
@ -146,8 +147,8 @@ class ParamWidget(QDialog):
# Define request properties (cookie, header) # Define request properties (cookie, header)
request = QNetworkRequest(url) request = QNetworkRequest(url)
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.KnownHeaders(0), "application/json")
request.setHeader(QNetworkRequest.CookieHeader, self.cookie) request.setHeader(QNetworkRequest.KnownHeaders(4), self.cookie)
if apiFilter: if apiFilter:
doc = QJsonDocument(self.json_filter) doc = QJsonDocument(self.json_filter)
@ -194,7 +195,7 @@ class LoadingImport(QDialog):
# self.json_filter = {} # self.json_filter = {}
# self.total_zh = 0 # self.total_zh = 0
QApplication.setOverrideCursor(Qt.WaitCursor) QApplication.setOverrideCursor(Qt.CursorShape(3))
self._pending_downloads = 0 self._pending_downloads = 0
self.run() self.run()
@ -283,10 +284,10 @@ class LoadingImport(QDialog):
# Define request properties (cookie, header) # Define request properties (cookie, header)
request = QNetworkRequest(url) request = QNetworkRequest(url)
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.KnownHeaders(0), "application/json")
if self.cookie: if self.cookie:
request.setHeader(QNetworkRequest.CookieHeader, self.cookie) request.setHeader(QNetworkRequest.KnownHeaders(4), self.cookie)
if 'Synthèse taxons' in self.source : if 'Synthèse taxons' in self.source :
reply = self.network_manager.post(request,doc.toJson()) reply = self.network_manager.post(request,doc.toJson())
@ -297,9 +298,9 @@ class LoadingImport(QDialog):
def loading_finished(self,reply): def loading_finished(self,reply):
self._pending_downloads -= 1 self._pending_downloads -= 1
print(reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)) print(reply.attribute(QNetworkRequest.Attribute(0)))
if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200: if reply.attribute(QNetworkRequest.Attribute(0)) != 200:
print(f"code: {reply.error()} message: {reply.errorString()}") print(f"code: {reply.error()} message: {reply.errorString()}")
else: else:
data_request = reply.readAll().data().decode() data_request = reply.readAll().data().decode()
@ -399,9 +400,8 @@ class LoadingImport(QDialog):
fcString = json.dumps(data) fcString = json.dumps(data)
codec = QTextCodec.codecForName("UTF-8") fields = QgsJsonUtils.stringToFields(fcString)
fields = QgsJsonUtils.stringToFields(fcString, codec) feats = QgsJsonUtils.stringToFeatureList(fcString, fields)
feats = QgsJsonUtils.stringToFeatureList(fcString, fields, codec)
if self.api: if self.api:
crs_api = QgsCoordinateReferenceSystem(self.api['geometry_srid']) crs_api = QgsCoordinateReferenceSystem(self.api['geometry_srid'])

0
gn_tools/toolbelt/log_handler.py Executable file → Normal file
View File

0
gn_tools/toolbelt/preferences.py Executable file → Normal file
View File