isogeo / isogeo-plugin-qgis

Isogeo plugin for QGIS
http://help.isogeo.com/qgis/
GNU General Public License v3.0
16 stars 5 forks source link

[SettingsManager] Création d'un module héritant de PyQt.QtCore.QSettings #258

Closed SimonSAMPERE closed 1 month ago

SimonSAMPERE commented 4 years ago

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 des QSettings et inversement. Deux cas de figure :

  1. 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.

  2. 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 le IsogeoPlgTools. 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
  • fichier config.json
    • api_base_url
    • api_auth_url
    • app_base_url
    • help_base_url
    • background_map_url
  • fichier db_connections.json
  • fichier quicksearches.json

SPET

Tests

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 :

  1. ✔️ première installation du plugin en version 3.5.0, en installant un ZIP non-personnalisé via le gestionnaire des extensions
  2. ✔️ première installation du plugin en version 3.5.0, en installant un ZIP personnalisé via le gestionnaire des extensions
  3. mise à jour du plugin personnalisé en version 3.4.0, en téléchargeant la version 3.5.0 via le gestionnaire des extensions
  4. ✔️ mise à jour du plugin personnalisé en version 3.4.0, en installant un ZIP non-personnalisé de la 3.5.0 via le gestionnaire des extensions
  5. ✔️ mise à jour du plugin personnalisé en version 3.4.0, en installant un ZIP personnalisé de la 3.5.0 via le gestionnaire des extensions
  6. ✔️ mise à jour du plugin personnalisé en version 3.5.0, en installant un ZIP non-personnalisé de la 3.5.0 via le gestionnaire des extensions

Ressources

dépôt isogeo2office

SimonSAMPERE commented 9 months ago

Point avec Catherine, Gaël et Stéphanie du CD94 concernant le déploiement massif du plugin QGIS via un zip

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 :

SimonSAMPERE commented 2 months ago

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

Erzalt commented 2 months ago

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 ?

SimonSAMPERE commented 2 months ago

@Erzalt effectivement j'aurais dû le préciser, il faudrait que tu installes la version 3.34.5 (la dernière version LTR)

SimonSAMPERE commented 1 month ago

point du 21/05 entre @Erzalt et @SimonSAMPERE

Les recherches rapides

L'URL du portail

Les credentials (client_id et client_secret)

Les URL Isogeo

SimonSAMPERE commented 1 month ago
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
Erzalt commented 1 month ago

Gdoc sur les fichiers de configuration à créer pour chaque test : https://docs.google.com/spreadsheets/d/1ulO3ZB4ojbRXu1J-QfDzi0c_v2gzD-fZmytGbvyV7D4/edit#gid=405601901

SimonSAMPERE commented 1 month ago

Ressources pour faire les 2 scripts Python de :

qsettings_keys_values.json

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))
Erzalt commented 1 month ago

Reste encore les cas 8 et 9 qui viendront dans un autre commentaire

Recette

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).

Cas correspondants aux attendus

Les cas 1, 3, 4 et 6 sont ok ✔️

Cas ne correspondants pas aux attendus

Cas 2 et 5

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)

Cas 7 📼

Pour le cas 7, les quicksearches ne sont pas récupérées. Protocole suivi :

SimonSAMPERE commented 1 month ago

@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).

Erzalt commented 1 month ago

Résumé état actuel de la recette :

Erzalt commented 1 month ago

Bravo ! Pas de bugs à déclarer ! 🎉

SimonSAMPERE commented 1 month ago

Merci beaucoup @Erzalt et bravo pour cette recette menée d'une main de maître 🦾

SimonSAMPERE commented 1 month ago

https://github.com/isogeo/isogeo-plugin-qgis/releases/tag/3.5.0