Skip to content

Nexus: Ajout d'une synchronisation de données pour les analyses des utilisateurs Nexus - #7058

Merged
tonial merged 1 commit into
masterfrom
alaurent/stats_nexus
Oct 30, 2025
Merged

tonial merged 1 commit into
masterfrom
alaurent/stats_nexus

Conversation

@tonial

@tonial tonial commented Oct 27, 2025

Copy link
Copy Markdown
Contributor

🤔 Pourquoi ?

Pour Nexus, nous souhaitons suivre l'inscription d'utilisateurs aux différents services et leur rattachements aux structures.
https://www.notion.so/gip-inclusion/Importer-les-tables-utilisateurs-des-produits-PDI-dans-un-metabase-28c5f321b60480519a66d7df815e868d

🍰 Comment ?

Création d'une management command "clé en main" qu'on peut copier dans les autres projets django facilement (dora, communauté, marché)
Donc sans se base sur le code du pilotage.

🚨 À vérifier

  • Mettre à jour le CHANGELOG_breaking_changes.md ?
  • Ajouter l'étiquette « Bug » ?

🏝️ Comment tester ?

Les instructions pour reproduire le problème, les profils de test, le parcours spécifique à utiliser, etc. Si vous disposez d'une recette jetable, mettre l'URL pour tester dans cette partie.

💻 Captures d'écran

@tonial tonial self-assigned this Oct 27, 2025
@tonial tonial added the ajouté Ajouté dans le changelog. label Oct 27, 2025
@tonial
tonial force-pushed the alaurent/stats_nexus branch 2 times, most recently from 235644e to aff6610 Compare October 27, 2025 15:21

@rsebille rsebille left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Même si je vois le coté pratique pour là maintenant, ça me semble extrêmement fragile et très vite galère à faire évoluer comme manière de faire 🫤 :

  • N'importe qui peux supprimer les tables ou les recréer avec un autre schéma
  • N'importe qui peux accéder aux données injectées par les autres
  • La synchronisation des migrations sur le schéma commun va demander une modif' dans tous les producteurs
  • A partir du moment où il faudra normaliser (casse et format des champs, énumérations, ...) ou vérifier les données, il va falloir le faire dans chaque producteur.
  • La création d'un identifiant unique ne devrais pas être porter par le producteur de donnée, qui par définition n'a pas connaissance des autres
  • L'injection de donnée directement dans la DB c'est chiant, ça oblige à faire des shenanigans de rééssais, ça complexifie les investigations en cas d'erreur vu qu'on ne peux pas savoir exactement ce qui à été envoyée, ça oblige les data de récupérer les données de la DB de prod pour avancer en local.
  • Coté Nexus vous ne contrôlez pas ce qui arrive chez vous donc des choses vont "casser", et parfois sans que vous vous en rendiez compte, c'est typiquement ce qui arrive sur certain DAG coté Pilotage car on fait des copies 1-1 d'une source dans une table de la DB

En reprenant ton idée d'avoir une commande clés en main, je verrais plutôt cette commande envoyer les données sous format plat, et ensuite avoir une autre commande (peut être dans les emplois, un airflow coté M3, une app dédié, ...) qui va les chercher pour les traiter et les mettre là où il faut comme il faut.

@tonial
tonial force-pushed the alaurent/stats_nexus branch from aff6610 to e4b1d4c Compare October 28, 2025 14:02
@tonial

tonial commented Oct 28, 2025

Copy link
Copy Markdown
Contributor Author

Suite à notre discussion : l'idéal serait d'avoir un s3 avec un dossier par produit
Chaque produit génère 3 csv (un par table) avec les données déjà formatées (seul dora est capable de nous donner l'id unique d-i d'une structure)
Puis un outil de centralisation (une management command sur les emplois) s'occupe de tout envoyer dans la db commune.

On va rester pour l'instant sur cette version là qui va migrer dans une librairie de code commun à la PDI qui sera bientôt créée

@tonial
tonial requested a review from rsebille October 28, 2025 14:07
@tonial
tonial force-pushed the alaurent/stats_nexus branch 2 times, most recently from 3e91ca9 to afbf303 Compare October 29, 2025 09:48

@xavfernandez xavfernandez left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tout d'accord avec @rsebille 😬

@leo-naeka leo-naeka left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Romain voit juste avec #7058 (review), faudra y revenir…

Comment thread itou/nexus/management/commands/populate_metabase_nexus.py Outdated
Comment thread itou/nexus/management/commands/populate_metabase_nexus.py Outdated
@tonial

tonial commented Oct 30, 2025

Copy link
Copy Markdown
Contributor Author

J'ai bien vu vos commentaires, une fois la première version en place, je passerai à une version avec échanges de fichiers plats.

@tonial
tonial force-pushed the alaurent/stats_nexus branch from afbf303 to 492d938 Compare October 30, 2025 13:06
@tonial
tonial force-pushed the alaurent/stats_nexus branch from 492d938 to 43612aa Compare October 30, 2025 13:07
@tonial
tonial added this pull request to the merge queue Oct 30, 2025
Merged via the queue into master with commit 91a99f0 Oct 30, 2025
14 checks passed
@tonial
tonial deleted the alaurent/stats_nexus branch October 30, 2025 13:36
Comment on lines +143 to +153
"source": "text",
"id_source": "text",
"id_unique": "text",
"nom": "text",
"prénom": "text",
"email": "text",
"téléphone": "text",
"last_login": "timestamp with time zone",
"auth": "text",
"type": "text",
"updated_at": "timestamp with time zone",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'arrive un peu tard mais le franglais n'est pas gênant ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

c'est pas totalement idéal, non.
Je corrigerais dans la V2 avec fichiers plats


def populate_memberships(self):
employers_qs = (
CompanyMembership.objects.active().select_related("company").only("company__uid", "user_id", "is_admin")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On a active() par défaut dans le manager, c'est pour être plus résilient qu'il est là aussi ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Un oubli


def populate_structures(self):
prescribers_qs = PrescriberOrganization.objects.select_related("insee_city")
company_qs = Company.objects.select_related("insee_city")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'imagine qu'on est à peu près à jour avec les management commands des flux IAE, mais juste au cas où : on n'a pas besoin de l'info is_searchable ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pour moi non parce qu'un utilisateur peut appartenir à une entreprise non visible

@tonial tonial changed the title Stats: Ajout d'une synchronisation de données pour les analyses des utilisateurs Nexus Nexus: Ajout d'une synchronisation de données pour les analyses des utilisateurs Nexus Oct 30, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ajouté Ajouté dans le changelog.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants