Open juliettefabre opened 1 year ago
Hello,
Je viens de voir cette issue que le CEN Ariège à également rencontré (mais sur la suppression d'utilisateur qui appartiennent encore à une liste d'utilisateurs) . J'ai eu le temps de tester un truc qui permet de gérer les cas où une erreur est renvoyé et d'améliorer l'expérience utilisateur pour pas qu'il se retrouve sur une page "Internal Server Error".
Voici le comportement actuel (en terme de feedback utilisateur lorsqu'on supprime un utilisateur qui ne peut pas être supprimé car référencé dans une autre table ) :
Et voici ce que j'ai testé en terme de code :
Code à modifier : https://github.com/PnX-SI/UsersHub/blob/c5d7489a0e38c9b8a1a51e51e8e711ad8544854c/app/t_roles/route.py#L253C1-L263C43
proposition de code :
@route.route("users/delete/<id_role>", methods=["GET", "POST"])
@fnauth.check_auth(
6,
)
def deluser(id_role):
"""
Route qui supprime un utilisateurs dont l'id est donné en paramètres dans l'url
Retourne une redirection vers la liste d'utilisateurs
"""
try:
TRoles.delete(id_role)
flash("L'utilisateur a été supprimé avec succès.", "success")
except IntegrityError as e:
error_message = str(e.orig)
# On extrait la partie du message après "DETAIL:"
detail_match = re.search(r"DETAIL:\s*(.*)", error_message, re.IGNORECASE)
if detail_match:
detail_message = detail_match.group(1)
# On formatte le message d'erreur en utilisant les détails extraits
flash(f"L'utilisateur avec l'ID {id_role} ne peut pas être supprimé : {detail_message}", "error")
else:
flash("Une erreur est survenue lors de la suppression de l'utilisateur.", "error")
log.error(f"Erreur lors de la suppression de l'utilisateur {id_role}: {error_message}", exc_info=True)
except Exception as e:
flash("Une erreur est survenue lors de la suppression de l'utilisateur.", "error")
log.error(f"Erreur lors de la suppression de l'utilisateur {id_role}: {e}", exc_info=True)
return redirect(url_for("user.users"))
Exemple de résultat coté frontend :
Merci pour vos retours
@camillemonchicourt @Pierre-Narcisi @jacquesfize @TheoLechemia
Bonjour,
Quand on essaie de supprimer un organisme associé à un jeu de données, on obient cette erreur :
{"type": "Exception", "msg": "IntegrityError('(psycopg2.errors.ForeignKeyViolation) update or delete on table \"bib_organismes\" violates foreign key constraint \"fk_dataset_actor_id_organism\" on table \"cor_dataset_actor\"\\nDETAIL: Key (id_organisme)=(2) is still referenced from table \"cor_dataset_actor\".\\n')"}
Il faudrait le convertir en un message d'alerte du type "l'organisme est associé à un ou plusieurs jeux de données, etc .."
J'ai remarqué ce genre de problème pour plusieurs types d'objets, par exemple la suppression d'un groupe associé à une liste :
{"type": "Exception", "msg": "IntegrityError('(psycopg2.errors.ForeignKeyViolation) 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)=(1) is still referenced from table \"cor_role_liste\".\\n')"}