Projet

Général

Profil

Bug #21198

nanterre: mise à jour des fédérations depuis un export métier

Ajouté par Benjamin Dauvergne il y a plus de 6 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
16 janvier 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Depuis un export CSV des fédérations pour une application métier un écran dans l'interface d'administration doit permettre:
  • de choisir une application métier cible et de charger le fichier,
  • de contrôler les actions qui seront accomplies: nombre de fédérations à supprimer principalement, nombre de fédérations conservées et nombre de fédérations inconnue (clé métier inconnue du RSU)
  • d'exporter un CSV RSUID, NOM, PRÉNOM, CLÉ, ACTION donnant le détail des décomptes affichés
  • d'appliquer la suppression des fédérations inconnues
L'implémentation:
  • un écran affichant les imports en cours, un bouton vers un écran permettant d'en créer un nouveau, pour chaque import on peut le supprimer ou l'appliquer,
  • stockage du fichier uploadé sur le disque
  • création d'un job d'import,
    { 
       'application': '<id application métier>',
       'app_id_csv': '<chemin du fichier CSV>',
    }
    
  • à l'exécution du job on complète la description des décomptes prévus et d'un nouveau fichier CSV celui des actions à accomplir
  • le bouton d'application du fichier importé crée un job d'exécution
    {
    
       'application': '<id application métier>',
       'app_id_csv': '<chemin du fichier CSV>',
       'import_job_id': '<id du premier job>',
    }
    

Fichiers

0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch (1,22 ko) 0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch Benjamin Dauvergne, 19 janvier 2018 15:28
0005-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch (23,8 ko) 0005-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch Benjamin Dauvergne, 19 janvier 2018 15:28
0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch (1007 octets) 0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch Benjamin Dauvergne, 19 janvier 2018 15:28
0003-zoo_data-toujours-lier-une-action-son-job-21198.patch (1,33 ko) 0003-zoo_data-toujours-lier-une-action-son-job-21198.patch Benjamin Dauvergne, 19 janvier 2018 15:28
0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch (1,08 ko) 0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch Benjamin Dauvergne, 19 janvier 2018 15:28
0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch (1,43 ko) 0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch Benjamin Dauvergne, 19 janvier 2018 15:31
nouveau-bouton.png (15,1 ko) nouveau-bouton.png Benjamin Dauvergne, 19 janvier 2018 16:28
nouvel-import.png (21,3 ko) nouvel-import.png Benjamin Dauvergne, 19 janvier 2018 16:28
liste-des-jobs.png (75,3 ko) liste-des-jobs.png Benjamin Dauvergne, 19 janvier 2018 16:28
rapport-avant-import.png (31,4 ko) rapport-avant-import.png Benjamin Dauvergne, 19 janvier 2018 16:28
0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch (1,39 ko) 0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch Benjamin Dauvergne, 19 janvier 2018 16:44
0005-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch (25,1 ko) 0005-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch Benjamin Dauvergne, 19 janvier 2018 16:44
0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch (1007 octets) 0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch Benjamin Dauvergne, 19 janvier 2018 16:44
0003-zoo_data-toujours-lier-une-action-son-job-21198.patch (2,74 ko) 0003-zoo_data-toujours-lier-une-action-son-job-21198.patch Benjamin Dauvergne, 19 janvier 2018 16:44
0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch (1,08 ko) 0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch Benjamin Dauvergne, 19 janvier 2018 16:44
0006-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch (29,3 ko) 0006-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch Benjamin Dauvergne, 24 janvier 2018 15:51
0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch (1,39 ko) 0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch Benjamin Dauvergne, 24 janvier 2018 15:51
0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch (1007 octets) 0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch Benjamin Dauvergne, 24 janvier 2018 15:51
0003-zoo_data-toujours-lier-une-action-son-job-21198.patch (2,74 ko) 0003-zoo_data-toujours-lier-une-action-son-job-21198.patch Benjamin Dauvergne, 24 janvier 2018 15:51
0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch (1,08 ko) 0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch Benjamin Dauvergne, 24 janvier 2018 15:51
0005-zoo_data-ajoute-des-permissions-g-n-riques-en-vue-d-.patch (2,55 ko) 0005-zoo_data-ajoute-des-permissions-g-n-riques-en-vue-d-.patch Benjamin Dauvergne, 24 janvier 2018 15:51
0006-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch (29,8 ko) 0006-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch Benjamin Dauvergne, 24 janvier 2018 16:01
0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch (1,39 ko) 0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch Benjamin Dauvergne, 24 janvier 2018 16:01
0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch (1007 octets) 0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch Benjamin Dauvergne, 24 janvier 2018 16:01
0003-zoo_data-toujours-lier-une-action-son-job-21198.patch (2,74 ko) 0003-zoo_data-toujours-lier-une-action-son-job-21198.patch Benjamin Dauvergne, 24 janvier 2018 16:01
0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch (1,08 ko) 0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch Benjamin Dauvergne, 24 janvier 2018 16:01
0005-zoo_data-ajoute-des-permissions-g-n-riques-en-vue-d-.patch (2,55 ko) 0005-zoo_data-ajoute-des-permissions-g-n-riques-en-vue-d-.patch Benjamin Dauvergne, 24 janvier 2018 16:01
0006-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch (30,7 ko) 0006-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch Benjamin Dauvergne, 25 janvier 2018 10:51
0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch (1,39 ko) 0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch Benjamin Dauvergne, 25 janvier 2018 10:51
0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch (1,1 ko) 0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch Benjamin Dauvergne, 25 janvier 2018 10:51
0003-zoo_data-toujours-lier-une-action-son-job-21198.patch (2,74 ko) 0003-zoo_data-toujours-lier-une-action-son-job-21198.patch Benjamin Dauvergne, 25 janvier 2018 10:51
0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch (1,08 ko) 0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch Benjamin Dauvergne, 25 janvier 2018 10:51
0005-zoo_data-ajoute-des-permissions-g-n-riques-en-vue-d-.patch (2,55 ko) 0005-zoo_data-ajoute-des-permissions-g-n-riques-en-vue-d-.patch Benjamin Dauvergne, 25 janvier 2018 10:51
0006-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch (33,1 ko) 0006-nanterre-BO-pour-la-synchronisation-des-f-d-rations-.patch Benjamin Dauvergne, 25 janvier 2018 11:28
0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch (1,39 ko) 0004-zoo_data-permettre-une-application-d-tendre-les-URLs.patch Benjamin Dauvergne, 25 janvier 2018 11:28
0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch (1,1 ko) 0001-zoo_data-ajoute-la-construction-d-un-classpath-pour-.patch Benjamin Dauvergne, 25 janvier 2018 11:28
0003-zoo_data-toujours-lier-une-action-son-job-21198.patch (2,74 ko) 0003-zoo_data-toujours-lier-une-action-son-job-21198.patch Benjamin Dauvergne, 25 janvier 2018 11:28
0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch (1,08 ko) 0002-zoo_data-ajoute-une-m-thode-pour-r-cup-rer-tous-les-.patch Benjamin Dauvergne, 25 janvier 2018 11:28
0005-zoo_data-ajoute-des-permissions-g-n-riques-en-vue-d-.patch (2,55 ko) 0005-zoo_data-ajoute-des-permissions-g-n-riques-en-vue-d-.patch Benjamin Dauvergne, 25 janvier 2018 11:28
0001-nanterre-ajout-d-une-action-supprimer-sur-les-jobs-d.patch (4,54 ko) 0001-nanterre-ajout-d-une-action-supprimer-sur-les-jobs-d.patch Benjamin Dauvergne, 07 janvier 2019 14:37

Révisions associées

Révision 72a6dfee (diff)
Ajouté par Benjamin Dauvergne il y a plus de 6 ans

zoo_data: ajoute la construction d'un classpath pour une classe et pas seulement une instance (#21198)

Révision 2baa2370 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 6 ans

zoo_data: ajoute une méthode pour récupérer tous les jobs d'une classe d'action (#21198)

Révision 4cf9a23f (diff)
Ajouté par Benjamin Dauvergne il y a plus de 6 ans

zoo_data: toujours lier une action à son job (#21198)

Révision 9f3e4245 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 6 ans

zoo_data: permettre à une application d'étendre les URLs d'admin des entités (#21198)

Révision 94055f35 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 6 ans

zoo_data: ajoute des permissions génériques en vue d'extensions (#21198)

Révision 7fa7a218 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 6 ans

nanterre: BO pour la synchronisation des fédérations métiers (fixes #21198)

Révision c7a26beb (diff)
Ajouté par Benjamin Dauvergne il y a environ 6 ans

nanterre: modification du message du journal lors d'une suppression automatique de fédération (#21198)

Historique

#3

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

Et donc, on a nouvel écran accessible via un nouveau bouton sur la vue des entités, cet écran affiche les derniers imports en cours, l'import se fait en deux temps et démarre par un clic sur le bouton "Nouvel import", ensuite on doit choisir l'application concernée et fournir un CSV.

Cela génère une nouvelle ligne dans le listing permettant de voir un pré-rapport d'import, la vue HTML du pré-rapport ne donne des indications que sur:
  • les fédération à supprimer (action "DELETE")
  • les fédération nouvelles (i.e. des fédération inconnus mais qui semble plus récente que le fichier d'import, donc on n'y touche pas) (action "NEW")
  • les fédérations inconnue (les identifiants métiers qu'on ne retrouve pas dans le RSU) (action "UNKNOWN")

Ce pré-rapport est aussi disponible en fichier CSV, mais il est plus complet (on a en plus toutes les fédérations conservées, marquées de l'action "KEEP").

Après validation du rapport on peut passer à l'application de l'import via le bouton "Appliquer", cela donnera lieu à la création d'un deuxième rapport (en effet entre le premier chargement et l'application il peut y avoir des différences, différences qui seront visible en comparant les deux CSV par exemple).

Les fichiers CSV sont triés par les identifiants RSU, sauf pour les fédérations inconnues qui sont listées en fin de fichier.

#4

Mis à jour par Brice Mallet il y a plus de 6 ans

  • Tracker changé de Bug à Development
#5

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

#6

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

Derniers patchs intégrant la journalisation des suppressions de fédération et
la création d'une transaction, toute modification devant toujours être liée à
une transaction.

L'objet journal contient simplement le dictionnaire suivant:

{ "text" : "Suppression de la fédération <Application>: <Fédération>"}

La transaction contient le dictionnaire suivant:

transaction.content = {
    'action': 'synchronize-federation',
    'job_id': self.action.job.id,
    'app_id': app_id,
    'federations_deleted': [[<RSU ID>,<Application_ID>,<Federation]...]
}

#9

Mis à jour par Thomas Noël il y a plus de 6 ans

0001: zoo_data: ajoute la construction d'un classpath pour une classe et pas seulement une instance (#21198)

  • def get_classpath(cls, instance): comme l'instance peut aussi être une classe, on pourrait changer le nom ; ou plutôt simplement mettre un mini commentaire (# instance can be a class ; au niveau du if isinstance)... ou rien parce que "git blame" expliquera. Au choix.

0002: zoo_data: ajoute une méthode pour récupérer tous les jobs d'une classe d'action (#21198)

  • ack

0003: zoo_data: toujours lier une action à son job (#21198)

  • faut pas utiliser assert en dehors des tests
  • mais ack quand même, je sais ton amour pour les asserts

0004: zoo_data: permettre à une application d'étendre les URLs d'admin des entités (#21198)

  • ack

0005: zoo_data: ajoute des permissions génériques en vue d'extensions (#21198)

  • petite erreur de copié collé, après action1 tu n'ajoutes que des "Can do action2 on entities"

0006: nanterre: BO pour la synchronisation des fédérations métiers (fixes #21198)

(enfin un vrai patch ☺)

  • zoo/zoo_nanterre/synchronize_federations.py: dans SynchronizeFederationsImport::__init__ il y a :
    +        self.federations = []
    +        self.errors = []
    +        self.actions = []
    

    mais je pense qu'il faut ajouter ça aussi au début de SynchronizeFederationsImport::analyse() ; parce que celle-ci me semble pouvoir avoir lieu plusieurs fois (pourrait, un jour). Et, sans véritable importance cette fois, juste par réciprocité, ajouter dans le init :
    +        self.keep_count = 0
    +        self.new_count = 0
    +        self.delete_count = 0
    +        self.unknown_count = 0
    
  • dans le apply, quand tu extraies la liste des effacements :
    +        for row in self.actions:
    +            entity_id, _, _, _, app_id, federation, action = row
    +            if action != 'DELETE':
    +                continue
    +            deletes[entity_id] = federation
    

    est-ce qu'il ne faudrait pas aussi filtrer uniquement si app_id == self.action.app_id ?
  • si j'ai tout suivi, l'action NEW elle est jamais gérée ?
  • dans SynchronizeFederationsAction::do , à mon avis pépin dans le bout ci-dessous, parce que le synchronize_federations_import.errors n'est pas géré par SynchronizeFederationsImport::analyze_and_report (selon ma lecture SynchronizeFederationsImport ne fait juste que self.errors=[] et jamais rien d'autre) :
    +    synchronize_federations_import = SynchronizeFederationsImport(self)
             ....
    +            synchronize_federations_import.analyze_and_report()
    +            if synchronize_federations_import.errors:  <-- ça sera toujours [] je crois bien
    +                return Job.STATE_UNRECOVERABLE_ERROR
    
  • Job.create(self, do_later=not settings.DEBUG) va être génant parce qu'en preprod on a DEBUG = True. Plutôt un getattr(settings, 'NANTERRE_SYNCHRONIZE_NO_DELAY', False) ou quelque autre nom plus joli que tu trouverais.
  • zoo_nanterre/templates/admin/index.html: sans doute que tu t'embêtes pour rien à faire des {% trans ... %} vu que y'a du français ailleurs
  • c'est bien y'a pas d'assert, tu progresses
  • zoo_nanterre/synchronize_federations.py: Copyright (C) 2016 alors qu'on est en 2018
#10

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

Thomas Noël a écrit :

0001: zoo_data: ajoute la construction d'un classpath pour une classe et pas seulement une instance (#21198)

  • def get_classpath(cls, instance): comme l'instance peut aussi être une classe, on pourrait changer le nom ; ou plutôt simplement mettre un mini commentaire (# instance can be a class ; au niveau du if isinstance)... ou rien parce que "git blame" expliquera. Au choix.

0002: zoo_data: ajoute une méthode pour récupérer tous les jobs d'une classe d'action (#21198)

  • ack

0003: zoo_data: toujours lier une action à son job (#21198)

  • faut pas utiliser assert en dehors des tests

Il faut distinguer l'utilisation d'assert pour de la gestion d'erreur, ça c'est mal et l'utilisation de assert pour du contrôle de pré-/post-condition/invariant i.e. des choses qui ne peuvent jamais arriver sauf erreur de codage. J'utilise assert comme on l'utilise en C (qui a le même comportement, en -O1 les assert sont virés).

  • zoo/zoo_nanterre/synchronize_federations.py: dans SynchronizeFederationsImport::__init__ il y a :
    [...]
    mais je pense qu'il faut ajouter ça aussi au début de SynchronizeFederationsImport::analyse() ; parce que celle-ci me semble pouvoir avoir lieu plusieurs fois (pourrait, un jour). Et, sans véritable importance cette fois, juste par réciprocité, ajouter dans le init :

Oui tu as raison je vais même tout simplement déplacer cela dans analyze().

[...]

  • dans le apply, quand tu extraies la liste des effacements :
    [...]
    est-ce qu'il ne faudrait pas aussi filtrer uniquement si app_id == self.action.app_id ?

En fait j'utilise la liste actions pour deux choses, générer mes rapports CSV et effectuer réellement la suppression des fédérations, dans ce dernier cas il n'y a que trois colonnes qui servent, rsu_id, federation et action.

  • si j'ai tout suivi, l'action NEW elle est jamais gérée ?

Non c'est une valeur qui ne sert qu'au rapport, ça indique une fédération qui est plus récente que l'import (elle est plus grande que la plus grande valeur entière d'une fédération de l'import). L'idée c'est qu'ils ne se prennent pas trop le choux à bloquer toute l'application au moment d'un import parce qu'entre le temps T de l'export et le temps T+1 de son import de nouvelles fédérations auront pu être créé entre zoo et les applications métiers, qui étant absente de l'export seraient considérées comme devant être supprimées; bien sûr cela ne marche que dans la mesure ou les fédérations sont des entiers distribués de manière strictement incrémentale; ce qui semble être le cas (sauf pour saga, mais de notre coté on génère un code saga_tiers incrémental, on partira de ça plutôt).

  • dans SynchronizeFederationsAction::do , à mon avis pépin dans le bout ci-dessous, parce que le synchronize_federations_import.errors n'est pas géré par SynchronizeFederationsImport::analyze_and_report (selon ma lecture SynchronizeFederationsImport ne fait juste que self.errors=[] et jamais rien d'autre) :
    [...]

Ouais je vais relire ça, en fait y a pas vraiment de cas d'erreur, au début je faisais des pseudos contrôles sur le fichier d'import, mais maintenant je lis juste ligne par ligne et si un truc ne martche pas ça fait juste une fédération inconnue.

  • Job.create(self, do_later=not settings.DEBUG) va être génant parce qu'en preprod on a DEBUG = True. Plutôt un getattr(settings, 'NANTERRE_SYNCHRONIZE_NO_DELAY', False) ou quelque autre nom plus joli que tu trouverais.

Ok.

  • zoo_nanterre/templates/admin/index.html: sans doute que tu t'embêtes pour rien à faire des {% trans ... %} vu que y'a du français ailleurs

C'est un template copié depuis django/contrib/admin/templates/admin/ donc c'est pas moi, je ne peux rien n'y faire l'admin django ne prévoit pas de moyen propre de surcharger sa page d'accueil, enfin on peut déclarer sa propre classe AdminSite et surcharger le chemin mais j'ai eu la flemme.

  • c'est bien y'a pas d'assert, tu progresses
  • zoo_nanterre/synchronize_federations.py: Copyright (C) 2016 alors qu'on est en 2018

Yep je corrige.

#13

Mis à jour par Thomas Noël il y a plus de 6 ans

Ack

Je peux m'occuper de pousser et envoyer en préprod si tu veux.

#14

Mis à jour par Thomas Noël il y a plus de 6 ans

  • Statut changé de Nouveau à Résolu (à déployer)
commit 7fa7a218e7982c4bab05ba0ee4b5705314e8cc9e
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Jan 19 15:22:44 2018 +0100

    nanterre: BO pour la synchronisation des fédérations métiers (fixes #21198)

commit 94055f35a03c6b7ed797f466901225047e9ba36a
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Wed Jan 24 15:26:38 2018 +0100

    zoo_data: ajoute des permissions génériques en vue d'extensions (#21198)

commit 9f3e4245622b6f3ea34bcbc5ab3acdaad40924f2
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Jan 19 15:20:27 2018 +0100

    zoo_data: permettre à une application d'étendre les URLs d'admin des entités (#21198)

commit 4cf9a23f5d27d5bb256300a4d68bcfe781d95d49
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Jan 19 15:19:51 2018 +0100

    zoo_data: toujours lier une action à son job (#21198)

commit 2baa23702da0ed0741577c51b80f69bd4fe95797
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Jan 19 15:19:34 2018 +0100

    zoo_data: ajoute une méthode pour récupérer tous les jobs d'une classe d'action (#21198)

commit 72a6dfee6c1a11db59baf58d4da7118da1137856
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Jan 19 15:19:01 2018 +0100

    zoo_data: ajoute la construction d'un classpath pour une classe et pas seulement une instance (#21198)

#15

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

  • % réalisé changé de 0 à 100
#16

Mis à jour par Thomas Noël il y a plus de 6 ans

  • Statut changé de Résolu (à déployer) à Solution déployée
  • % réalisé changé de 100 à 0

Installé sur preprod Nanterre.

Formats disponibles : Atom PDF