PnX-SI / UsersHub

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

Supprimer un organisme lié à un jeu de données #171

Open juliettefabre opened 1 year ago

juliettefabre commented 1 year ago

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')"}

andriacap commented 3 months 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 ) :

Error_delete_users_Internal_Server_error

Et voici ce que j'ai testé en terme 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 :

Info_erreur_suppression_utilisateur_references_autre_table

Merci pour vos retours

@camillemonchicourt @Pierre-Narcisi @jacquesfize @TheoLechemia