Development #69902
django_rbac, rapatrier le modèle Operation
0%
Description
Suite de #58696, avec pour objectif de vider l'app django_rbac.
Dans le précédent ticket on a simplement déplacé du code de modèles abstraits dans les vrais modèles, ce qui ne générait pas de migration de données. Ici il va falloir jouer une migration qui déplace le modèle d'une app à l'autre.
Fichiers
Demandes liées
Révisions associées
a2_rbac: migrate existing operations to new model (#69902)
Historique
Mis à jour par Benjamin Dauvergne il y a plus d'un an
PermissionMixin est abstract aussi tu peux le faire à part.
Mis à jour par Valentin Deniaud il y a plus d'un an
Benjamin Dauvergne a écrit :
PermissionMixin est abstract aussi tu peux le faire à part.
Ah oui merci, j'avais raté ça.
Mis à jour par Valentin Deniaud il y a plus d'un an
- Sujet changé de django_rbac, rapatrier les modèles Operation et PermissionMixin à django_rbac, rapatrier le modèle Operation
- Description mis à jour (diff)
Je sens que ce ticket va être suffisamment dodu, je vais gérer le déplacement de PermissionMixin à part dans #70135.
Mis à jour par Valentin Deniaud il y a plus d'un an
- Fichier 0002-a2_rbac-migrate-existing-operations-to-new-model-699.patch 0002-a2_rbac-migrate-existing-operations-to-new-model-699.patch ajouté
- Fichier 0001-a2_rbac-move-signal-handlers-from-django_rbac-69902.patch 0001-a2_rbac-move-signal-handlers-from-django_rbac-69902.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
20 builds pour en arriver là, d'abord essayer de migrer en changeant juste le nom des tables comme j'avais fait dans https://git.entrouvert.org/authentic.git/commit/?id=ad2d35fed53f8d207610e6aa1eb54930024f3271 et puis face à 1/ une fk à gérer 2/ des signaux post migrate à gérer 3/ des migrations inverses à gérer j'ai jeté l'éponge et fait une copie des données vers un nouveau modèle, mille fois plus simple et testable.
0001 pour bouger du code au préalable, sans que ce soit strictement nécessaire ça limite la dépendence de django_rbac envers a2_rbac, 0002 la migration.
Mis à jour par Valentin Deniaud il y a plus d'un an
- Lié à Development #70180: Changement d'import django_rbac -> a2_rbac ajouté
Mis à jour par Benjamin Dauvergne il y a plus d'un an
- Statut changé de Solution proposée à En cours
- sur une instance avant :
Table « authentic_dev_publik_love.a2_rbac_permission » Colonne | Type | Collationnement | NULL-able | Par défaut --------------+---------+-----------------+-----------+------------------------------------------------ id | integer | | not null | nextval('a2_rbac_permission_id_seq'::regclass) target_id | integer | | not null | operation_id | integer | | not null | ou_id | integer | | | target_ct_id | integer | | not null | Index : "a2_rbac_permission_pkey" PRIMARY KEY, btree (id) "a2_rbac_permission_operation_id_3ad9aed4" btree (operation_id) "a2_rbac_permission_ou_id_a68ef755" btree (ou_id) "a2_rbac_permission_target_ct_id_519ab0ca" btree (target_ct_id) "null_ou_uniq_idx" UNIQUE, btree (operation_id, target_ct_id, target_id) WHERE ou_id IS NULL Contraintes de vérification : "a2_rbac_permission_target_id_check" CHECK (target_id >= 0) Contraintes de clés étrangères : "a2_rbac_permission_operation_id_3ad9aed4_fk_django_rb" FOREIGN KEY (operation_id) REFERENCES django_rbac_operation(id) DEFERRABLE INITIALLY DEFERRED "a2_rbac_permission_ou_id_a68ef755_fk_a2_rbac_o" FOREIGN KEY (ou_id) REFERENCES a2_rbac_organizationalunit(id) DEFERRABLE INITIALLY DEFERRED "a2_rbac_permission_target_ct_id_519ab0ca_fk_django_co" FOREIGN KEY (target_ct_id) REFERENCES django_content_type(id) DEFERRABLE INITIALLY DEFERRED Référencé par : TABLE "a2_rbac_role_permissions" CONSTRAINT "a2_rbac_role_permiss_permission_id_785cbab6_fk_a2_rbac_p" FOREIGN KEY (permission_id) REFERENCES a2_rbac_permission(id) DEFERRABLE INITIALLY DEFERRED
aprèsa2-test-migrate-django-rbac=# \d a2_rbac_permission Table « public.a2_rbac_permission » Colonne | Type | Collationnement | NULL-able | Par défaut --------------+---------+-----------------+-----------+------------------------------------------------ id | integer | | not null | nextval('a2_rbac_permission_id_seq'::regclass) target_id | integer | | not null | ou_id | integer | | | target_ct_id | integer | | not null | operation_id | integer | | not null | Index : "a2_rbac_permission_pkey" PRIMARY KEY, btree (id) "a2_rbac_permission_operation_new_id_0c34ce1f" btree (operation_id) "a2_rbac_permission_ou_id_a68ef755" btree (ou_id) "a2_rbac_permission_target_ct_id_519ab0ca" btree (target_ct_id) Contraintes de vérification : "a2_rbac_permission_target_id_check" CHECK (target_id >= 0) Contraintes de clés étrangères : "a2_rbac_permission_operation_id_3ad9aed4_fk_a2_rbac_o" FOREIGN KEY (operation_id) REFERENCES a2_rbac_operation(id) DEFERRABLE INITIALLY DEFERRED "a2_rbac_permission_ou_id_a68ef755_fk_a2_rbac_o" FOREIGN KEY (ou_id) REFERENCES a2_rbac_organizationalunit(id) DEFERRABLE INITIALLY DEFERRED "a2_rbac_permission_target_ct_id_519ab0ca_fk_django_co" FOREIGN KEY (target_ct_id) REFERENCES django_content_type(id) DEFERRABLE INITIALLY DEFERRED Référencé par : TABLE "a2_rbac_role_permissions" CONSTRAINT "a2_rbac_role_permiss_permission_id_785cbab6_fk_a2_rbac_p" FOREIGN KEY (permission_id) REFERENCES a2_rbac_permission(id) DEFERRABLE INITIALLY DEFERRED
Il manque null_ou_uniq_idx. Il faudrait supprimer les contraintes qui inclut operatoin_id sur Permission puis les remettre pour s'assurer que les index sont bien reconstruits. Je vais faire un diff entre dump complet du schéma avant et après pour voir un peu mieux ce que ça donne.
Mis à jour par Benjamin Dauvergne il y a plus d'un an
- Fichier schema.diff schema.diff ajouté
D'un rapide coup d'oeuil je vois donc l'index précédent qui manque et aussi un "possible" souci sur le nom de la colonne operation qui est toujours référencé en operation_new_id, mais je ne sais pas si c'est grave vu que l'index existe, je ne pense pas que postgresql permettrait un index vers une colonne qui n'existe pas, mais peut-être faut-il aussi enlever la contrainte sur la FK avant de la renommer (db_constraint=False) (le nom est bon dans la colonne Définition mais pas dans la colonne "Colonne").
Ça a aussi l'effet de recréer un nouveau ContentType pour le modèle Operation et les permissions django.contrib.auth qui vont avec1 mais je ne pense pas qu'on s'en serve quelque part.
Le diff entre le contenu des tables permissions et operation avant après est vide, ça c'est ok.
1
authentic2_multitenant=# select * from auth_permission; ... 272 | Can add operation | 69 | add_operation 273 | Can change operation | 69 | change_operation 274 | Can delete operation | 69 | delete_operation 275 | Can view operation | 69 | view_operation
Mis à jour par Benjamin Dauvergne il y a plus d'un an
- Lié à Development #70152: Lors de la génération des permissions d'un utilisateur, prendre en compte l'héritage entre modèles ajouté
Mis à jour par Valentin Deniaud il y a plus d'un an
- Fichier 0002-a2_rbac-migrate-existing-operations-to-new-model-699.patch 0002-a2_rbac-migrate-existing-operations-to-new-model-699.patch ajouté
- Fichier 0001-a2_rbac-move-signal-handlers-from-django_rbac-69902.patch 0001-a2_rbac-move-signal-handlers-from-django_rbac-69902.patch ajouté
- Statut changé de En cours à Solution proposée
Voilà avec retrait/ajout de la contrainte, pas d'avis sur operation_new_id mais comme c'est un simple RenameField généré par Django je me dis que ça doit être OK.
Mis à jour par Benjamin Dauvergne il y a plus d'un an
- Statut changé de Solution proposée à Solution validée
Ne pas tagger tout de suite, qu'on joue un peu avec sur la plateforme de dev.
Mis à jour par Valentin Deniaud il y a plus d'un an
- Statut changé de Solution validée à Résolu (à déployer)
commit cb9df4fbb2699e324f56ef2660639b462cbae040 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Tue Oct 11 16:10:48 2022 +0200 a2_rbac: migrate existing operations to new model (#69902) commit 3dab8ff21aed237decb8213281d2f6ecbfe0d8fe Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Thu Oct 6 18:35:23 2022 +0200 a2_rbac: move signal handlers from django_rbac (#69902)
Mis à jour par Transition automatique il y a plus d'un an
- Statut changé de Résolu (à déployer) à Solution déployée
a2_rbac: move signal handlers from django_rbac (#69902)