Remplace le rangement plat projects/<slug>/ par une vraie arborescence par compte créateur, sans toucher aux routes existantes (aucune ne déclare de "/" dans son <slug> : le chemin composé "propriétaire_projet" reste un détail interne à db/, décodé par db/games/project_slug.py, seul fichier à modifier si la convention change un jour). - db/game_dir.py, create_game.py, delete_game.py, list_games.py, move_game.py : résolvent/construisent ce chemin composé. Bénéfice direct : deux comptes différents peuvent chacun avoir un projet nommé pareil sans collision (l'unicité ne se vérifie plus que par dossier propriétaire). move_game.py renomme désormais le dossier PROPRIÉTAIRE entier (changement d'email), prêt pour un futur multi-projet. - scripts/migrate_flat_project_slugs.py : migration des projets déjà créés sous l'ancien rangement plat (simulation par défaut, --apply pour exécuter). - routes/auth/profile.py, tests/conftest.py : suppression de compte/jeu de test via db.delete_game (nettoie aussi le dossier propriétaire devenu vide) plutôt qu'un shutil.rmtree direct du seul dossier projet. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
21 lines
779 B
Python
21 lines
779 B
Python
import os
|
|
import shutil
|
|
|
|
from ..constants import PROJECTS_DIR
|
|
from ..game_dir import game_dir
|
|
from .project_slug import split_slug
|
|
|
|
|
|
def delete_game(slug):
|
|
shutil.rmtree(game_dir(slug))
|
|
# Structure de dossiers par utilisateur (voir project_slug.py) :
|
|
# nettoie aussi le dossier propriétaire s'il ne contient plus aucun
|
|
# projet — purement cosmétique (game_dir()/list_games() fonctionnent
|
|
# très bien avec un dossier propriétaire vide), évite juste
|
|
# d'accumuler des dossiers fantômes sous projects/.
|
|
owner_folder, project_part = split_slug(slug)
|
|
if project_part is not None:
|
|
owner_path = os.path.join(PROJECTS_DIR, owner_folder)
|
|
if os.path.isdir(owner_path) and not os.listdir(owner_path):
|
|
os.rmdir(owner_path)
|