PnX-SI / UsersHub

Application web de gestion centralisée des utilisateurs
GNU General Public License v3.0
13 stars 24 forks source link

UHV2 - Erreur à la suppression d'un groupe -> FK #72

Open xavyeah39 opened 5 years ago

xavyeah39 commented 5 years ago

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_rolesur la table utilisateurs.cor_role_liste a un paramètre DELETE NO ACTION qu'il faudrait passer en DELETE CASCADE.

En tout cas, cela règle le problème chez moi sans autre effet de bord identifié. @+

gildeluermoz commented 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

xavyeah39 commented 5 years ago

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 :

--> 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 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

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 ?

TheoLechemia commented 5 years ago

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 ...)

xavyeah39 commented 5 years ago

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.

camillemonchicourt commented 5 years ago

Dans Geotrek, quand on supprime un objet, ça liste avant confirmation les objets lies que cela va supprimer