Qt5 et Qt6 Compatible #4

Merged
Colas merged 4 commits from tlaveille/plugin_gn_tools:master into master 2026-04-22 14:38:10 +02:00
10 changed files with 58 additions and 57 deletions

View File

@ -19,16 +19,16 @@ deprecated=False
experimental=True
plugin_dependencies=
qgisMinimumVersion=3.30
qgisMaximumVersion=3.99
qgisMaximumVersion=4.99
supportsQt6=True
# versioning
version=0.1.0
version=0.1.1
changelog=
[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
[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.QtWidgets import QAction, QMessageBox
from qgis.PyQt.QtNetwork import QNetworkAccessManager
from PyQt5.QtWidgets import QCheckBox, QApplication
from qgis.PyQt.QtWidgets import QCheckBox, QApplication
# project
from gn_tools.__about__ import (
@ -388,12 +388,13 @@ class GnToolsPlugin:
self.dlg.show()
# Run the dialog event loop
result = self.dlg.exec_()
result = self.dlg.exec()
if result:
# Do something useful here - delete the line containing pass and
# substitute with you
print('ok')
print(result)
self.dlg.activateWindow()
pass
@ -469,7 +470,7 @@ class GnToolsPlugin:
def activate_window(self):
# Put the dialog on top once the rectangle is drawn
# self.activateWindow()
self.dlg.activateWindow()
self.canvas.unsetMapTool(self.move_tool)
self.check_valid()

View File

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

View File

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

View File

@ -2,10 +2,10 @@
import json
import time
# Import PyQt libs
from PyQt5.QtCore import QObject, pyqtSignal, QUrl, Qt, QVariant
from PyQt5.QtGui import QColor
from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply
from PyQt5.QtWidgets import QDialog, QPushButton, QApplication, QVBoxLayout, QHBoxLayout, QButtonGroup, QCheckBox, QLabel
from qgis.PyQt.QtCore import QObject, pyqtSignal, QUrl, Qt, QVariant
from qgis.PyQt.QtGui import QColor
from qgis.PyQt.QtNetwork import QNetworkRequest, QNetworkReply
from qgis.PyQt.QtWidgets import QDialog, QPushButton, QApplication, QVBoxLayout, QHBoxLayout, QButtonGroup, QCheckBox, QLabel
# Import PyQgis libs
from qgis.utils import iface
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())
print(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.finished.connect(lambda: self.handle_finished(reply, feature_id))
self._iterate_names += 1
@ -68,7 +68,7 @@ class GetTaxrefId(QObject):
def handle_finished(self, reply, feature_id):
self._pending_downloads -= 1
if reply.error() != QNetworkReply.NoError:
if reply.error() != QNetworkReply.NetworkError(0):
print(f"code: {reply.error()} message: {reply.errorString()}")
if reply.error() == 403:
print("Service down")
@ -146,14 +146,14 @@ class ImportDataGbif(QObject):
self.nb_request = 1
print(url)
request = QNetworkRequest(url)
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json")
request.setHeader(QNetworkRequest.KnownHeaders(0), "application/json")
reply = self.network_manager.get(request)
reply.finished.connect(lambda: self.handle_finished(reply))
self._pending_downloads += 1
def handle_finished(self, reply):
self._pending_downloads -= 1
if reply.error() != QNetworkReply.NoError:
if reply.error() != QNetworkReply.NetworkError(0):
print(f"code: {reply.error()} message: {reply.errorString()}")
if reply.error() == 403:
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.QtWidgets import QAction, QMessageBox, QDialog
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication
from qgis.PyQt.QtCore import Qt
from qgis.PyQt.QtWidgets import QApplication
# from PyQt6.QtCore import Qt
# from PyQt6.QtWidgets import QApplication
@ -42,7 +42,7 @@ class GetLogin(QDialog):
# self.total_zh = 0
# PyQt5 - Version
QApplication.setOverrideCursor(Qt.WaitCursor)
QApplication.setOverrideCursor(Qt.CursorShape(3))
# PyQt6 - Version
# QApplication.setOverrideCursor(Qt.CursorShape.WaitCursor)
self._pending_downloads = 0
@ -57,14 +57,14 @@ class GetLogin(QDialog):
QApplication.restoreOverrideCursor()
# If reply is an error or reply is a redirection, login is not accepted
print(reply.attribute(
QNetworkRequest.HttpStatusCodeAttribute
QNetworkRequest.Attribute(0)
))
print('Login : ',reply.error())
self.network_manager.cookieStatus = reply.attribute(
QNetworkRequest.HttpStatusCodeAttribute
QNetworkRequest.Attribute(0)
)
if (
reply.error() != QNetworkReply.NoError
reply.error() != QNetworkReply.NetworkError(0)
or self.network_manager.cookieStatus != 200
):
# Error code 299 means the logins are invalid
@ -98,7 +98,7 @@ class GetLogin(QDialog):
else:
self.cookies = self.network_manager.cookieJar()
self.is_connect.setText("Good Job !")
QApplication.setOverrideCursor(Qt.CursorShape(0))
# If the authenfication configuration already exists,
# modify it with the new values
# self.manager_config.setConfigMap(
@ -156,7 +156,7 @@ class GetLogin(QDialog):
}
print(url)
request = QNetworkRequest(url)
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json")
request.setHeader(QNetworkRequest.KnownHeaders(0), "application/json")
document = QJsonDocument(data_json)
print(document.toJson())
reply = self.network_manager.post(request, document.toJson())

View File

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

View File

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