MTES-MCT / metadata-postgresql

Plume : gestion des métadonnées du patrimoine PostgreSQL
https://mtes-mct.github.io/metadata-postgresql/
GNU Affero General Public License v3.0
1 stars 1 forks source link

Boutons de calcul et calcul automatique #23

Closed alhyss closed 2 years ago

alhyss commented 2 years ago

Nouvelle fonctionnalité qui est maintenant implémentée côté dictionnaire de widgets : le calcul de métadonnées par une requête sur le serveur PostgreSQL.

Pré-requis : issue #22.

Dès lors qu'une méthode de calcul a été prévue dans Plume pour une catégorie donnée, le schéma des métadonnées communes et/ou le modèle de formulaire peuvent demander à ce que cette fonctionnalité soit mise en oeuvre, avec deux formes possibles :

Cf. Création des widgets pour les modalités de création du bouton de calcul. Cf. Métadonnées calculées pour toutes les explications sur les calculs eux-mêmes et l'implémentation du calcul automatique.

À noter que la seule catégorie pour laquelle j'ai défini une méthode de calcul côté serveur est dct:conformsTo (import de tous les référentiels de coordonnées déclarés pour les géométries de la table). L'idée sera d'en ajouter selon les besoins exprimés par le sous-groupe Métadonnées - cf. issue #21. J'ai fait en sorte que ce soit aussi simple que possible de mon côté. La mécanique est complètement générique, il faut juste que je référence la catégorie concernée, la fonction qui génère la requête, une éventuelle fonction de retraitement a posteriori s'il y a besoin de transformer un peu le résultat renvoyé par PostgreSQL, et quelques paramètres (extensions PostgreSQL requises, etc.). Côté gestion des widgets, les futurs ajouts devraient être complètement transparents.

alhyss commented 2 years ago

@WREATCHED Pour info, au cas où tu aurais commencé à travailler là-dessus, j'ai a priori fini d'implémenter ce qu'il y avait à faire pour l'issue #42 et ça ne change rien du tout de ton côté.

La seule chose que j'ai modifiée qui te concerne (sans lien avec l'issue #42), c'est pour le texte à afficher dans les infobulles, qui n'est plus le même pour tous les boutons de calcul. Cf. documentation technique.

alhyss commented 2 years ago

@WREATCHED Comme convenu, pour les tests :


-- création de trois modèles de test
INSERT INTO z_plume.meta_template (tpl_label) VALUES 
    ('Calcul v1 (manual)'), ('Calcul v2 (auto)'), ('Calcul v3 (mixte)') ;

INSERT INTO z_plume.meta_template_categories
    (tpl_label, shrcat_path, compute, compute_params, datatype) VALUES

    ('Calcul v1 (manual)', 'dct:title', ARRAY['manual'], '{"pattern": "^[^.]+"}'::jsonb, NULL),
    ('Calcul v1 (manual)', 'dct:description', ARRAY['manual'], NULL, NULL),
    ('Calcul v1 (manual)', 'dct:conformsTo', ARRAY['manual'], NULL, NULL),
    ('Calcul v1 (manual)', 'dct:created', ARRAY['manual'], NULL, NULL),
    ('Calcul v1 (manual)', 'dct:modified', ARRAY['manual'], NULL, 'xsd:dateTime'),

    ('Calcul v2 (auto)', 'dct:title', ARRAY['manual', 'empty'], '{"pattern": "^[^.]+"}'::jsonb, NULL),
    ('Calcul v2 (auto)', 'dct:description', ARRAY['manual', 'empty'], NULL, NULL),
    ('Calcul v2 (auto)', 'dct:conformsTo', ARRAY['manual', 'auto'], NULL, NULL),
    ('Calcul v2 (auto)', 'dct:created', ARRAY['manual', 'new'], NULL, NULL),
    ('Calcul v2 (auto)', 'dct:modified', ARRAY['manual', 'auto'], NULL, 'xsd:dateTime'),

    ('Calcul v3 (mixte)', 'dct:title', ARRAY['manual'], '{"pattern": "^[^.]+"}'::jsonb, NULL),
    ('Calcul v3 (mixte)', 'dct:description', ARRAY['manual'], NULL, NULL),
    ('Calcul v3 (mixte)', 'dct:conformsTo', ARRAY[]::z_plume.meta_compute[], NULL, NULL),
    ('Calcul v3 (mixte)', 'dct:created', ARRAY['new'], NULL, NULL),
    ('Calcul v3 (mixte)', 'dct:modified', ARRAY['auto'], NULL, 'xsd:dateTime') ;

-- activation de l'enregistrement des dates
ALTER EVENT TRIGGER plume_stamp_table_creation ENABLE ;
ALTER EVENT TRIGGER plume_stamp_table_modification ENABLE ;
ALTER EVENT TRIGGER plume_stamp_table_drop ENABLE ;

-- création d'une table pour visualiser les modèles
CREATE SCHEMA e_cadastre_etalab ;
CREATE TABLE e_cadastre_etalab.parcelles (
    idpar text PRIMARY KEY,
    geom_2154 geometry(multipolygon, 2154),
    geom_4326 geometry(multipolygon, 4326)
) ;
COMMENT ON TABLE e_cadastre_etalab.parcelles IS 'Cadastre Etalab : parcelles. Le Plan Cadastral Informatisé est diffusé sous deux formats experts rendant sa réutilisation difficile en dehors du contexte des applications métiers. Etalab a donc pris l’initiative d’en redistribuer une version retravaillée, dans des formats plus largement répandus. Ces données sont produites à partir des données EDIGÉO du PCI Vecteur et des données cadastrales de l’Eurométropole de Strasbourg.' ;

Ces requêtes créent trois modèles dans lesquels n'apparaissent que les les catégories qui ont à date une méthode de calcul associée, soit Titre, Description, Date de création, Date de dernière modification et Conforme à :

Tu peux tester ça sur les tables que tu veux, mais j'en ai créé une - e_cadastre_etalab.parcelles - qui devrait donner des résultats assez probants.

WREATCHED commented 2 years ago

thanks 😃

alhyss commented 2 years ago

@WREATCHED Comme prévu, j'ai ajusté la méthode pour ne plus avoir de problème de dictionnaire qui change de taille pendant que Plume boucle dessus. C'est expliqué dans Implémentation du calcul automatique, mais pour faire simple, il y a deux choses à changer de ton côté.

    # ** BEFORE SAISIE ** Mode automatique calcul des Métadonnées
    # Lorsque la clé correspond à un widget de saisie, le calcul doit avoir lieu avant la saisie de la valeur dans le widget
    if _valueObjet['auto compute'] :
       #
       action_mObjetQToolButton_ComputeButton(self, _keyObjet, _valueObjet, "BEFORE")
        for key, value in _dict.items_to_compute():
            action_mObjetQToolButton_ComputeButton(self, key, value, 'BEFORE')
        for key, value in _dict.items() :
            ...

Il est normal que tu ne fasses plus de contrôle sur 'auto compute', c'est intégré dans mon générateur.

Sinon ne t'étonne pas de tous les commit que j'ai faits aujourd'hui. La grande majorité n'avait rien à voir avec ça : il s'agissait de faire en sorte que les calculs automatiques ait également lieu en mode lecture. On perdait beaucoup de l'intérêt d'avoir - par exemple - une date de dernière modification mise à jour automatiquement si Plume continuait à afficher la vieille valeur tant que personne n'ouvrait la fiche en mode édition...

WREATCHED commented 2 years ago

C'est Ok pour moi, je clos

WREATCHED commented 2 years ago

J'ai réouvert mais mis en résolu avant diffusion