Build and deploy / test-python (push) Failing after 59s
Build and deploy / test-js (push) Successful in 50s
Build and deploy / lint-python (push) Failing after 59s
Build and deploy / lint-js (push) Failing after 1m1s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
Build and deploy / sonarqube (push) Failing after 59s
Cinquieme mini-jeu du support de formation : le createur ecrit une situation initiale, definit 2 a 4 choix, indique lequel est le bon, et redige la consequence de chaque choix. Plusieurs scenarios peuvent etre crees, joues dans l'ordre d'ecriture (jamais melanges, contrairement a Association/Memory/Mots meles : ce sont des mises en situation sequentielles). En Apercu, l'apprenant lit la situation, choisit une option, decouvre la consequence de SON choix et si c'etait le bon, puis passe au scenario suivant. Comme Association/Memory/Mots meles, le dernier scenario reste affiche une fois repondu : seul le bouton Recommencer apparait, jamais un ecran de resultat separe (reserve au Quiz). Reutilise les classes visuelles du Quiz (docQuizOptions/ docQuizFeedback/docQuizNextBar) plutot que de dupliquer ces regles. Verifie via simulation DOM reelle (jsdom) : progression entre plusieurs scenarios, choix correct/incorrect avec revelation de la bonne reponse, comportement de fin de partie, panneau Proprietes (ajout/suppression de scenario, changement du nombre de choix, selection du bon choix). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
56 lines
2.6 KiB
Python
56 lines
2.6 KiB
Python
from typing import Any
|
|
|
|
from flask import jsonify, request
|
|
from werkzeug.wrappers import Response
|
|
|
|
import db
|
|
import document_engine
|
|
from core.flask_app import app
|
|
|
|
|
|
@app.route("/document/<slug>/elements/<int:element_id>/update", methods=["POST"])
|
|
def document_element_update(slug: str, element_id: int) -> Response | tuple[Response, int]:
|
|
"""Remplace les attributs d'un élément — un formulaire du panneau
|
|
Propriétés (voir static/document/js/document-editor.js) envoie
|
|
systématiquement l'état complet de ses champs.
|
|
|
|
Quiz, Association, Memory, Mots mêlés et Scénario sont les seuls
|
|
kinds revalidés côté serveur (sanitize_quiz_config/
|
|
sanitize_association_config/sanitize_memory_config/
|
|
sanitize_mots_config/sanitize_scenario_config, même convention que
|
|
game_engine/rendering/quiz_box_config.py côté jeu) : leur forme (liste
|
|
de questions/choix, liste de paires, liste de cartes, liste de mots,
|
|
liste de scénarios) doit rester structurellement correcte pour que le
|
|
rendu ne plante jamais, contrairement aux autres kinds
|
|
(texte/forme/image...) dont les attributs sont de simples valeurs
|
|
scalaires sans structure à garantir."""
|
|
element = document_engine.get_document_element(slug, element_id)
|
|
if element is None:
|
|
return jsonify({"error": "élément introuvable"}), 404
|
|
attributes: dict[str, Any] = request.get_json(force=True) or {}
|
|
if element["kind"] == "quiz":
|
|
attributes = document_engine.sanitize_quiz_config(attributes)
|
|
elif element["kind"] == "association":
|
|
attributes = document_engine.sanitize_association_config(attributes)
|
|
elif element["kind"] == "memory":
|
|
attributes = document_engine.sanitize_memory_config(attributes)
|
|
elif element["kind"] == "mots":
|
|
attributes = document_engine.sanitize_mots_config(attributes)
|
|
elif element["kind"] == "scenario":
|
|
attributes = document_engine.sanitize_scenario_config(attributes)
|
|
document_engine.update_document_element_attributes(slug, element_id, attributes)
|
|
element = db.assert_not_none(
|
|
document_engine.get_document_element(slug, element_id),
|
|
"element_id verifie present juste au-dessus, aucune suppression concurrente possible entre-temps ici",
|
|
)
|
|
elements_by_parent: dict[int | None, list[dict[str, Any]]] = {}
|
|
for el in document_engine.list_document_elements(slug):
|
|
elements_by_parent.setdefault(el["parent_id"], []).append(el)
|
|
return jsonify(
|
|
{
|
|
"ok": True,
|
|
"attributes": element["attributes"],
|
|
"rendered_html": document_engine.render_document_element(element, elements_by_parent),
|
|
}
|
|
)
|