ecolabdata / ckanext-ecospheres

GNU Affero General Public License v3.0
3 stars 0 forks source link

Erreurs lors du moissonnage de catalogues DCAT (hors Dido) #9

Open streino opened 1 year ago

streino commented 1 year ago

J'ai des erreurs sur les moissonnages DCAT testés hors Dido.

Data.gouv

2022-12-07 13:32:18,731 DEBUG [ckanext.dcat.harvesters.rdf] In DCATRDFHarvester gather_stage
2022-12-07 13:32:18,734 DEBUG [ckanext.dcat.harvesters.base] Getting file https://www.data.gouv.fr/fr/organizations/ministere-de-la-transition-ecologique/catalog.xml
...
2022-12-07 13:32:26,738 DEBUG [ckanext.dcat.harvesters.rdf] In DCATRDFHarvester import_stage
2022-12-07 13:32:26,830 ERROR [ckanext.ecospheres.dcat.harvester] Erreur lors du traitement du champ territory: expected string or bytes-like object
2022-12-07 13:32:26,858 DEBUG [ckanext.harvest.model] Create validation Error: {'Titre': 'Valeur manquante'}
...
2022-12-07 13:32:37,203 DEBUG [ckanext.harvest.logic.action.update] Notifications: All:False On error:False Errors:96

Géocatalogue

2022-12-07 13:37:44,685 DEBUG [ckanext.dcat.harvesters.rdf] In DCATRDFHarvester gather_stage
2022-12-07 13:37:44,688 DEBUG [ckanext.dcat.harvesters.base] Getting file http://www.geocatalogue.fr/www/dcat/665c9410d957711375d014ec350091ff/catalog_1.rdf
...
2022-12-07 13:37:52,646 DEBUG [ckanext.dcat.harvesters.rdf] In DCATRDFHarvester import_stage
2022-12-07 13:37:52,705 ERROR [ckanext.ecospheres.dcat.harvester] Erreur lors du traitement du champ territory: expected string or bytes-like object
2022-12-07 13:37:52,726 DEBUG [ckanext.harvest.model] Create validation Error: {'Titre': 'Valeur manquante', 'Mots-clés': 'Le mot-clé "territoire à risques importants d\'inondation" ne peut contenir que des lettres minuscules, des chiffres ou les symboles : -_.'}
...
2022-12-07 13:38:02,506 DEBUG [ckanext.harvest.logic.action.update] Notifications: All:False On error:False Errors:99

Il semble qu'il y a au moins 3 erreurs différentes :

alhyss commented 1 year ago

Concernant territory.

  1. Je ne vois pas de mapping/calcul à partir des métadonnées pour ce champ. Ça aurait été dans cette partie de la fonction parse_dataset), mais il n'y a rien. C'est un manque. Lorsque la propriété dct:spatial est présente et qu'on y trouve un ou plusieurs URI du code géographique de l'INSEE ou du vocabulaire européen des territoires administratifs (ou un label permettant de reconnaître un de ces URI), il est possible d'en déduire les territoires correspondants en allant interroger les tables de synonymes des vocabulaires. Elle n'a pas encore été réécrite pour interroger des données en base et pas en JSON, mais c'est la méthode VocabularyJSONReader.get_ecospheres_territory qui s'en charge. À titre de référence, le traitement serait assez proche de ce que j'ai écrit pour les métadonnées INSPIRE.
  2. Aujourd'hui (et comme cela devra effectivement toujours être le cas lorsque le ou les territoires n'ont pas pu être déduits des métadonnées), c'est la méthode DCATfrRDFHarvester.before_create qui donne une valeur à la propriété, en récupérant les territoires associés à l'organisation. Et elle plante sur l'exécution de la fonction re.match avec une erreur TypeError: expected string or bytes-like object si, dans l'extrait de code suivant, territories_codes est nul, ce qui arrivera s'il n'y avait pas de territoire associé à l'organisation.
                    territories_codes=self._get_territory(org)
                    res=re.match(r'{(.*)}',territories_codes)

    Il est acceptable pour une organisation de ne pas avoir de territoire. Même s'il est possible que cela change à l'avenir, c'est aujourd'hui le cas pour les organisations à compétence nationale. Il faut consolider le code pour s'assurer qu'il n'y a pas d'erreur dans ce cas.

  3. Accessoirement :
    • Je n'ai pas bien compris pourquoi cette opération avait lieu quand la propriété spatial n'est pas définie et pas quand la propriété territory n'est pas définie.
                 spatial=dataset_dict.get("spatial",None) 
                 if not spatial:
    • Il serait sans doute préférable d'utiliser un validateur pour ça, plutôt que d'implémenter exactement le même mécanisme dans tous les moissonneurs ? Je le ferai lorsque je reprendrai le mapping INSPIRE.
    • Je ne comprends pas pourquoi on se retrouve à utiliser re.match et str.split sur la liste des territoires alors que c'est un dump JSON qui a seulement besoin d'être désérialisé...