Onboarding guidé systématique + tableau de bord simplifié
Comportement SYSTÉMATIQUE à chaque création de jeu (admin compris), pas une formalité réservée à l'inscription : /onboarding (routes/onboarding/) devient le point d'entrée unique — 4 cartes retournables (survol = explication au dos), défilement horizontal animé vers le nom du jeu. Un admin y repasse à volonté (pas de project_slug dédié, jamais bloqué/ redirigé vers un projet précédent) ; un compte "user" n'en a plus qu'un créé d'office (routes/auth/register_2fa.py), guidé ici à la place. - db/games/game_type_catalog.py : catalogue des 4 types (Quiz/ Embranchement-escape game/RPG/Créer mon jeu de A à Z), _meta['onboarding_type'] décide du "kind" du premier écran créé et si le tableau de bord complet reste accessible. - routes/games/game_dashboard.py, templates/game_dashboard_simple.html : un type restreint (quiz/embranchement/rpg) voit désormais SON tableau de bord (même route que "custom"), rendu en version simplifiée — juste ses écrans en cartes avec un aperçu RÉEL du contenu (scène mise à l'échelle par container query CSS, adaptée à la largeur réelle de la carte). "+ Ajouter un écran" n'y propose pas de choix de type : imposé par le projet (routes/screens/screens_new.py), verrouillé aussi côté serveur. - core/auth_guard.py : plus de blocage de game_dashboard par type — la restriction se fait au rendu, pas à l'accès à la route. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
0f23024882
commit
76a50fa87a
@@ -31,9 +31,20 @@ _PUBLIC_ENDPOINTS = {
|
||||
"forgot_password", "reset_password",
|
||||
"game_play_public", "runtime_payload_public",
|
||||
"flow_node_run_data_public", "flow_node_run_variable_public",
|
||||
"flow_node_run_score_public", "flow_node_run_status_public",
|
||||
"flow_node_run_add_row_public",
|
||||
}
|
||||
|
||||
# Endpoints de gestion de COMPTE (routes/auth/profile.py) — connexion
|
||||
# requise, mais indépendants d'avoir un projet ou non (voir onboarding
|
||||
# guidé ci-dessous) : un compte pas encore passé par /onboarding doit
|
||||
# quand même pouvoir changer son mot de passe, son email, ou supprimer
|
||||
# son compte.
|
||||
_REACHABLE_WITHOUT_PROJECT = {
|
||||
"onboarding_new", "profile", "profile_update_name", "profile_update_email",
|
||||
"profile_regenerate_recovery_codes", "profile_change_password", "profile_delete",
|
||||
}
|
||||
|
||||
|
||||
@app.before_request
|
||||
def _require_login_and_enforce_project_isolation():
|
||||
@@ -61,9 +72,22 @@ def _require_login_and_enforce_project_isolation():
|
||||
if user["role"] != "admin":
|
||||
if endpoint in ("index", "games_new") and user.get("project_slug"):
|
||||
return redirect(url_for("game_dashboard", slug=user["project_slug"]))
|
||||
# Onboarding guidé (voir routes/onboarding/onboarding_new.py) : un
|
||||
# compte "user" fraîchement inscrit n'a plus de projet créé
|
||||
# d'office (voir routes/auth/register_2fa.py) — tant qu'il n'en a
|
||||
# pas, seules ces routes restent atteignables (toutes exigent déjà
|
||||
# une connexion, absentes de _PUBLIC_ENDPOINTS).
|
||||
if not user.get("project_slug") and endpoint not in _REACHABLE_WITHOUT_PROJECT:
|
||||
return redirect(url_for("onboarding_new"))
|
||||
slug = request.view_args.get("slug") if request.view_args else None
|
||||
if slug is not None and slug != user.get("project_slug"):
|
||||
abort(403)
|
||||
# Type d'onboarding "restreint" (quiz/embranchement/rpg, voir
|
||||
# db/games/game_type_catalog.py) : game_dashboard reste atteignable
|
||||
# comme pour "custom", mais routes/games/game_dashboard.py y rend
|
||||
# une version SIMPLIFIÉE (juste les écrans, pas d'onglets Objets/
|
||||
# Éléments de jeu/Variables) — rien à bloquer ici, la restriction
|
||||
# se fait au niveau du rendu, pas de l'accès à la route.
|
||||
if endpoint == "game_delete":
|
||||
# Un compte "user" n'a qu'UN SEUL projet, et aucun moyen d'en
|
||||
# recréer un une fois supprimé (games_new le renvoie toujours
|
||||
|
||||
Reference in New Issue
Block a user