Files
Forge-Engine/routes/objects/object_new.py
T
williamandClaude Sonnet 5 4585a72588
Build and deploy / test (push) Failing after 8s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
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>
2026-08-30 15:54:37 +02:00

36 lines
1.8 KiB
Python

from flask import request, redirect, url_for
import db
from core.flask_app import app
from .parse_field_rows import _parse_field_rows
@app.route("/game/<slug>/objects/new", methods=["GET", "POST"])
def object_new(slug):
"""La création d'un objet se fait désormais depuis un panneau déplaçable
sur le tableau de bord du jeu (voir game_dashboard.html, formulaire
#objectForm) plutôt qu'une page dédiée — cette route ne fait donc plus
que traiter la soumission de CE formulaire. Un GET direct (ex. lien
externe obsolète) redirige simplement vers le tableau de bord."""
if request.method == "POST":
name = request.form.get("object_name", "").strip()
# Aucun champ requis à la création : create_definition(fields=[])
# crée simplement une table sans colonne "métier" (juste id/
# created_at), et le panneau "Modifier un objet" (onglet Champs,
# bouton "+ Ajouter") permet d'en poser ensuite — exiger au moins
# un champ ici faisait échouer silencieusement la création (aucun
# message d'erreur, juste un retour au tableau de bord) dès qu'on
# tapait le nom sans avoir encore cliqué "+ Ajouter un champ".
fields = _parse_field_rows(request.form)
# État par joueur (Phase 1) : coché par défaut (une case DÉCOCHÉE
# explicitement rend l'objet partagé par tous les joueurs — ex. un
# catalogue/une liste de questions — voir db/definitions/
# create_definition.py).
per_player = request.form.get("per_player", "1") == "1"
if name:
definition_id = db.create_definition(slug, name, fields, per_player=per_player)
return redirect(url_for("object_view", slug=slug, definition_id=definition_id))
return redirect(url_for("game_dashboard", slug=slug))