Phase 1 (3/3) : bascule "par joueur" dans le tableau de bord
Dernier morceau du plan d'état par joueur : le créateur choisit, à la création d'une variable globale ou d'un objet, si chaque joueur aura sa propre valeur/ses propres lignes (coché par défaut) ou si elle est explicitement PARTAGÉE par tous les joueurs (ex. un compteur de visiteurs global, un catalogue commun) — voir db/global_vars/create_global_variable.py et db/definitions/create_definition.py (Phase 1, 1er commit). routes/global_vars/create_global_var.py, routes/objects/object_new.py : lisent la case à cocher "per_player" du formulaire (absente => reste per_player=1, comportement par défaut). templates/game_dashboard.html : case à cocher sur les deux panneaux de création + colonne "Par joueur" dans les deux tableaux existants, pour que ce réglage (immuable après création, comme le nom d'une variable) reste visible. db/definitions/list_definitions.py appelait _definitions directement sans jamais migrer son schéma — un tableau de bord ouvert avant la toute première création/modification d'objet aurait affiché "Non — partagé" pour un objet en réalité per_player=1 (colonne absente => Undefined, donc faux en Jinja) : corrigé en appelant ensure_field_bounds_schema() ici aussi, comme le fait déjà create_definition.py/get_definition.py. Vérifié : 239 tests passent (2 nouveaux, dont un qui aurait détecté le bug ci-dessus). Phase 1 (état par joueur) est maintenant complète : couche db/, route publique /jouer/<slug>, et ce réglage créateur. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
3c39f1a249
commit
4585a72588
@@ -97,6 +97,29 @@ def test_get_row_does_not_leak_across_players(game):
|
||||
assert db.get_row(game, definition, row_id, player_id="alice") is not None
|
||||
|
||||
|
||||
def test_create_global_var_route_respects_per_player_checkbox(client, game):
|
||||
client.post(f"/game/{game}/variables/new", data={
|
||||
"name": "score", "type": "nombre_entier", "default_value": "0",
|
||||
})
|
||||
assert db.list_global_variables(game)[0]["per_player"] == 1
|
||||
|
||||
client.post(f"/game/{game}/variables/new", data={
|
||||
"name": "compteur_visites", "type": "nombre_entier", "default_value": "0", "per_player": "0",
|
||||
})
|
||||
variables = {v["name"]: v for v in db.list_global_variables(game)}
|
||||
assert variables["compteur_visites"]["per_player"] == 0
|
||||
|
||||
|
||||
def test_object_new_route_respects_per_player_checkbox(client, game):
|
||||
client.post(f"/game/{game}/objects/new", data={"object_name": "Inventaire"})
|
||||
definitions = {d["name"]: d for d in db.list_definitions(game)}
|
||||
assert definitions["Inventaire"]["per_player"] == 1
|
||||
|
||||
client.post(f"/game/{game}/objects/new", data={"object_name": "Catalogue", "per_player": "0"})
|
||||
definitions = {d["name"]: d for d in db.list_definitions(game)}
|
||||
assert definitions["Catalogue"]["per_player"] == 0
|
||||
|
||||
|
||||
def test_creator_preview_default_matches_shared_definition_behavior(game):
|
||||
"""L'aperçu créateur (aucun player_id passé nulle part, donc
|
||||
PLAYER_SHARED partout) doit continuer de fonctionner exactement comme
|
||||
|
||||
Reference in New Issue
Block a user