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//elements/add", methods=["POST"]) def document_element_add(slug: str) -> Response | tuple[Response, int]: """Ajoute un élément — appelée en AJAX depuis la bibliothèque du panneau gauche (clic ou glisser-déposer initial), OU par le moteur de layout lui-même pour créer une rangée à la volée au moment d'un dépôt latéral (kind="row" — jamais choisi directement dans la bibliothèque, absent de document_engine.ELEMENT_LIBRARY, mais un kind valide comme un autre pour cette route ; voir static/document/js/document-editor.js). parent_id, quand fourni, place l'élément directement dans une rangée existante.""" kind = request.form.get("kind", "") if kind not in document_engine.ELEMENT_KIND_LABELS: return jsonify({"error": "type d'élément inconnu"}), 400 parent_id = request.form.get("parent_id", type=int) element_id = document_engine.add_document_element(slug, kind, parent_id=parent_id) element = db.assert_not_none( document_engine.get_document_element(slug, element_id), "element_id vient d'etre cree par add_document_element juste au-dessus", ) 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( { "id": element_id, "kind": kind, "parent_id": parent_id, "attributes": element["attributes"], "rendered_html": document_engine.render_document_element(element, elements_by_parent), } )