Corrige les réglages fantômes d'un exemplaire d'élément de jeu déjà posé

Bug remonté : la taille d'un Titre réglée à 18px dans le modèle affichait
21px "sur l'écran". Cause : un exemplaire posé AVANT le passage en mode
"toujours lié au modèle" (tour précédent) avait été créé par l'ancien
mécanisme instantiate_template_tree (retiré), qui copiait tout l'arbre en
base - ces lignes copiées (l'ancien enfant "Titre", encore à 21px depuis
avant le changement) ne sont plus jamais RENDUES (le contenu vient
désormais toujours en direct du modèle, voir le tour précédent), mais
restaient toujours sélectionnables dans l'arborescence de l'éditeur, avec
leurs propres réglages jamais synchronisés. Cliquer dessus dans l'arbre
affichait donc ses vieux réglages (21px) dans le panneau de propriétés,
donnant l'impression trompeuse que le modèle (18px) n'était pas pris en
compte - alors que le rendu réel utilisait déjà correctement 18px.

Fix, dans list_elements.py : tout élément dont un ANCÊTRE a
element_type_id réglé est maintenant exclu de la liste renvoyée à
l'éditeur (arborescence, sélection, panneau de propriétés) - son contenu
n'a plus aucune existence propre, seul l'écran-modèle fait foi. Les
lignes elles-mêmes restent en base (pas de suppression, un simple filtre
en lecture) mais ne sont plus jamais atteignables depuis l'éditeur.

Ajoute un test de régression qui simule exactement ce scénario (ligne
orpheline avec un ancien réglage figé) et vérifie qu'elle n'apparaît plus
nulle part - ni dans le canevas, ni via une sélection directe par id.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-08-25 16:10:30 +02:00
co-authored by Claude Sonnet 5
parent 94f1414506
commit 4dc42a7f3b
2 changed files with 71 additions and 0 deletions
+41
View File
@@ -56,6 +56,47 @@ def test_editing_the_template_updates_the_play_page_too(client, game):
assert "Contenu mis à jour" in html
def test_leftover_orphaned_children_no_longer_appear_in_the_editor(client, game):
"""Régression : un exemplaire posé AVANT ce mécanisme (ou tout ancien
enfant copié en base par l'ex-instantiate_template_tree, retiré)
laisse d'éventuelles lignes orphelines en base sous l'exemplaire — leur
contenu n'est plus jamais rendu (voir render_element_html.py), mais
elles restaient sélectionnables dans l'arborescence de l'éditeur, avec
leurs propres réglages jamais synchronisés avec le modèle : une taille
de texte modifiée dans le modèle ne s'y reflétait jamais, donnant
l'impression trompeuse que "les propriétés ne sont pas prises en
compte"."""
import json
import db
et, _titre_id = _create_card_element_type(client, game)
screen_id = _create_screen(client, game)
resp = client.post(
f"/game/{game}/screens/{screen_id}/elements/add",
data={"widget": "__catalogue__", "element_type_id": str(et["id"])},
follow_redirects=False,
)
instance_id = int(re.search(r"selected=(\d+)", resp.headers["Location"]).group(1))
conn = db.connect(game)
conn.execute(
"""INSERT INTO _screen_elements (screen_id, parent_id, widget, content, attributes, x, y, width, height, z_index, style)
VALUES (?, ?, 'titre', 'Ancien contenu figé', '{}', 10, 10, 50, 20, 1, ?)""",
(screen_id, instance_id, json.dumps({"font-size": "21px"})),
)
orphan_id = conn.execute("SELECT last_insert_rowid() AS id").fetchone()["id"]
conn.commit()
conn.close()
html = client.get(f"/game/{game}/screens/{screen_id}/edit").data.decode()
assert f'id="elt-{orphan_id}"' not in html
assert "Ancien contenu figé" not in html
html_selected = client.get(f"/game/{game}/screens/{screen_id}/edit?selected={orphan_id}").data.decode()
assert 'value="21' not in html_selected
def test_instance_position_on_screen_is_independent_per_instance(client, game):
"""Non-régression : la position/taille sur l'écran reste propre à
chaque exemplaire (seul le CONTENU intérieur est désormais partagé)."""