Projet

Général

Profil

Actions

Anomalie #284

fermé

[Vue MenuBuilder] datasource_uri NULL

Ajouté par Leslie Lemaire il y a presque 4 ans. Mis à jour il y a presque 4 ans.

Statut:
Fermé
Priorité:
Haut
Assigné à:
Version cible:
Début:
22/06/2020
Echéance:
% réalisé:

100%

Temps estimé:
# ref:

Description

(message Michel Auzanneau du 2020.06.19)

Je n'arrive pas à paramétrer l'extension "MenuBuilder for ASGARD"

Voici ma config :
Serveur PostgreSQL Eole PostgreSQL (10.12) , Postgis (2.4.3), Asgard (0.6.2)
En télétravail avec accès au serveur PostgreSQL via VPN et certificat AGRICOL
QGIS 3.4.5

L'installation de QGIS est centralisée (Tous les postes disposent donc de la mème config, mèmes plugins)

Mise en oeuvre :
rc_consult est membre de g_consult
Je dispose des droits en écriture sur le répertoire d'installation du plugin.

Message d'erreur :
2020-06-19T14:54:48 WARNING Traceback (most recent call last):
File "C:/Program Files/QGIS 3.4/apps/qgis-ltr/./python\qgis\utils.py", line 344, in startPlugin
plugins[packageName].initGui()
File "W:\Inter-Services\Cartographie\Qgis\Installation\Qgis3.4.5\Plugins\MenuBuilderForAsgard\menu_builder.py", line 105, in initGui
self.dlg.restore_session()
File "W:\Inter-Services\Cartographie\Qgis\Installation\Qgis3.4.5\Plugins\MenuBuilderForAsgard\menu_builder_dialog.py", line 760, in restore_session
self.show_menus(bool(menubar), profile=profile, schema=schema)
File "W:\Inter-Services\Cartographie\Qgis\Installation\Qgis3.4.5\Plugins\MenuBuilderForAsgard\menu_builder_dialog.py", line 173, in show_menus
self.load_menus(profile=profile, schema=schema)
File "W:\Inter-Services\Cartographie\Qgis\Installation\Qgis3.4.5\Plugins\MenuBuilderForAsgard\menu_builder_dialog.py", line 298, in wrapped
return func(inst, *args, **kwargs)
File "W:\Inter-Services\Cartographie\Qgis\Installation\Qgis3.4.5\Plugins\MenuBuilderForAsgard\menu_builder_dialog.py", line 648, in load_menus
layer.triggered.connect(self.layer_handler[uri_struct.layerType])
KeyError: ''

Là, je bloque !!!


Fichiers

menu_builder_dialog.py (33,7 ko) menu_builder_dialog.py Leslie Lemaire, 22/06/2020 18:22

Mis à jour par Leslie Lemaire il y a presque 4 ans

(message Leslie Lemaire du 2020.06.19)

Deux petites questions pour éliminer ça de la liste des causes possibles :
- tu appuies bien sur "Appliquer" et pas "Enregistrer" pour valider ?
- est-ce que tu pourrais ouvrir dans QGIS la vue qgis_menubuilder_metadat, en utilisant la même connexion que pour MenuBuilder, et me dire ce que tu as dans le champ datasource_uri pour un enregistrement (n'importe lequel) ?

(message Michel Auzanneau du 2020.06.22)

Oui j'appuie bien sur "Appliquer".

Toutes les lignes du champ "datasource_uri" sont NULL

Mis à jour par Leslie Lemaire il y a presque 4 ans

(message Leslie Lemaire 2020.06.22)

Ok, les datasource_uri NULL, ce n'est pas du tout normal...

Est-ce que tu pourras essayer les requêtes suivantes et me dire ce que tu obtiens :

SELECT inet_server_adr() ;

SELECT host(inet_server_adr()) ;

Si tu as la possibilité de tester à la fois avec et sans VPN, ce serait l'idéal, mais je soupçonne que ce sera NULL dans tous les cas.

Mis à jour par Leslie Lemaire il y a presque 4 ans

(message Michel Auzanneau du 2020.06.22)

dans la vue "z_asgard.qgis_menubuilder_metadata"

la ligne

CASE WHEN host(inet_server_addr()) = ANY (ARRAY['127.0.0.1'::text, '::1'::text]) THEN 'localhost'::text ELSE NULL::text

ne devrait-elle pas être

CASE WHEN host(inet_server_addr()) = ANY (ARRAY['127.0.0.1'::text, '::1'::text]) THEN 'localhost'::text ELSE host(inet_server_addr())::text ?

Dans les 2 cas j'obtiens bien l'adresse du serveur Eole.

(message Leslie Lemaire du 2020.06.22)

Tu as raison ! Il manque un ELSE dans ce CASE/WHEN...

Si tu corriges ça, est-ce que le plugin MenuBuilder fonctionne ?

Mis à jour par Leslie Lemaire il y a presque 4 ans

(message de Michel Auzanneau du 2020.06.22)

Sous PgAdmin, la vue fonctionne bien et génère 2923 lignes en 7 secondes.

Pour le test du plugin Asgard, pour le moment je bloque sur un plantage QGIS sans savoir si cela vient de l'extension, du VPN ou ....

Plugin Menu Builder for ASGARD désinstallé et ...... impossible à réinstaller pour le moment.

Si le pb persiste, je suis à la DDT demain pour un test hors VPN.

Je te tiens au courant de la suite des évènements.

(message de Leslie Lemaire du 2020.06.22)

Ok ! Merci pour ton aide, ça nous aura déjà permis de bien avancer !

Est-ce que tu pourras juste me donner la valeur d'un datasource_uri, histoire de vérifier que tout est maintenant bien en ordre de ce côté ? Par ailleurs, si ce n'est pas abuser, il me serait utile d'avoir la chaîne de connexion que tu obtiens pour cette même table/vue quand tu l'ouvres dans QGIS (dans les propriétés de la couche, onglet Information, champ "Source"). Ça permettrait déjà de savoir si le VPN interfère de ce point de vue.

Pas d'urgence, mais si tu arrives à réactiver le plugin pour faire un nouvel essai, je serais preneuse du message d'erreur que tu as maintenant au plantage de QQGIS. En principe, ça ne devrait plus être le même que celui de ton premier message (qui semblait dû à la nullité de datasource_uri).

Mis à jour par Leslie Lemaire il y a presque 4 ans

message de Michel Auzanneau du 2020.06.22

Sous PgAdmin4 :
vector:postgres:n_topo_commune_s_000:dbname='ddt16' host=10.16.8.35 port=5432 user=rc_consult sslmode=require srid=2154 type=MULTIPOLYGON table="r_bdtopo_000"."n_topo_commune_s_000" (geom) sql=::

Sous QGIS :
dbname='ddt16' host=10.16.8.35 port=5432 user='rc_consult' sslmode=require key='cleabs' srid=2154 type=MultiPolygon table="r_bdtopo_000"."n_topo_commune_s_000" (geom) sql=

message de Leslie Lemaire du 2020.06.22

Le problème pourrait venir de l'absence de guillemets sur l'identifiant... Ce n'était pas gênant sous QGIS 3.10, mais ça l'est peut-être en 3.4. Alain avait testé le plugin avec la 3.4.5, mais c'était avant que je remette l'identifiant dans la chaîne de connexion.

Donc réessaie peut-être en remplaçant session_user par quote_literal(session_user) dans la définition de la vue qgis_menubuilder_metadata, pour voir si ça fait une différence.

Dans tous les cas je vais corriger ça pour la prochaine version.

message de Michel Auzanneau du 2020.06.22

J'ai rajouté quote_literal sur (session_user).

Je pense que le pb vient plutôt du nombre de lignes générées par la vue.
J'ai ajouté en fin de requête un "limit 50" et là le plugin fonctionne.

Si je laisse la requête sans limite, dans le paramétrage de l'extension quand on choisi le profil consultation, il faut attendre 15 mn pour obtenir la liste du menu et finir par une erreur Python du type "too many values to unpack (expected 2)"

message de Leslie Lemaire du 2020.06.22

Ça se tient, en effet. Merci pour ton aide !

Tu mentionnais 2923 lignes dans la vue. Est-ce ça correspond bien aux nombres de tables/vues de ta base (démultipliées par leur nombre de champs de géométrie) ?

Sinon je veux bien le détail de l'erreur, pour être fixée sur la cause. Pas impossible qu'il y ait une limite sur la longueur des menus QT - est-ce que tu as la même erreur quand tu utilises la forme "dock" ?

Tout ça pose beaucoup de questions sur l'usage de MenuBuilder. A minima, s'il existe un seuil (en nombre d'objets et/ou en nombre de niv1/niv2) au-delà duquel le plugin devient inutilisable, il va falloir qu'on le mentionne dans la documentation. Et peut-être aussi quelques considérations sur les temps de chargement, parce que 15min, c'est très loin d'être acceptable... Nous nous doutions que la performance serait médiocre sur les grosses bases, mais pas à ce point.

Mis à jour par Leslie Lemaire il y a presque 4 ans

message de Michel Auzanneau du 2020.06.22

Avec cette requête modifiée, ça fonctionne. Elle ne retourne que les éléments du bloc 'c'
En gras, les modifications apportées:

@-- View: z_asgard.qgis_menubuilder_metadata

-- DROP VIEW z_asgard.qgis_menubuilder_metadata;

CREATE OR REPLACE VIEW z_asgard.qgis_menubuilder_metadata
AS
WITH index_niv1 AS (
SELECT (row_number() OVER (ORDER BY (gestion_schema_1.niv1 IS NULL), (COALESCE)) - 1)::text AS ind1b,
COALESCE AS niv1b
FROM z_asgard_admin.gestion_schema gestion_schema_1
WHERE gestion_schema_1.creation and gestion_schema_1.bloc ='c'
GROUP BY (gestion_schema_1.niv1 IS NULL), (COALESCE)
), index_niv2 AS (
SELECT (row_number() OVER (PARTITION BY (COALESCE) ORDER BY (gestion_schema_1.niv2 IS NULL), (COALESCE)) - 1)::text AS ind2b,
COALESCE AS niv2b,
COALESCE AS niv1bref
FROM pg_class pg_class_1
JOIN z_asgard_admin.gestion_schema gestion_schema_1 ON pg_class_1.relnamespace::regnamespace::text = quote_ident(gestion_schema_1.nom_schema::text)
WHERE gestion_schema_1.bloc ='c' and gestion_schema_1.creation AND (pg_class_1.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'm'::"char", 'f'::"char", 'p'::"char"])) AND has_table_privilege(pg_class_1.oid, 'SELECT'::text) AND has_schema_privilege(pg_class_1.relnamespace, 'USAGE'::text)
GROUP BY (gestion_schema_1.niv2 IS NULL), (COALESCE), (COALESCE)
)
SELECT row_number() OVER (ORDER BY (gestion_schema.niv1 IS NULL), index_niv1.niv1b, (gestion_schema.niv2 IS NULL), index_niv2.niv2b, pg_class.relname) AS id,
pg_class.relname::text ||
CASE
WHEN geometry_columns.f_geometry_column IS NOT NULL AND NOT geometry_columns.f_geometry_column = 'geom'::name THEN '.'::text || geometry_columns.f_geometry_column::text
ELSE ''::text
END AS name,
'consultation'::text AS profile,
((((((((((('[[0, "'::text || upper(current_database()::text)) || '"], ['::text) || index_niv1.ind1b) || ', "'::text) || index_niv1.niv1b::text) || '"], ['::text) || index_niv2.ind2b) || ', "'::text) || index_niv2.niv2b::text) || '"]'::text) ||
CASE
WHEN gestion_schema.niv2 IS NOT NULL THEN (((', ['::text || ((row_number() OVER (PARTITION BY index_niv1.niv1b, gestion_schema.niv2 ORDER BY pg_class.relname) - 1)::text)) || ', "'::text) || pg_class.relname::text) || '"]'::text
ELSE ''::text
END) || ']'::text AS model_index,
((((((((((((((((('vector:postgres:'::text || pg_class.relname::text) || ':dbname='::text) || quote_literal(current_database()::text)) || ' host='::text) ||
CASE
WHEN host(inet_server_addr()) = ANY (ARRAY['127.0.0.1'::text, '::1'::text]) THEN 'localhost'::text
ELSE host(inet_server_addr())
END) || ' port='::text) || inet_server_port()) || ' user='''::text) || SESSION_USER::text) || ''' sslmode='::text) ||
CASE
WHEN host(inet_server_addr()) = ANY (ARRAY['127.0.0.1'::text, '::1'::text]) THEN 'disable'::text
ELSE 'require'::text
END) ||
CASE
WHEN geometry_columns.srid IS NOT NULL THEN ' srid='::text || geometry_columns.srid
ELSE ''::text
END) ||
CASE
WHEN geometry_columns.type IS NOT NULL THEN ' type='::text || geometry_columns.type::text
ELSE ''::text
END) || ' table="'::text) || gestion_schema.nom_schema::text) || '"."'::text) || pg_class.relname::text) ||
CASE
WHEN geometry_columns.f_geometry_column IS NOT NULL THEN ('" ('::text || quote_ident(geometry_columns.f_geometry_column::text)) || ') sql=::'::text
ELSE '" sql=:::::NoGeometry'::text
END AS datasource_uri
FROM pg_class
JOIN z_asgard_admin.gestion_schema ON pg_class.relnamespace::regnamespace::text = quote_ident(gestion_schema.nom_schema::text)
LEFT JOIN geometry_columns ON geometry_columns.f_table_schema = gestion_schema.nom_schema::name AND geometry_columns.f_table_name = pg_class.relname
LEFT JOIN index_niv1 ON COALESCE::text = index_niv1.niv1b::text
LEFT JOIN index_niv2 ON COALESCE = index_niv2.niv2b AND COALESCE::text = index_niv2.niv1bref::text
WHERE gestion_schema.bloc ='c' and (pg_class.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'm'::"char", 'f'::"char", 'p'::"char"])) AND has_table_privilege(pg_class.oid, 'SELECT'::text) AND has_schema_privilege(pg_class.relnamespace, 'USAGE'::text)
;

ALTER TABLE z_asgard.qgis_menubuilder_metadata
OWNER TO g_admin_ext;
COMMENT ON VIEW z_asgard.qgis_menubuilder_metadata
IS 'ASGARD. MenuBuilder. Vue appelée par le plugin MenuBuilder de QGIS.
Elle contient une ligne par table, table étrangère, vue, vue matérialisée et, le cas échéant, par champ de géométrie, dès lors que l''utilisateur dispose de droits de lecture sur l''objet.';

GRANT ALL ON TABLE z_asgard.qgis_menubuilder_metadata TO g_admin;
GRANT SELECT, TRIGGER ON TABLE z_asgard.qgis_menubuilder_metadata TO rg_consultation WITH GRANT OPTION;
GRANT ALL ON TABLE z_asgard.qgis_menubuilder_metadata TO g_admin_ext;
GRANT SELECT ON TABLE z_asgard.qgis_menubuilder_metadata TO g_consult;
GRANT ALL ON TABLE z_asgard.qgis_menubuilder_metadata TO rg_adminddt WITH GRANT OPTION;@

Cette vue génère 535 lignes

Mis à jour par Leslie Lemaire il y a presque 4 ans

message de Michel Auzanneau du 2020.06.22

La base contient 7039 tables/vues avec 1803 champs geom présents dans la vue geometry_columns

Voici un message d'erreur que j'ai réussi à avoir une seule fois, la plupart du temps, plantage complet sans pouvoir afficher les erreurs python

ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
File "C:/Program Files/QGIS 3.4/apps/qgis-ltr/./python\qgis\utils.py", line 344, in startPlugin
plugins[packageName].initGui()
File "C:/Users/michel.auzanneau/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\MenuBuilderForAsgard\menu_builder.py", line 105, in initGui
self.dlg.restore_session()
File "C:/Users/michel.auzanneau/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\MenuBuilderForAsgard\menu_builder_dialog.py", line 757, in restore_session
self.show_dock(bool(dock), profile=profile, schema=schema)
File "C:/Users/michel.auzanneau/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\MenuBuilderForAsgard\menu_builder_dialog.py", line 162, in show_dock
self.update_model(self.dock_model, schema, profile)
File "C:/Users/michel.auzanneau/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\MenuBuilderForAsgard\menu_builder_dialog.py", line 298, in wrapped
return func(inst, *args, **kwargs)
File "C:/Users/michel.auzanneau/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\MenuBuilderForAsgard\menu_builder_dialog.py", line 512, in update_model
comment = self.get_table_comment(uri_struct.uri)
File "C:/Users/michel.auzanneau/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\MenuBuilderForAsgard\menu_builder_dialog.py", line 656, in get_table_comment
.split('.')
ValueError: too many values to unpack (expected 2)

Mis à jour par Leslie Lemaire il y a presque 4 ans

message de Leslie Lemaire du 2020.06.22

Il y a peut-être plusieurs problèmes, mais l'erreur en question viendrait d'une table ou d'une vue telle que "nom_schema"."nom_table" contiendrait un autre caractère "." en plus du point qui sépare le schéma de la table. Est-ce que tu aurais un objet de ce type dans ta base ?

De toute évidence, la table incriminée n'est pas dans un schéma du bloc c, puisque là ça fonctionne.

Pour identifier les lignes avec des datasource_uri problématiques :
SELECT * FROM z_asgard.qgis_menubuilder_metadata WHERE datasource_uri ~ 'table[=]["][^[:space:]]*[.][^[:space:]]*[.][^[:space:]]*["]:space:' ;

Ou la liste des tables avec des points dans les noms :
SELECT * FROM pg_class WHERE relname ~ '[.]' OR relnamespace::regnamespace::text ~ '[.]' ;

Tant qu'on est sur des objets de la forme "a.b"."c" ou "a"."b.c" et pas "a"."b"."c" (ce dont j'aimerais être certaine), cette anomalie-là peut être évitée en modifiant deux lignes du plugin. Ci-joint (mot de passe asgard), le fichier menu_builder_dialog.py avec correctif. Il faut remplacer le fichier du même nom qui se trouve dans \AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\MenuBuilder (ou un chemin du même genre).

Tu peux tester pour voir si ça fonctionne. Mais je serais quoi qu'il en soit curieuse de savoir d'où venait le point en trop - s'il s'agit d'une exception ou d'un cas d'usage non anticipé.

Pour "a"."b"."c", ce ne serait pas dur non plus, mais ce que j'ai fait là ne marchera pas.

Mis à jour par Leslie Lemaire il y a presque 4 ans

edit : les requêtes sans mise en forme douteuse

SELECT * FROM z_asgard.qgis_menubuilder_metadata WHERE datasource_uri ~ 'table[=]["][^[:space:]]*[.][^[:space:]]*[.][^[:space:]]*["][[:space:]]' ;

SELECT * FROM pg_class WHERE relname ~ '[.]' OR relnamespace::regnamespace::text ~ '[.]' ;

Mis à jour par Leslie Lemaire il y a presque 4 ans

  • % réalisé changé de 0 à 90

message de Michel Auzanneau du 2020.06.23

Bien vu !

Il y avait effectivement une table qui bizarrement contenait la chaine ".shp"

J'avais également quelques "." dans des index, des clef primaires et des séquences.

Je vais tester cet après midi ta correction du plugin pour éviter le plantage sur ce type de nommage.

Avec le plugin actuel et après correction des anomalie de nommage, en présentiel ça fonctionne très bien. Le ralentissement du démarrage de QGIS est également bien moindre et tout à fait acceptable même avec les 3277 lignes de la vue.

message de Leslie Lemaire du 2020.06.23

Contente de savoir que ça fonctionne. J'attends donc ton retour sur le correctif du plugin.

J'espère que le problème du temps de chargement était lié au bug, même si le lien n'est pas évident. Si tu as l'occasion de refaire le test en VPN un de ces jours pour confirmer...

Mis à jour par Leslie Lemaire il y a presque 4 ans

  • Statut changé de En cours à Fermé
  • % réalisé changé de 90 à 100
Actions

Formats disponibles : Atom PDF