Open xavyeah39 opened 5 years ago
Il faut manipuler les DELETE CASCADE avec prudence. En faisant ça tu retires les permissions et la présence dans des listes de tous les utilisateurs du groupe. De manière invisible.
Je propose de plutôt mettre toutes les actions delete
dans un try except
et de faire un template qui affiche l'erreur sql (avec un message générique du genre : Houps ! )
J'ai fait ça ici : https://github.com/gildeluermoz/gas/blob/master/app/t_deliveries/route.py#L209-L218
avec ça : https://github.com/gildeluermoz/gas/blob/master/app/templates/error.html
Il faut manipuler les DELETE CASCADE avec prudence.
Bien d'accord avec toi sur la prudence à avoir avec les DELETE CASCADE.
En faisant ça tu retires les permissions et la présence dans des listes de tous les utilisateurs du groupe. De manière invisible.
Oui tout à fait. Mais n'est-ce pas le comportement attendu ? Lorsque l'on supprime un groupe il est cohérent que tout les utilisateurs qu'il contient n'aient plus à être référencés dans les listes auxquels le groupe appartenait. Sauf si ces utilisateurs sont présents par ailleurs dans cette même liste (appartenance à plusieurs groupe ou ajoutés individuellement dedans) mais dans ce cas, le DELETE CASCADE
n'aura pas d'incidence. Ou alors un truc m'échappe ??
Pour être sûr je viens de refaire ce test :
grp_test
Agent test
Agent test
dans le groupe grp_en_poste
grp_test
, grp_en_poste
et l'utilisateur Agent test
(sans groupe)--> Lorsque que je supprime grp_test
depuis l'interface avec le DELETE CASCADE
sur la contrainte ça ne me supprime uniquement la correspondance entre grp_test
et la liste Occtax dans cor_role_liste
. Mon utilisateur Agent test
lui, reste bien référencé dans la liste Occtax et dans grp_en_poste
(lui aussi toujours référencé dans la liste).
Je propose de plutôt mettre toutes les actions
delete
dans untry except
et de faire un template qui affiche l'erreur sql (avec un message générique du genre : Houps ! ) J'ai fait ça ici : https://github.com/gildeluermoz/gas/blob/master/app/t_deliveries/route.py#L209-L218 avec ça : https://github.com/gildeluermoz/gas/blob/master/app/templates/error.html
OK. Mais du coup, pas de possibilités de supprimer un groupe sans le retirer au préalable des listes auxquelles il appartient si je capte bien ?
C'est bien d'avoir l'info de ce que fait le DELETE CASCADE pour éviter d'avoir des surprises et de supprimer tout un tas de truc sans le vouloir. Une fois que tu as l'erreur qui est levée dans le template, tu peux le faire à la main dans ta base... Ou alors la solution encore plus confortable (pour les alergiques aux bases) c'est de mettre un message d'avertissement avant la suppression, du genre (attention vous allez supprimer en cascades des données dans la table X, Y ...)
C'est bien d'avoir l'info de ce que fait le DELETE CASCADE pour éviter d'avoir des surprises et de supprimer tout un tas de truc sans le vouloir.
Oui c'est sûr qu'il faut bien identifier en amont les incidences d'une telle contrainte.
Une fois que tu as l'erreur qui est levée dans le template, tu peux le faire à la main dans ta base...
Oui carrément. On perd cependant (un peu) le bénéfice de l'interface pour ce genre de manip' (qui ne se présente pas tous les jours j'en conviens).
Ou alors la solution encore plus confortable (pour les alergiques aux bases) c'est de mettre un message d'avertissement avant la suppression, du genre (attention vous allez supprimer en cascades des données dans la table X, Y ...)
👍 : Que l'action soit possible mais avec un avertissement ça me paraît top.
Dans Geotrek, quand on supprime un objet, ça liste avant confirmation les objets lies que cela va supprimer
Après avoir :
Lorsque l'on souhaite ensuite supprimer le groupe, la transaction lève l'erreur ci-dessous :
{"msg": "IntegrityError('(psycopg2.IntegrityError) update or delete on table \"t_roles\" violates foreign key constraint \"fk_cor_role_liste_id_role\" on table \"cor_role_liste\"\\nDETAIL: Key (id_role)=(17) is still referenced from table \"cor_role_liste\".\\n',)", "type": "Exception"}
La Foreign Key
fk_cor_role_liste_id_role
sur la tableutilisateurs.cor_role_liste
a un paramètreDELETE NO ACTION
qu'il faudrait passer enDELETE CASCADE
.En tout cas, cela règle le problème chez moi sans autre effet de bord identifié. @+