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

Nouveaux appels #4

Closed alhyss closed 2 years ago

alhyss commented 2 years ago

Salut @WREATCHED,

Ci-après la liste tant attendue des modifications à opérer pour basculer des modules de plume.bibli_rdf et plume.bibli_pg à ceux de plume.rdf et plume.pg.

Je n'ai pas encore mis à jour la doc en conséquence, mais ce sera fait incessamment.

Accessoirement, dans bibli_plume.py, il me paraît possible de supprimer également les imports des modules re, uuid, json et pathlib (idem pour les imports d'objets de ces modules). L'import de psycopg2 me semblerait aussi plus à sa place dans plume_ui.py, considérant qu'il n'est pas utilisé directement par bibli_plume.py.

from plume.rdf.widgetsdict import WidgetsDict
from plume.rdf.metagraph import Metagraph, metagraph_from_file, copy_metagraph
from plume.rdf.utils import export_extension_from_format, import_formats, import_extensions_from_format
from plume.pg.description import PgDescription
from plume.pg.template import TemplateDict, search_template
from plume.pg import queries
import psycopg2
from plume.pg import queries
from plume.rdf.metagraph import copy_metagraph

Il ne sera plus non plus nécessaire de fournir shape et vocabulary en arguments d'aucune fonction. J'évoque ça dans la suite, fonction par fonction.

Le test de cohérence entre mode et translation n'est plus nécessaire non plus, car je le gère désormais de mon côté.

Une interrogation, par contre : à quel moment passais-tu à build_dict tous les autres paramètres (langList, language, readHideBlank, editHideUnlisted, etc.) si ce n'est dans cette fonction ? Ne faudrait-il pas les ajouter ? Ça commencerait à faire une longue liste, donc tu peux peut-être profiter du fait que les noms de tes attributs sont cohérents avec ceux de mes paramètres et écrire quelque chose comme ça :


def returnObjetsMeta(self, _schema, _table):
    kwa = {}
    for param in ('metagraph', 'template', 'columns', 'data', 'mode', 'translation',
        'language', 'langList', 'readHideBlank', 'readHideUnlisted', 'editHideUnlisted',
        'readOnlyCurrentLanguage', 'editOnlyCurrentLanguage', 'labelLengthLimit',
        'valueLengthLimit', 'textEditRowSpan'):
        if getattr(self, param) is not None:
            kwa[param] = getattr(self, param)
    return WidgetsDict(**kwa)

_C'est sans grande importance, mais peut-être que tu peux en profiter pour enlever les arguments _schema et _table ? Je n'ai pas l'impression qu'ils soient encore utiles._

Cette évolution va affecter les fonctions bibli_plume.returnObjetMetagraph et bibli_plume.returnObjetComment. Un point notable est que les éventuelles erreurs de dé-sérialisation (si les balises <METADATA> du descriptif PostgreSQL ne contiennent pas un JSON-LD valide) sont désormais gérées par la classe PgDescription, ce qui a l'intérêt de permettre la préservation du texte qui se trouvait à l'extérieur des balises <METADATA> (pour le reste, c'est toujours un formulaire vierge qui sera présenté à l'utilisateur). Il n'y a donc plus besoin de try ... except dans returnObjetMetagraph.

Dans bibli_plume.returnObjetComment, il s'agira simplement de remplacer :

    return old_description

par :

    return PgDescription(old_description)

bibli_plume.returnObjetMetagraph devient très triviale :

def returnObjetMetagraph(self, old_description) :
    return old_description.metagraph

En conséquence, il faudra remplacer les lignes suivantes de bibli_plume.saveMetaIhm :

    new_pg_description = rdf_utils.update_pg_description(self.comment, self.metagraph, geoideJSON=self.geoideJSON) 
    self.comment = new_pg_description

par :

    self.comment.metagraph = self.metagraph
    new_pg_description = str(self.comment)

_NB : pour autant que je puisse voir, la variable new_pg_description sert ensuite pour la requête de mise à jour sur le serveur PostgreSQL. Il faut donc qu'elle contienne une version textuelle du descriptif, laquelle est obtenue en appliquant str() à l'objet PgDescriptif._

Dans bibli_plume.saveMetaIhm, il faut donc remplacer :

    self.metagraph = self.mDicObjetsInstancies.build_graph(self.vocabulary)

par :

    self.metagraph = self.mDicObjetsInstancies.build_metagraph() 
def returnObjetData(self) :
    return

Il reste pertinent de conserver la fonction, car l'un des sujets restant à discuter avec le sous-groupe métadonnées est celui des catégories qui se mettraient à jour automatiquement à partir d'informations récupérées côté serveur. Tout ça passera par le paramètre data.

Par ailleurs, il faudra voir ce qu'on fait du paramètre utilisateur geoideJSON, qu'il n'est peut-être pas très utile de présenter à l'utilisateur s'il n'a pas d'effet... Peut-être à mettre en commentaire pour l'instant ?

Cela signifie que la fonction bibli_plume.generationTemplateAndTabs n'a plus qu'un argument à renvoyer.

Au lieu de :

    # Génération de template
    self.template = template_utils.build_template(categories)
    ...
    # Génération de templateTabs
    self.templateTabs = template_utils.build_template_tabs(tabs)
    return self.template, self.templateTabs 

Il suffit de :

    ...
    # Génération de template
    self.template = TemplateDict(categories, tabs)
    return self.template

NB : Les lignes non reproduites sont inchangées. Il faut évidemment que l'import des onglets soit avant le bloc de code ci-dessus.

Avant :

self.template, self.templateTabs = bibli_plume.generationTemplateAndTabs(self, tpl_labelDefaut)

Après :

self.template = bibli_plume.generationTemplateAndTabs(self, tpl_labelDefaut)

Dans bibli_plume.returnObjetTpl_label, tu peux remplacer :

       tpl_label = template_utils.search_template(self.metagraph, self.templates)

par :

       tpl_label = search_template(self.templates, self.metagraph)

Dans bibli_gene_objets.action_mObjetQToolButton, les lignes suivantes :

    for elem in ret['concepts list to update'] : 
        __valueObjet = self.mDicObjetsInstancies[elem]
        schemeIRI = __valueObjet['current source URI']
        # récupération de la liste si déjà constituée
        _thesaurus = self.thesaurusCollection.get((schemeIRI, _language))
        if _thesaurus is None:
           # sinon, construction de la liste
           _thesaurus = rdf_utils.build_vocabulary(schemeIRI, self.vocabulary, _language, value=__valueObjet['value'])
           # mémorisation dans thesaurusCollection
           if not schemeIRI == '< non répertorié >':
              self.thesaurusCollection.update( { (schemeIRI, _language) : _thesaurus } )

deviennent :

    for elem in ret['concepts list to update'] : 
        __valueObjet = self.mDicObjetsInstancies[elem]
        _thesaurus = __valueObjet['thesaurus values']

De même, dans bibli_gene_objets.generationObjets, tu peux remplacer le bloc :

       if _valueObjet['main widget type'] in ("QComboBox") :
          schemeIRI = _valueObjet['current source URI']
          # récupération de la liste si déjà constituée
          _thesaurus = self.thesaurusCollection.get((schemeIRI, _language))
          if _thesaurus is None:
             # sinon, construction de la liste
             _thesaurus = rdf_utils.build_vocabulary(schemeIRI, self.vocabulary, _language, value=_valueObjet['value'])
             # mémorisation dans thesaurusCollection
             if not schemeIRI == '< non répertorié >':
                self.thesaurusCollection.update( { (schemeIRI, _language) : _thesaurus } )

par :

       if _valueObjet['main widget type'] in ("QComboBox") :
          _thesaurus = _valueObjet['thesaurus values']

À supprimer :

        self.thesaurusCollection = {} # nécessaire pour première instance  (Stockage des thésaurus)

Dans bibli_plume.exportObjetMetagraph, il faudra remplacer :

    try:
       rdf_utils.export_metagraph(self.metagraph, self.shape, fileName, extension)

par :

    try:
       self.metagraph.export(fileName, extension)

Aucun rapport, mais c'est un peu bizarre tu fournisses l'extension du fichier en argument, ici. Ce qu'attend la fonction, c'est le format qu'a choisi l'utilisateur dans le menu d'export.

Dans plume_ui.Ui_Dialog_plume.majQmenuExportIconFlag, tu peux remplacer :

        mListExtensionExport = rdf_utils.available_formats(self.metagraph, self.shape)

par :

        mListExtensionExport = self.metagraph.available_formats

Dans bibli_plume.importObjetMetagraph, tu peux remplacer :

    try:
       old_metagraph = self.metagraph
       raw_metagraph  = rdf_utils.metagraph_from_file(filepath)
       metagraph = rdf_utils.clean_metagraph(raw_metagraph , self.shape, old_metagraph)

par :

    try:
       old_metagraph = self.metagraph
       metagraph  = metagraph_from_file(filepath, old_metagraph=old_metagraph)

D'ailleurs, est-ce cette fonction n'utilise pas toujours le couple URL/identifiant que tu as figé dans le code au lieu de ceux fournis par l'utilisateur ? Ou tu as modifié ça après avoir remonté tes modifications sur le Git, peut-être ?

Dans `plume_ui.Ui_Dialog_plume.displayToolBar, tu pourras remplacer :

mKeySql = (queries.query_exists_extension(), ('metadata',))

par :

mKeySql = (queries.query_exists_extension(), ('plume_pg',))

Juste après, pour le message affiché en infobulle si l'extension n'est pas installée, ce serait : L'extension PostgreSQL plume_pg n'est pas installée..

WREATCHED commented 2 years ago

Quel travail que tu as fait ... Je ne sais pas si beaucoup de personnes se rendent compte.

Donc, j'ai fait toutes les modifs, mais je veux nettoyer le code de mes commentaires pour tests etc ...... et Il me reste à tester ......

BRAVO

alhyss commented 2 years ago

Merci !!!

WREATCHED commented 2 years ago

Leslie, Peut-être un oubli, ,mais je voudrais ta confirmation même si c'est moi qui ait écrit le code Dans le importcsw.py

      `self.Dialog.generationALaVolee(bibli_plume.returnObjetsMeta(self.Dialog, self.Dialog.schema, self.Dialog.table))`

à transformer en :

     ` self.Dialog.generationALaVolee(bibli_plume.returnObjetsMeta(self.Dialog, self.Dialog.metagraph))`

voir

      `self.Dialog.generationALaVolee(bibli_plume.returnObjetsMeta(self.Dialog, old_metagraph))`

ce qui revient au même mais peut-être plus clair vu que au dessus j'ai mis

      `raw_xml, old_metagraph = self.returnXml( url_csw, file_identifier ), self.Dialog.metagraph`
WREATCHED commented 2 years ago

Non, pas ça mais ça self.Dialog.generationALaVolee(bibli_plume.returnObjetsMeta(self.Dialog))

alhyss commented 2 years ago

Oui plutôt ça ! Si tu as juste enlevé ses arguments _schema et table à plume.bibli_plume.returnObjetsMeta, alors la dernière proposition me semble bonne.

WREATCHED commented 2 years ago

Après tests avec Leslie, c'est OK