datagouv / data.gouv.fr

Ce dépôt rassemble les tickets techniques qui portent sur data.gouv.fr.
https://www.data.gouv.fr
76 stars 14 forks source link

Définir les métadonnées à augmenter au niveau des ressources #728

Closed maudetes closed 2 years ago

maudetes commented 2 years ago

Extraire automatiquement des métadonnées sur les ressources (profiling, noms des colonnes, etc.) et les augmenter dans les méta infos.

geoffreyaldebert commented 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

geoffreyaldebert commented 2 years ago

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

geoffreyaldebert commented 2 years ago

Je propose de modifier le modèle de l'objet resource dans udata de la manière suivante :

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"
      }
    }
geoffreyaldebert commented 2 years ago

Pour l'exposition API :

maudetes commented 2 years ago

Implémentation des Extras

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.

Extras à plat

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.

Plusieurs champs Extras

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.

Champ Extra nested avec des Embedded de classes enregistrées:

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.

Champ Extra nested avec des champs Extra enregistrés

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.

Discussion

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.

API

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'
}
maudetes commented 2 years ago

Liste exhaustive des extras protégés cibles

Niveau ressources

Niveau dataset

:warning: Points d'attention