Closed maudetes closed 2 years ago
Enrichissement des métadonnées avec rapport validata en cours sur le sprint Data Eng : https://github.com/etalab/qualite-des-donnees/issues/27
métadonnées ajoutées pour le schéma :
"validation-report:errors": [],
"validation-report:nb_errors": 100,
"validation-report:schema_name": "etalab/schema-irve",
"validation-report:schema_type": "tableschema",
"validation-report:schema_version": "2.0.2",
"validation-report:valid_resource": false,
"validation-report:validation_date": "2022-03-29 06:13:55.856106",
"validation-report:validator": "validata"
En cours de réflexion, ajout d'autres métadonnées, réflexion en cours ici : https://www.notion.so/apigouv/Qualit-des-ressources-ba30ef20e5f94273bf240ab5bb76f31d
Je propose de modifier le modèle de l'objet resource
dans udata de la manière suivante :
modifier la logique de la métadonnées extras
aujourd'hui utilisée pour ajouter tout un tas d'informations diverses. Cette métadonnée extras
reste à la disposition des producteurs de données s'ils souhaitent ajouter des données en extras mais pour les métadonnées ajoutées par l'admin data.gouv.fr, nous créons de nouvelles propriétés.
Ajouter plusieurs métadonnées extras provenant des différents producer kafka (notamment) :
extras:decapode
: nested objet sans modèle préétabli dans la codebase udata. Contient les informations du check le plus récent de decapode sur la ressource.extras:datalake
: nested objet sans modèle préétabli dans la codebase udata. Contient le mime type détectée et la taille de la ressource affinéeextras:csvdetective
: nested object sans modèle préétabli dans la codebase udata. Contient l'url vers le rapport csv-detective de la ressource. On imagine plutôt une référence à un url qui contient le contenu du rapport json quelque part (par exemple sur minio) plutôt que de stocker tout le rapport en base, ce qui alourdirait l'API.extras:schema-admin
: nested object contenant :
generated_schema_url
. Il s'agit d'un schéma généré automatiquement à partir de l'analyse de la ressource.Exemple :
{
"checksum": {
"type": "sha1",
"value": "58ca9356eb297c6a63b940b921adbdd5d01beb9b"
},
"created_at": "2018-09-20T10:29:32.662000",
"description": null,
"extras": {
"check:available": true,
"check:count-availability": 19,
"check:date": "2022-04-29T17:33:49.558000",
"check:status": 204,
"check:url": "https://static.data.gouv.fr/resources/base-sirene-des-entreprises-et-de-leurs-etablissements-siren-siret-page-en-cours-de-construction/20180920-102932/dessinstockunitelegalehistorique.csv"
},
"filesize": 2673,
"filetype": "file",
"format": "csv",
"id": "68033408-e1c6-4e0d-8eb9-c74be82b3467",
"last_modified": "2018-09-24T09:42:31.431000",
"latest": "https://www.data.gouv.fr/fr/datasets/r/68033408-e1c6-4e0d-8eb9-c74be82b3467",
"metrics": {
"views": 142
},
"mime": "text/csv",
"preview_url": "/tabular/preview/?url=https%3A%2F%2Fstatic.data.gouv.fr%2Fresources%2Fbase-sirene-des-entreprises-et-de-leurs-etablissements-siren-siret-page-en-cours-de-construction%2F20180920-102932%2Fdessinstockunitelegalehistorique.csv",
"published": "2018-09-20T10:29:32",
"schema": {
},
"title": "Liste CSV des variables du dessin du fichier StockUniteLegaleHistorique",
"type": "documentation",
"url": "https://static.data.gouv.fr/resources/base-sirene-des-entreprises-et-de-leurs-etablissements-siren-siret-page-en-cours-de-construction/20180920-102932/dessinstockunitelegalehistorique.csv",
"extras:decapode": {
"domain": "www.data.gouv.fr",
"status": 200,
"headers": {
"server": "nginx",
"date": "Mon, 02 May 2022 09:58:47 GMT",
"content-type": "text/plain",
"last-modified": "Thu, 14 Apr 2022 13:25:45 GMT",
"vary": "Accept-Encoding",
"etag": "W/\"625820d9-22c64e2\"",
"expires": "Wed, 01 Jun 2022 09:58:47 GMT",
"cache-control": "max-age=2592000",
"content-disposition": "attachment",
"pragma": "public",
"x-content-type-options": "nosniff",
"x-xss-protection": "1; mode=block",
"x-frame-options": "SAMEORIGIN",
"access-control-allow-origin": "*",
"access-control-allow-methods": "GET, OPTIONS",
"access-control-allow-headers": "Origin,Authorization,Accept,DNT,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Range",
"access-control-allow-credentials": "true",
"content-encoding": "gzip"
},
"timeout": false,
"response_time": 0.16390085220336914,
"check_date": "2022-05-05T10:29:32"
},
"extras:datalake": {
"mime": "text/plain",
"filesize": 2673
},
"extras:csvdetective":
"report_url": "http://object.files.data.gouv.fr/opendata/somewhere/report.json"
},
"extras:schema-admin": {
"generated_schema_url": "http://object.files.data.gouv.fr/opendata/somewhere/schema.json"
"errors": [
],
"nb_errors": 0,
"schema_name": "etalab/schema-irve",
"schema_type": "tableschema",
"schema_version": "2.0.2",
"valid_resource": true,
"validation_date": "2022-05-05 05:14:54.752071",
"validator": "validata"
}
}
Pour l'exposition API :
En terme d'implémentation des extras protégés dans udata, je propose plusieurs possibilités d'implémentation ci-dessous.
NB: la notion d'enregistrement
signifie qu'il est possible de dire que telle clé attend tel type de valeur.
Ex harvest_url
attend un URLField
. Lors de l'enregistrement en base, une validation est effectuée si le duo clé/valeur a été rempli.
Comme les extras qu'on utilise aujourd'hui, avec un namespace, ex harvest:url
.
Les valeurs ne sont pas des dictionnaires.
Les champs sont enregistrés avec une validation côté Mongo.
Possibilité d'ajouter des entrées non-enregistrées.
Peu lisible pour l'utilisateur car de nombreux extras fonctionnels mélangés.
Un champ extra par catégorie (fonctionnelle/service). Voir la proposition ci-dessus. Possibilité d'ajouter des entrées non-enregistrées dans chacun des extras existants. Lisible car découpé par entrées fonctionnelles/par service.
Validation des extras. Nécessité d'exhaustivité lors de l'enregistrement des extras, pas possible d'ajouter d'autres champs à la volée. Lisible car découpé par entrées fonctionnelles/par service.
Validations qu'il s'agit de dictionnaires seulement, pas de validation des champs nested. Pas besoin d'enregistrer les champs exhaustivement. Lisible car découpé par entrées fonctionnelles/par service.
Pour toutes ces solutions, il est possible de faire des requêtes mongo. Dans le cas de requête sur des champs nested, elles ressemblent à :
Dataset.objects(nested_extras__harvest__source_id='test').first()
Dans tous les cas, se pose la question de la manière d'enregistrer
les différents champs extras.
Cette logique étant aujourd'hui ajoutée dans les différents plugins ou dans le core udata utilisant des extras.
N'ayant pas de mécanique de plugin pour l'infra des données, à voir où nous trouvons logique de faire les différents enregistrement.
En complément de ce qui est proposé ici, on peut ajouter une route supplémentaire qui expose les extras et un/des Hateoas pour faciliter l'exposition des différents extras. Ex:
'id': '5de8f397634f4164071119c5',
'title': 'Fichier des personnes décédées',
...
'protected_extras': {
'rel': 'subsection',
'href': 'https://www.data.gouv.fr/api/2/datasets/5de8f397634f4164071119c5/extras',
'type': 'GET'
}
Extraire automatiquement des métadonnées sur les ressources (profiling, noms des colonnes, etc.) et les augmenter dans les méta infos.