From 7ca03380b756c98adcdb0b0d888048a60f1c6943 Mon Sep 17 00:00:00 2001 From: william Date: Sun, 20 Sep 2026 09:58:53 +0200 Subject: [PATCH] Retire l'action Publier du support de formation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Un apprenant n'a jamais acces a l'editeur : un etat "publie" persiste en base (published_at) ne servait donc a rien tant qu'aucune vue apprenant/export ne le consomme (retour utilisateur direct). Retrait complet : route /document//publish, db.mark_support_published, la colonne logique published_at dans support_meta, le bouton et son CSS/JS. "Aperçu" devient l'action primaire du bandeau (repond au vrai besoin : voir le rendu avant un futur export). Un export reel (SCORM ou equivalent) reste a specifier separement le jour venu. SKIP=djlint : meme backlog H021 pre-existant que le commit precedent, aucun fichier touche ici n'y figure. ruff/mypy --strict/vulture/ bandit/import-linter/eslint/stylelint tous verts ; 615 tests Python (617 - 2 tests du Publier retire) + verification manuelle live du retrait (route 404, bouton absent du HTML, Apercu confirme fonctionnel par simulation DOM). Co-Authored-By: Claude Sonnet 5 --- db/__init__.py | 2 -- db/supports/__init__.py | 2 -- db/supports/mark_support_published.py | 19 ------------------- db/supports/support_meta.py | 2 -- docs/plan/PLAN.md | 2 +- routes/document/__init__.py | 1 - routes/document/document_publish.py | 15 --------------- static/document/document-editor.css | 5 ----- static/document/js/document-editor.js | 19 +------------------ templates/document/document_edit.html | 19 +++---------------- tests/document/test_document_routes.py | 9 --------- tests/document/test_support_lifecycle.py | 9 --------- 12 files changed, 5 insertions(+), 99 deletions(-) delete mode 100644 db/supports/mark_support_published.py delete mode 100644 routes/document/document_publish.py diff --git a/db/__init__.py b/db/__init__.py index c16a2591..5ba194e4 100644 --- a/db/__init__.py +++ b/db/__init__.py @@ -79,7 +79,6 @@ from .slugify import slugify from .supports.create_support import create_support from .supports.delete_support import delete_support from .supports.list_supports import list_supports -from .supports.mark_support_published import mark_support_published from .supports.support_meta import support_meta from .table_name_for import table_name_for @@ -118,7 +117,6 @@ __all__ = [ "list_supports", "support_meta", "delete_support", - "mark_support_published", "ONBOARDING_TYPES", "DEFAULT_ONBOARDING_TYPE", "get_onboarding_type", diff --git a/db/supports/__init__.py b/db/supports/__init__.py index 0c7b90b9..3f7d72d4 100644 --- a/db/supports/__init__.py +++ b/db/supports/__init__.py @@ -7,7 +7,6 @@ indépendance.""" from .create_support import create_support from .delete_support import delete_support from .list_supports import list_supports -from .mark_support_published import mark_support_published from .support_connection import connect_support, install_support_teardown_safety_net from .support_dir import support_dir from .support_meta import support_meta @@ -21,7 +20,6 @@ __all__ = [ "delete_support", "install_support_teardown_safety_net", "list_supports", - "mark_support_published", "split_slug", "support_dir", "support_meta", diff --git a/db/supports/mark_support_published.py b/db/supports/mark_support_published.py deleted file mode 100644 index 25bca0a7..00000000 --- a/db/supports/mark_support_published.py +++ /dev/null @@ -1,19 +0,0 @@ -from datetime import UTC, datetime - -from .support_connection import connect_support - - -def mark_support_published(slug: str) -> str: - """Enregistre l'horodatage de publication (_meta['published_at']) — - état réellement persisté, pas un simple accusé de réception côté - client (voir docs/plan/PLAN.md, "Publier" doit être réel).""" - published_at = datetime.now(UTC).isoformat() - conn = connect_support(slug) - conn.execute( - "INSERT INTO _meta (key, value) VALUES ('published_at', ?) " - "ON CONFLICT(key) DO UPDATE SET value = excluded.value", - (published_at,), - ) - conn.commit() - conn.close() - return published_at diff --git a/db/supports/support_meta.py b/db/supports/support_meta.py index 6ab781d1..4c6bd0db 100644 --- a/db/supports/support_meta.py +++ b/db/supports/support_meta.py @@ -6,10 +6,8 @@ from .support_connection import connect_support def support_meta(slug: str) -> dict[str, Any]: conn = connect_support(slug) row = conn.execute("SELECT value FROM _meta WHERE key = 'name'").fetchone() - published_row = conn.execute("SELECT value FROM _meta WHERE key = 'published_at'").fetchone() conn.close() return { "slug": slug, "name": row["value"] if row else slug, - "published_at": published_row["value"] if published_row else None, } diff --git a/docs/plan/PLAN.md b/docs/plan/PLAN.md index a10f4b06..dee40bba 100644 --- a/docs/plan/PLAN.md +++ b/docs/plan/PLAN.md @@ -140,7 +140,7 @@ Cette liste consolide toutes les fonctions validées à travers les maquettes in - Zoom du canvas (boutons +/-, affichage du pourcentage) - Undo / Redo - Mode Aperçu -- Action Publier +- ~~Action Publier~~ — retiré (voir décision du 20/09/2026) : un apprenant n'a jamais accès à l'éditeur, un état "publié" persisté en base ne sert donc à rien tant qu'aucune vue apprenant/export ne le consomme. L'action Aperçu ci-dessus couvre le besoin réel ("voir à quoi le document ressemble avant export"), un futur export (SCORM ou équivalent) reste à spécifier séparément le jour venu. - Bascule de thème clair/sombre de l'interface d'édition, mémorisée par utilisateur ### 3.2 Bibliothèque d'éléments (panneau gauche) diff --git a/routes/document/__init__.py b/routes/document/__init__.py index 9bd5ae42..ed93d747 100644 --- a/routes/document/__init__.py +++ b/routes/document/__init__.py @@ -11,6 +11,5 @@ from . import ( # noqa: F401 - enregistre les routes definies dans chaque modul document_element_move, document_element_update, document_new, - document_publish, document_render, ) diff --git a/routes/document/document_publish.py b/routes/document/document_publish.py deleted file mode 100644 index fc5b3b42..00000000 --- a/routes/document/document_publish.py +++ /dev/null @@ -1,15 +0,0 @@ -from flask import jsonify -from werkzeug.wrappers import Response - -import db -from core.flask_app import app - - -@app.route("/document//publish", methods=["POST"]) -def document_publish(slug: str) -> Response: - """Publie le support — vrai changement d'état persisté - (_meta['published_at'], voir db/supports/mark_support_published.py), - pas juste un toast côté client (voir docs/plan/PLAN.md, "Publier - réel").""" - published_at = db.mark_support_published(slug) - return jsonify({"ok": True, "published_at": published_at}) diff --git a/static/document/document-editor.css b/static/document/document-editor.css index f8ee0b21..669cb279 100644 --- a/static/document/document-editor.css +++ b/static/document/document-editor.css @@ -147,11 +147,6 @@ background: rgb(255 95 46 / 8%); } -.docBtnPrimary.is-published { - color: var(--status-success, #10b981); - border-color: var(--status-success, #10b981); -} - .docWidthPicker { display: flex; gap: 4px; diff --git a/static/document/js/document-editor.js b/static/document/js/document-editor.js index 9d0445d7..3dc31ede 100644 --- a/static/document/js/document-editor.js +++ b/static/document/js/document-editor.js @@ -81,10 +81,6 @@ function forgeDocApiRender() { return fetch(`/document/${window.forgeDocState.slug}/render`).then((r) => r.json()); } -function forgeDocApiPublish() { - return fetch(`/document/${window.forgeDocState.slug}/publish`, { method: 'POST' }).then((r) => r.json()); -} - /* --------------------------------------------------------------------- * Canevas — rafraîchi depuis la VÉRITÉ SERVEUR après chaque mutation * structurelle (jamais une simple retouche DOM locale, voir @@ -676,7 +672,7 @@ function forgeDocRenderProps(el) { /* --------------------------------------------------------------------- * Chrome de l'éditeur : zoom, largeur d'aperçu responsive, Aperçu, - * Publier, thème (scopé à .docEditor3), navigation mobile. + * thème (scopé à .docEditor3), navigation mobile. * ------------------------------------------------------------------- */ function forgeDocBindZoom() { @@ -718,18 +714,6 @@ function forgeDocBindPreviewToggle() { }); } -function forgeDocBindPublish() { - document.getElementById('docPublishBtn').addEventListener('click', () => { - forgeDocApiPublish().then((result) => { - if (!result.ok) return; - const label = document.getElementById('docPublishLabel'); - const btn = document.getElementById('docPublishBtn'); - label.textContent = 'Publié'; - btn.classList.add('is-published'); - }); - }); -} - function forgeDocApplyTheme(theme) { const editor = document.getElementById('docEditor3'); editor.dataset.theme = theme; @@ -817,7 +801,6 @@ function forgeDocInit() { forgeDocBindZoom(); forgeDocBindWidthPicker(); forgeDocBindPreviewToggle(); - forgeDocBindPublish(); forgeDocBindThemeToggle(); forgeDocBindMobileNav(); forgeDocBindKeyboardShortcuts(); diff --git a/templates/document/document_edit.html b/templates/document/document_edit.html index 56753eec..bffec528 100644 --- a/templates/document/document_edit.html +++ b/templates/document/document_edit.html @@ -61,7 +61,9 @@
- -
assert delete_resp.get_json()["ok"] is True -def test_document_publish_persists_published_at(client: FlaskClient, support: str) -> None: - assert db.support_meta(support)["published_at"] is None - resp = client.post(f"/document/{support}/publish") - assert resp.status_code == 200 - published_at = resp.get_json()["published_at"] - assert published_at is not None - assert db.support_meta(support)["published_at"] == published_at - - def test_restricted_user_can_have_one_game_and_one_support_at_once( user_client: FlaskClient, tmp_game_slug_cleanup: Any, tmp_support_slug_cleanup: Any ) -> None: diff --git a/tests/document/test_support_lifecycle.py b/tests/document/test_support_lifecycle.py index e9fdfb5c..0cbc6664 100644 --- a/tests/document/test_support_lifecycle.py +++ b/tests/document/test_support_lifecycle.py @@ -14,7 +14,6 @@ def test_create_support_creates_its_own_db_file_and_schema(tmp_support_slug_clea tmp_support_slug_cleanup(slug) meta = db.support_meta(slug) assert meta["name"] == "Sécurité incendie" - assert meta["published_at"] is None def test_list_supports_scopes_to_owner_and_excludes_games( @@ -54,14 +53,6 @@ def test_create_support_avoids_name_collision_for_the_same_owner(tmp_support_slu assert slug_1 != slug_2 -def test_mark_support_published_persists_a_timestamp(tmp_support_slug_cleanup: Any) -> None: - slug = db.create_support("À publier", owner_folder="47") - tmp_support_slug_cleanup(slug) - assert db.support_meta(slug)["published_at"] is None - published_at = db.mark_support_published(slug) - assert db.support_meta(slug)["published_at"] == published_at - - def test_delete_support_removes_it_from_the_listing(tmp_support_slug_cleanup: Any) -> None: slug = db.create_support("Temporaire", owner_folder="48") tmp_support_slug_cleanup(slug)