Closed SimonSAMPERE closed 1 month ago
Au CD 94 ils prépare une version LTR de QGIS qui est configurée et customisée sur un poste "admin", à laquelle ils ajoutent des plugins dont le plugin Isogeo. Ensuite cette version est "chargée" dans un "centre logiciel" à partir duquel elle sera déployée sur les postes des utilisateurs sans nécessiter d'action de leur part. Les plugins sont donc encapsulés dans cette version déployée.
L'objectif c'est de faire en sorte qu'un maximum de configurations communes à tous les utilisateurs puisse être effectué une seule fois. Ce qu'on cherche c'est que les configurations du plugin Isogeo effectuées sur le poste "admin" avant le chargement dans le centre logiciel se répercutent sur les postes utilisateur après le déploiement.
Je pense notamment à l'authentification pour laquelle Stéphanie m'a dit que ça n'était pas le cas alors qu'elle dépose le fichier dans le dossier _auth
du répertoire du plugin. Je lui ai dit qu'il faudrait essayer de le charger via le plugin mais il faut quand même que je vérifie que ça fonctionne.
Globalement, tout ça confirme la nécessité de se poser la question de où on enregistre les paramètres. J'ai toujours tendance à vouloir les enregistrer dans des fichiers + dans les paramètres de QGIS. Mais se pose la question des conflits, pour chaque paramètre il va falloir décider, si sa valeur dans le fichier est différente de celle des paramètres, quelle valeur conserver.
Le plugin sera prochaine déployé pour plusieurs dizaines d'utilisateurs.
Stéphanie m'a dit, après que je lui ais demandé, qu'on pourrait effectuer des tests de déploiement, une fois que j'aurai une version suffisamment mature du plugin à leur faire tester. Puisque je ne maîtrise pas les modalités technique de leur processus de déploiement, l'idée serait de constater dans leur environnement 2 types de comportement :
Convenu je sais plus quand : @Erzalt doit lire le ticket, lire la doc en ligne du plugin QGIS et organiser un point avec @SimonSAMPERE pour organiser la recette
Ma version actuelle de QGIS est la 3.32.3
. Est-ce qu'il y a un besoin d'une version particulière pour la recette, je vois que dans la doc le plugin va jusqu'à 3.28.x
uniquement ?
@Erzalt effectivement j'aurais dû le préciser, il faudrait que tu installes la version 3.34.5 (la dernière version LTR)
QSettings
de l'application QGIS : Menu "Préférences" > "Options" > onglet "Avancé" (tout en bas) > ne pas cocher la case "Use new settings..." et cliquer sur "Je ferai attention, je le promets !" > rubrique "isogeo"_user\quicksearches.json
_user\quicksearches.json
et dans les QSettings
dans isogeo/user/quicksearches
--> comportement attendu : fusion du fichier et des QSettings
+ prévalence du fichier si conflit (pour une quicksearch dont le nom apparaît dans les QSettings
et dans le fichier, on conserve les paramètres du fichier)add_metadata_url_portal
et portal_base_url
stockés dans les QSettings
dans isogeo/settings
add_metadata_url_portal
et portal_base_url
stockés dans les QSettings
dans isogeo/settings
et dans le fichier config.json
--> comportement attendu : si la valeur est différente entre le fichier config.json
et les QSettings
, alors la valeur du fichier config.json
écrase celle des QSettings
client_id
et client_secret
)app_id
et app_secret
stockés dans les QSettings
dans isogeo/auth
+ le fichier client_secrets.json
renseigné par l'utilisateur, déplacé dans le dossier _auth
qui contient les clefs client_id
et client_secret
client_secrets.json
est présent dans le dossier _auth
, alors on écrase les valeurs des paramètres app_id
et app_secret
des QSettings
avec les valeurs des clefs client_id
et client_secret
du fichier client_secrets.json
, sinon, si les paramètres app_id
et app_secret
des *QSettings
sont remplis, on les conserve, sinon on demande à l'utilisateur d'indiquer l'emplacement d'un fichier client_secrets.json
api_auth_url
, api_base_url
, app_base_url
et help_base_url
stockés dans le fichier config.json
et dans les QSettings
api_auth_url
: si la valeur est différente entre le fichier config.json
et les QSettings
et que la valeur présente dans le fichier config.json
est différente de https://id.api.isogeo.com, alors la valeur du fichier config.json
écrasent celle des QSettings
, sinon la valeur des QSettings
écrasent celle du fichier config.json
.api_base_url
: si la valeur est différente entre le fichier config.json
et les QSettings
et que la valeur présente dans le fichier config.json
est différente de https://v1.api.isogeo.com, alors la valeur du fichier config.json
écrasent celle des QSettings
, sinon la valeur des QSettings
écrasent celle du fichier config.json
.app_base_url
: si la valeur est différente entre le fichier config.json
et les QSettings
et que la valeur présente dans le fichier config.json
est différente de https://app.isogeo.com, alors la valeur du fichier config.json
écrasent celle des QSettings
, sinon la valeur des QSettings
écrasent celle du fichier config.json
.help_base_url
: si la valeur est différente entre le fichier config.json
et les QSettings
et que la valeur présente dans le fichier config.json
est différente de https://help.isogeo.com, alors la valeur du fichier config.json
écrasent celle des QSettings
, sinon la valeur des QSettings
écrasent celle du fichier config.json
.N° | Version initiale | Version initiale customisée | Version installée | Via un ZIP | Via un ZIP customisé | Via téléchargement |
---|---|---|---|---|---|---|
1 | Aucune | 0 | 3.5.0 | 1 | 0 | 0 |
2 | Aucune | 0 | 3.5.0 | 0 | 1 | 0 |
3 | Aucune | 0 | 3.5.0 | 0 | 0 | 1 |
4 | 3.4.0 | 0 | 3.5.0 | 1 | 0 | 0 |
5 | 3.4.0 | 0 | 3.5.0 | 0 | 1 | 0 |
6 | 3.4.0 | 0 | 3.5.0 | 0 | 0 | 1 |
7 | 3.4.0 | 1 | 3.5.0 | 1 | 0 | 0 |
8 | 3.4.0 | 1 | 3.5.0 | 0 | 1 | 0 |
9 | 3.4.0 | 1 | 3.5.0 | 0 | 0 | 1 |
Gdoc sur les fichiers de configuration à créer pour chaque test : https://docs.google.com/spreadsheets/d/1ulO3ZB4ojbRXu1J-QfDzi0c_v2gzD-fZmytGbvyV7D4/edit#gid=405601901
Ressources pour faire les 2 scripts Python de :
checker les scripts à exécuter dans QGIS, notamment :
# -*- coding: utf-8 -*-
from qgis.PyQt.QtCore import QSettings
import json
from pprint import pprint
from pathlib import Path
qsettings = QSettings()
matching = {
r"C:\Users\SimonSAMPERE\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\isogeo-plugin-qgis\config.json": {
"api_base_url": "isogeo/env/api_base_url",
"api_auth_url": "isogeo/env/api_auth_url",
"app_base_url": "isogeo/env/app_base_url",
"help_base_url": "isogeo/env/help_base_url",
"background_map_url": "isogeo/settings/background_map_url",
"portal_base_url": "isogeo/settings/portal_base_url",
"add_metadata_url_portal": "isogeo/settings/add_metadata_url_portal",
},
r"C:\Users\SimonSAMPERE\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\isogeo-plugin-qgis\_auth\client_secrets.json": {
"client_id": "isogeo/auth/app_id",
"client_secret": "isogeo/auth/app_secret",
},
r"C:\Users\SimonSAMPERE\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\isogeo-plugin-qgis\_user\quicksearches.json": "isogeo/user/quicksearches/"
}
for config_file_path in matching:
if Path(config_file_path).stem == "quicksearches":
keys = matching[config_file_path]
with open(Path(config_file_path), "r") as json_file:
config_json_content = json.load(json_file)
elif Path(config_file_path).stem == "config":
keys = matching[config_file_path]
with open(Path(config_file_path), "r") as json_file:
config_json_content = json.load(json_file)
for key in keys:
qsettings_key = keys[key]
json_value = config_json_content.get(key)
qsetting_value = qsettings.value(qsettings_key)
if qsetting_value == json_value:
print("☻ {} : '{}'".format(qsettings_key, json_value))
else:
print("Ø {} : '{}' vs '{}'".format(qsettings_key, json_value, qsetting_value))
else:
keys = matching[config_file_path]
with open(Path(config_file_path), "r") as json_file:
config_json_content = json.load(json_file)
for key in keys:
qsettings_key = keys[key]
json_value = config_json_content.get("web").get(key)
qsetting_value = qsettings.value(qsettings_key)
if qsetting_value == json_value:
print("☻ {} : '{}'".format(qsettings_key, json_value))
else:
print("Ø {} : '{}' vs '{}'".format(qsettings_key, json_value, qsetting_value))
Reste encore les cas 8 et 9 qui viendront dans un autre commentaire
Se référer à ces tableaux.
Les informations sur les résultats des scripts se trouvent dans les dossiers associés.
Dans qsettings_keys_values
se trouvent les valeurs attendues, dans result_conformity
le résultat du script check_conformity.py
(comparaison entre les qsettings et les qsettings_keys_values
). Dans result_equal
le résultat du script check_conformity.py
(correspondance entre les qsettings et les fichiers).
Les cas 1, 3, 4 et 6 sont ok ✔️
Pour les cas 2 et 5, je remarque que les urls des quicksearches ne sont pas récupérés tel quels. Ils sont regénérés en fonction de l'url entré dans api_base_url. Dans config.json :
"api_base_url": "https://v1.api2.isogeo.com"
Url fournis dans les quicksearches : "url": "https://v1.api.isogeo.com/resources/search?q=type:dataset&ob=relevance&od=desc&_include=serviceLayers,layers,limitations&_limit=10&_offset=0&_lang=fr"
Url dans les quicksearches après installation : "url": "https://v1.api2.isogeo.com/resources/search?q=type:dataset&ob=relevance&od=desc&_include=serviceLayers,layers,limitations&_limit=10&_offset=0&_lang=fr"
(c'est un comportement qui me semble logique, mais il n'est pas spécifié donc je le remonte)
Pour le cas 7, les quicksearches ne sont pas récupérées. Protocole suivi :
@Erzalt , merci pour ce magnifique et réjouissant premier retour de recette ✨
Comme tu l'avais pressenti pour les cas 2 et 5, le comportement est conforme à ce qui est attendu mais j'avais effectivement oublié de t'indiquer cette subtilité. Pour que les recherches rapides restent fonctionnel, le plugin remplace la base de l'URL de l'API s'il a changé.
Venons-en maintenant au 📼. Figure-toi que la encore le comportement est attendu mais que je l'avais mal décrit dans ce commentaire. Puisque les recherches rapides sont initialement (3.4.0) uniquement stockées dans le fichier quicksearches.json
, elles sont irrémédiablement perdues lorsqu'on installe la version 3.5.0 du plugin. Lors de la mise à jour, tout le répertoire est écrasé donc le fichier quicksearches.json
est supprimé et la version 3.5.0 n'a aucun moyen de récupérer les recherches rapides qui ne figuraient même pas dans les QSettings. C'est justement pour ça qu'elles y figurent depuis la version 3.5.0, pour avoir une persistance avec les futurs versions. Ce comportement sera donc valable également pour les cas 8 :oyster: et 9 :egg:. Voilà, j'espère que c'est à peu près claire.
Du coup tu peux poursuivre la recette puisque tous les comportements sont conformes (c'est juste moi qui les avais mal décrit, sorry).
Résumé état actuel de la recette :
Bravo ! Pas de bugs à déclarer ! 🎉
Merci beaucoup @Erzalt et bravo pour cette recette menée d'une main de maître 🦾
Objectif
Modulariser et centraliser la gestion des
QSettings
. Gérer la persistence des différents paramètres. Dans certains cas, on veut que les paramètres puisse être inscrit dans un fichier JSON en plus desQSettings
et inversement. Deux cas de figure :Plugin configuré sur un poste puis zippé et installé sur un autre poste. Pour que le paramétrage effectué sur le premier poste se répercute sur le second, il faut que les paramètres en question aient été stockés dans des fichiers JSON qui se trouvent dans le ZIP.
Plugin mis à jour. Il y a un risque que tous les paramètre stockés dans des fichiers JSON soient supprimés lorsque ces fichiers seront écrasés. Il faut donc les stocker également dans les
QSettings
pour pourvoir les remettre dans les fichiers JSON lors du premier re-démarrage du plugin après la mise à jour.L'idéal serait donc de dupliquer tous les paramètres et de décider pour chacun si c'est le JSON ou le QSetting qui doit prévaloir dans chaque situation.
Il faut également penser à la récupération de la valeur des paramètres stockés dans le format de la précédente version du plugin Isogeo.
Principe
Créer une nouvelle classe pour gérer le stockage et la récupération de tous les paramètres dans les
QSettings
, cela concerne :Le
SettingsManager
serat instancié dans le script de chaque module ayant besoin d’interagir avec les paramètres, comme c'est le cas avec leIsogeoPlgTools
. Dans chaque configuration, vérifier que la valeur des paramètres après installation/mise à jour est conforme aux SPEF.Inventaire des paramètres
Paramètres natifs de QGIS
locale/userLocale
proxy/proxyEnabled
proxy/proxyType
proxy/proxyHost
proxy/proxyPort
qgis/style
PostgreSQL/connections/.../database
PostgreSQL/connections/.../host
PostgreSQL/connections/.../port
PostgreSQL/connections/.../username
PostgreSQL/connections/.../password
PostgreSQL/connections/.../service
PostgreSQL/connections/.../savePassword
PostgreSQL/connections/.../saveUsername
Oracle/connections/.../database
Oracle/connections/.../host
Oracle/connections/.../port
Oracle/connections/.../username
Oracle/connections/.../password
Oracle/connections/.../savePassword
Oracle/connections/.../saveUsername
projections/layerDefaultCrs
app/projections/defaultProjectCrs
Paramètres du plugin Isogeo
isogeo/user/editor
isogeo/settings/portal_base_url
isogeo/settings/add_metadata_url_portal
isogeo/settings/georelation
isogeo/env/api_base_url
isogeo/env/api_auth_url
isogeo/env/app_base_url
isogeo/env/help_base_url
isogeo/settings/background_map_url
isogeo/auth/app_id
isogeo/auth/app_secret
isogeo/settings/invalid_pgdb_conn
isogeo/settings/prefered_pgdb_conn
isogeo/settings/invalid_ora_conn
isogeo/settings/prefered_ora_conn
config.json
api_base_url
api_auth_url
app_base_url
help_base_url
background_map_url
db_connections.json
quicksearches.json
SPET
SettingsManager
héritant dePyQt.QtCore.QSettings
. - 0,25jSettingsManager
en remplacement dePyQt.QtCore.QSettings
dans tous les modules - 0,25jIsogeo
Authenticator
DataBaseManager
MetadataDisplayer
PortalURLManager
SearchFormManager
IsogeoPlgTools
GeoServiceManager
ResultsManager
UserInformer
--> nécessaire depuis qu'il ne prend plus la méthodetr
en argumentPyQt.QtCore.QSettings
- 0,25jLimitationsChecker
LayerAdder
quicksearches.json
dans leSettingsManager
QSettings
auSettingsManager
QSettings
avec celui duquicksearches.json
, si doublons, on conserve celui duquicksearches.json
, sauf pour_current
etDernière recherche
SettingsManager
dans leQuickSearchManager
quicksearch.json
+ pas de quicksearch dans les QSettingsquicksearch.json
+ des quicksearches dans les QSettingsquicksearch.json
sans_current
etDernière recherche
+ pas de quicksearch dans les QSettingsquicksearch.json
avec_current
etDernière recherche
+ des quicksearches dans les QSettingsconfig.json
- 1jSettingsManager
une méthode de récupération de la valeur des paramètres concernés depuis le fichierconfig.json
ou lesQSettings
avec prévalence des valeurs enregistrées dans le fichierconfig.json
sur celles desQSettings
en cas de conflitSettingsManager
une méthode d'ajout et de modification des paramètres concernés dans lesQSettings
ET dans le fichierconfig.json
PortalURLManager
l'utilisation des méthodes susmentionnées duSettingsManager
Authenticator
vers leSettingsManager
- 2jconfig.json
dans leSettingsManager
isogeo/env/api_base_url
,isogeo/env/api_auth_url
,isogeo/env/app_base_url
etisogeo/env/help_base_url
ajouter la prévalence des valeurs enregistrées dans lesQSettings
sur celles du fichierconfig.json
en cas de conflit, uniquement si celles du fichierconfig.json
sont les valeurs par défautQSettings
sur le fichierclient_secrets.json
, il faudrait faire l'inverse pour permettre d'écraser les credentials des utilisateurs via un déploiement massif en utilisant un ZIPinvalid_pgdb_conn
,prefered_pgdb_conn
,invalid_ora_conn
etprefered_ora_conn
restent uniquement dans lesQSettings
db_connections.json
dans lesQSettings
db_connections.json
dans leSettingsManager
cache.json
- 2jQSettings
, potentiellement sous forme de liste dansisogeo/user/unreachable_filepath
SettingsManager
ouCacheManager
)QSettings
des infos stockées dans le fichiercache.json
cache.json
cache.json
est vraiment utile pour les services (cached_unreach_service
) et les bases PostGIS (cached_unreach_postgis
) inaccessibles, selon il faudra nettoyer leCacheManager
ou faire le passage du cache uniquement dans lesQSettings
SettingsManager
en voyant si une même instance ne peut pas être transmise d'un module à l'autre dans certains casTests
Pour tester correctement il va falloir publier le plugin QGIS dans le dépôt des extensions QGIS sous forme de version expérimentale.
Voici les différentes cas d'installation à tester :
"ZIP non-personnalisé" : tel qu'on peut le trouver sur le SharePoint
"ZIP personnalisé" :
_user/quicksearches.json
config.json
(portal_base_url
)config.json
(add_metadata_url_portal
)_user/db_connections.json
"plugin personnalisé" :
quicksearches.json
du ZIP personnalisé --> elles doivent être conservéesquicksearches.json
du ZIP personnalisé mais des critères de recherche différents --> le ZIP personnalisé prévaut donc écrasement des recherches rapides initiale au profit de celles issues du ZIP personnaliséconfig.json
du ZIP personnalisé (portal_base_url
) --> le ZIP personnalisé prévaut donc la valeur initiale est remplacée par celle figurant dans leconfig.json
du ZIP personnaliséconfig.json
du ZIP personnalisé (add_metadata_url_portal
) --> le ZIP personnalisé prévaut donc la valeur initiale est remplacée par celle figurant dans leconfig.json
du ZIP personnaliséRessources
dépôt isogeo2office