Onboarding guidé systématique + tableau de bord simplifié
Build and deploy / test-python (push) Failing after 1m48s
Build and deploy / test-js (push) Successful in 53s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

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:
william
2026-09-02 06:22:45 +02:00
co-authored by Claude Sonnet 5
parent 0f23024882
commit 76a50fa87a
23 changed files with 876 additions and 52 deletions
+8 -2
View File
@@ -5,8 +5,9 @@ import pyotp
import auth
import db
from db.games.project_slug import build_slug, split_slug
from tests.test_auth import _register, _confirm_2fa, _cleanup_project, anon_client # noqa: F401
from tests.test_auth import _register, _confirm_2fa, _complete_onboarding, _cleanup_project, anon_client # noqa: F401
def test_profile_page_shows_current_user_info(anon_client):
@@ -122,6 +123,7 @@ def test_delete_account_requires_the_confirmation_phrase(anon_client):
def test_delete_account_removes_user_and_their_project(anon_client):
_register(anon_client, "deleteforreal@example.com")
_confirm_2fa(anon_client)
_complete_onboarding(anon_client)
user = auth.get_user_by_email("deleteforreal@example.com")
slug = user["project_slug"]
import os
@@ -218,6 +220,7 @@ def test_update_email_renames_the_user_project_folder(anon_client):
_register(anon_client, "oldmail@example.com")
_confirm_2fa(anon_client)
_complete_onboarding(anon_client)
old_user = auth.get_user_by_email("oldmail@example.com")
old_slug = old_user["project_slug"]
assert os.path.isdir(db.game_dir(old_slug))
@@ -229,7 +232,10 @@ def test_update_email_renames_the_user_project_folder(anon_client):
new_user = auth.get_user_by_email("newmail@example.com")
assert new_user is not None
new_slug = new_user["project_slug"]
assert new_slug == db.slugify("newmail@example.com")
# Structure de dossiers par utilisateur (voir db/games/
# project_slug.py) : seul le dossier PROPRIÉTAIRE change de nom,
# le dossier projet (project_part) reste le même.
assert new_slug == build_slug(db.slugify("newmail@example.com"), split_slug(old_slug)[1])
assert not os.path.isdir(db.game_dir(old_slug))
assert os.path.isdir(db.game_dir(new_slug))