ecolabdata / ecospheres

Portail des données de la transition écologique et de la cohésion des territoires
https://ecologie.data.gouv.fr
2 stars 0 forks source link

Copier le dashboard patrimoine sur la prod #451

Closed abulte closed 17 hours ago

abulte commented 2 weeks ago

Needs #442

Objectif : dupliquer le dashboard patrimoine existant sur demo pour utiliser la nouvelle base de prod.

Le faire de la manière la plus automatique / réplicable possible

abulte commented 2 weeks ago

Option 1 :

  1. Utiliser "Save as" sur le dashboard existant et choisir l'option "Duplicate charts" https://github.com/apache/superset/issues/4963
  2. On obtient un nouveau dashboard et de nouveaux charts associés
  3. Il faut alors changer la source pour chacun des charts (tedious)
abulte commented 2 weeks ago

Option 2 :

  1. 1/ et 2/ ci-dessus
  2. exporter le nouveau dashboard
  3. scripter les changements nécessaires
  4. réimporter le nouveau dashboard modifié
abulte commented 2 weeks ago

J'ai écrit une première version du script pour 3/, ça a l'air faisable.

Mais il semble y avoir un problème en amont : un dashboard dupliqué (save as) ne peut pas être réimporté, même sans le modifier avec un script. On n'a pas ce problème avec un dashboard original (non dupliqué).

En creusant un peu, il y a beaucoup d'informations dans l'export du dashboard dupliqué qui n'ont pas été migrées depuis le dashboard original, notamment les chart_id.

Exemple dans le fichier d'import du dashboard (même ids que dans l'original) :

metadata:
  chart_configuration:
    '11':
      id: 11
      crossFilters:
        scope: global
        chartsInScope:
        - 7
        - 8
        - 9
        - 10
        - 12
        - 13
        - 14
        - 15
        - 17
        - 18
        - 19
        - 20

Alors que les nouveaux chart_id sont plutôt dans les 60 :

position:
  CHART-explore-10-1:
    children: []
    id: CHART-explore-10-1
    meta:
      chartId: 61
      height: 28
      sliceName: "Jeux de donn\xE9es moissonn\xE9s"
      uuid: a05ab325-c513-42eb-aa37-290c8dae15f4
      width: 3
    parents:
    - ROOT_ID
    - TABS-qRC-CeAyM1
    - TAB-wvx-oFaL9G
    - ROW-0bIIdAEYib
    type: CHART

Pour référence, l'erreur à l'import :

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/app/.heroku/python/lib/python3.11/site-packages/superset/cli/importexport.py", line 158, in import_dashboards
    ImportDashboardsCommand(contents, overwrite=True).run()
  File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/dispatcher.py", line 68, in run
    raise exc
  File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/dispatcher.py", line 57, in run
    command.run()
  File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/importers/v1/__init__.py", line 82, in run
    raise self.import_error() from ex
superset.commands.dashboard.exceptions.DashboardImportError: Import dashboard failed for an unknown reason
2024-11-07 06:54:02,213:ERROR:superset.cli.importexport:There was an error when importing the dashboards(s), please check the exception traceback in the log
Traceback (most recent call last):
  File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/importers/v1/__init__.py", line 75, in run
    self._import(self._configs, self.overwrite)
  File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/v1/__init__.py", line 138, in _import
    config = update_id_refs(config, chart_ids, dataset_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/v1/utils.py", line 100, in update_id_refs
    metadata["expanded_slices"] = {
                                  ^
  File "/app/.heroku/python/lib/python3.11/site-packages/superset/commands/dashboard/importers/v1/utils.py", line 101, in <dictcomp>
    str(id_map[int(old_id)]): value
        ~~~~~~^^^^^^^^^^^^^
KeyError: 11
abulte commented 2 weeks ago

La seule référence aux anciens ids qui pose problème est celle-ci (dans le yaml du dashboard) :

  expanded_slices:
    '11': true

Je la supprime 🤷 et je vois si je peux faire atterrir une première version du script de migration.

abulte commented 2 weeks ago

J'arrive à importer correctement un export de dashboard que j'ai modifié à ma sauce :

En revanche, ça ne met pas à jour les charts 😬 https://github.com/apache/superset/blob/de8282cea0d36c41ce2b780cc5f13ce9d5d3f0ee/superset/commands/dashboard/importers/v1/__init__.py#L122

Il est possible de modifier l'export du dashboard en type charts (slice), je teste ça.

abulte commented 2 weeks ago

En faisant un export de type Chart, on arrive à quelque chose de satisfaisant (les charts pointent vers le nouveau dataset).

Le processus crée de nouveaux charts pour la prod avec le même nom que ceux de démo. On ne peut pas changer leur nom, car cela change le nom sur le dashboard. Il n'y a pas de notion de tag. On peut utiliser la description qui affiche une petite infobulle dans la liste des charts et permet de les différencier. On peut aussi filtrer en fonction du dashboard auquel sont attachés les charts.

Image

abulte commented 2 weeks ago

Si on récapitule, la procédure de duplication initiale est la suivante :

Pour la mise à jour, en admettant qu'on développe sur le dashboard démo et qu'on veuille mettre à jour celui de prod, on pourrait faire :

(à valider)

Source du script (à migrer dans un repo ou dans le dépôt ecospheres-dashboard) https://gist.github.com/abulte/1f4b16cae0824ee11a3f1b539daed83c

abulte commented 1 week ago

Re mise à jour, le process envisagé ne marche pas, il faut :

Ce qui n'est pas optimal... On voudrait pouvoir exporter à nouveau le dashboard source et le mapper sur le dashboard cloné sans avoir à le supprimer.

abulte commented 1 week ago

Le dashboard est dupliqué via la méthode décrite ci-dessus https://dashboard.data.developpement-durable.gouv.fr/superset/dashboard/8/

J'ai dû supprimer manuellement les colonnes harvest__ckan_name et harvest__ckan_source du Dataset catalog_organization de prod (colonnes inutiles qui n'existent plus sur la prod). Je l'ai fait aussi sur le Dataset de demo (future-proofing).

J'ai aussi renommé les Datasets de prod avec un suffixe _prod pour plus de clarté (aurait pu être fait dans le script).

La mise à jour demo -> prod (ou prod -> demo) sera un autre sujet, hors scope de ce ticket.

abulte commented 1 week ago

Pour référence, l'export mouliné dashboard_export_20241112T124830_OUTPUT.zip