Le nom affiché dans la barre de navigation (base.html) devient un lien vers /profile : informations du compte (email en lecture seule, nom/ prénom modifiables), changement de mot de passe (mot de passe actuel requis + mêmes règles de force qu'à l'inscription/la réinitialisation), et une section "danger" pour demander la suppression du compte. La suppression exige le mot de passe actuel ET la saisie exacte de "SUPPRIMER" (deux confirmations distinctes pour une action irréversible) — routes/auth/profile.py. Pour un compte "user" (limité à un seul projet, créé automatiquement et impossible à supprimer autrement, voir core/auth_guard.py), supprimer le compte supprime aussi son unique projet sur le disque, faute de quoi il resterait orphelin sans plus aucun propriétaire. Un compte "admin" peut posséder plusieurs jeux qui ne lui sont pas dédiés de la même façon : ses projets ne sont jamais touchés. L'unique compte administrateur ne peut pas être supprimé (auth/ count_admins.py) — le supprimer bloquerait la création d'un nouveau compte admin (réservée au tout premier compte jamais créé, base vide). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
17 lines
717 B
Python
17 lines
717 B
Python
from .connection import connect
|
|
|
|
|
|
def delete_user(user_id):
|
|
"""Supprime le compte et tout ce qui lui est directement rattaché
|
|
(codes de récupération, jetons de réinitialisation encore en cours) —
|
|
le dossier de projet, lui, est géré par l'appelant (voir
|
|
routes/auth/profile.py) : un compte "admin" peut posséder plusieurs
|
|
jeux qu'il n'a pas forcément envie de perdre en même temps que son
|
|
compte."""
|
|
conn = connect()
|
|
conn.execute("DELETE FROM _recovery_codes WHERE user_id = ?", (user_id,))
|
|
conn.execute("DELETE FROM _password_reset_tokens WHERE user_id = ?", (user_id,))
|
|
conn.execute("DELETE FROM _users WHERE id = ?", (user_id,))
|
|
conn.commit()
|
|
conn.close()
|