Files
Forge-Engine/db/games/move_game.py
T
william 7ebc9b143f
Build and deploy / test-python (push) Successful in 9m39s
Build and deploy / test-js (push) Successful in 52s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
Corrige une faille d'isolation entre comptes et retire l'email des chemins de projet
Le rôle "admin" contournait entièrement l'isolation par projet
(core/auth_guard.py) : il pouvait ouvrir/modifier/supprimer le jeu de
n'importe quel autre compte en connaissant son slug, et la page d'accueil
listait sans filtrage tous les projets de tous les comptes.

- La propriété d'un projet se vérifie désormais sur le segment
  "propriétaire" du slug (id du compte), pour tous les rôles y compris
  admin — un slug "à plat" (sans compte associé) reste réservé à
  l'admin, comportement historique conservé pour ce cas précis.
- routes/games/index.py ne liste plus que les projets du compte connecté.
- Le dossier propriétaire d'un projet est maintenant l'id numérique du
  compte, plus jamais son email slugifié (visible en clair dans chaque
  URL auparavant) — script de migration fourni et déjà exécuté sur les
  données existantes.
- Changer d'email ne renomme plus aucun dossier (n'en dépend plus).
- Deux nouveaux tests de régression, fixtures corrigées en conséquence.
- README réécrit pour refléter l'état actuel du produit (jeu 2D
  uniquement, plus de traces de l'ancien éditeur "document").
2026-09-04 22:52:05 +02:00

45 lines
1.9 KiB
Python

import os
from ..constants import PROJECTS_DIR
from ..game_dir import game_dir
from .project_slug import build_slug, split_slug
def move_game(old_slug, new_owner_folder):
"""Renomme le dossier PROPRIÉTAIRE d'un compte — owner_folder est
l'id du compte (voir db/games/project_slug.py, routes/games/
games_new.py) : ne change donc plus jamais après coup en usage normal,
mais reste utile pour une migration ponctuelle (voir
scripts/migrate_owner_folders_to_user_id.py, qui a besoin de renommer
les anciens dossiers slugify(email) vers l'id du compte). Renomme le
dossier propriétaire ENTIER en un coup (déplace tous les projets de ce
compte ensemble), pas juste un projet. Rend le nouveau dossier
propriétaire unique de la même façon que create_game() si, par un
hasard extrême, il correspond déjà à un dossier existant. Renvoie le
nouveau slug composé FINAL (même projet, propriétaire renommé), à
enregistrer comme nouveau project_slug."""
old_owner_folder, project_part = split_slug(old_slug)
if project_part is None:
# Slug pas encore migré vers la structure par utilisateur (voir
# scripts/migrate_flat_project_slugs.py) — repli sur l'ancien
# comportement plat (renomme le dossier du projet lui-même).
if old_slug == new_owner_folder:
return old_slug
base = new_owner_folder
n = 2
while os.path.isdir(game_dir(base)):
base = f"{new_owner_folder}-{n}"
n += 1
os.rename(game_dir(old_slug), game_dir(base))
return base
if old_owner_folder == new_owner_folder:
return old_slug
base = new_owner_folder
n = 2
while os.path.isdir(os.path.join(PROJECTS_DIR, base)):
base = f"{new_owner_folder}-{n}"
n += 1
os.rename(os.path.join(PROJECTS_DIR, old_owner_folder), os.path.join(PROJECTS_DIR, base))
return build_slug(base, project_part)