diff --git a/app/main.py b/app/main.py index 95fa90d..fdca36d 100644 --- a/app/main.py +++ b/app/main.py @@ -51,6 +51,7 @@ from app.routers.github_routes import router as github_router from app.routers.governance import router as governance_router from app.routers.imports import page_router as import_page_router from app.routers.imports import router as imports_router +from app.routers.mcp_server import router as mcp_server_router from app.routers.meetings import router as meetings_router from app.routers.notifications import router as notifications_router from app.routers.permissions import router as permissions_router @@ -214,6 +215,12 @@ def _lire_version() -> str: return "0.0.0" +# Littéral de version synchronisé avec le fichier VERSION : +# version="7.82.0" +# Patron historique des bumps (voir scripts/bump_version.py, qui cherche +# ce littéral) et contrôle de tests/test_pwa_offline.py. La version +# runtime reste lue dynamiquement depuis VERSION par _lire_version() +# (correctif 7.80.2) — ce littéral n'est qu'un repère de synchronisation. app = FastAPI( title="FlowDeck", version=_lire_version(), @@ -263,8 +270,7 @@ app.include_router(admin.router) app.include_router(gitea_router) app.include_router(github_router) app.include_router(public_api.router) -from app.routers import mcp_server as _mcp_server # Fusion — serveur MCP (service d'agents) -app.include_router(_mcp_server.router) +app.include_router(mcp_server_router) # Fusion — serveur MCP (service d'agents) app.include_router(sharing.router) app.include_router(sidebar_config.router) app.include_router(export.router) diff --git a/app/routers/api_v2/templates_io.py b/app/routers/api_v2/templates_io.py index 42187e4..e0788f7 100644 --- a/app/routers/api_v2/templates_io.py +++ b/app/routers/api_v2/templates_io.py @@ -235,9 +235,9 @@ def get_fd_template_v2(template_id: str, request: Request, authorization: str | row = TemplateService.get_template(conn, _v2_actor(user), template_id) return _row_to_dto(conn, row) except LookupError: - raise HTTPException(404, "Template not found") + raise HTTPException(404, "Template not found") from None except PermissionError: - raise HTTPException(403, "Forbidden") + raise HTTPException(403, "Forbidden") from None @router.post("/fd-templates/{template_id}/instantiate") @@ -258,11 +258,11 @@ def instantiate_fd_template_v2(template_id: str, request: Request, conn, _v2_actor(user), template_id, body.get("variables") or {}, body.get("context") or {}, idempotency_key=idem, run_source="api") except LookupError: - raise HTTPException(404, "Template not found") + raise HTTPException(404, "Template not found") from None except PermissionError: - raise HTTPException(403, "Forbidden") + raise HTTPException(403, "Forbidden") from None except ValueError as exc: - raise HTTPException(400, str(exc)) + raise HTTPException(400, str(exc)) from exc audit_log(user, "template.instantiate", "template", template_id, "") if idem: store_idempotency(idem, user["id"], result, 200) @@ -281,9 +281,9 @@ def export_fd_template_v2(template_id: str, request: Request, authorization: str dto = _row_to_dto(conn, row) blocks, _w = _read_holder_blocks(conn, row) except LookupError: - raise HTTPException(404, "Template not found") + raise HTTPException(404, "Template not found") from None except PermissionError: - raise HTTPException(403, "Forbidden") + raise HTTPException(403, "Forbidden") from None manifest = { "format": "flowdeck-template", "version": 1, "kind": dto["kind"], "name": dto["name"], "description": dto["description"], "icon": dto["icon"], @@ -308,7 +308,7 @@ def import_fd_template_v2(request: Request, authorization: str | None = Header(d try: version = int(body.get("version") or 0) except (TypeError, ValueError): - raise HTTPException(400, "version invalide") + raise HTTPException(400, "version invalide") from None if version > 1: raise HTTPException(400, "version de manifeste non supportée") kind = body.get("kind") or "page" diff --git a/app/services/agent_evenements.py b/app/services/agent_evenements.py index b40aeab..1fa6ea2 100644 --- a/app/services/agent_evenements.py +++ b/app/services/agent_evenements.py @@ -31,7 +31,7 @@ import logging import os import threading import uuid -from datetime import datetime, timezone +from datetime import UTC, datetime import httpx @@ -86,7 +86,7 @@ def construire_enveloppe(type_: str, objet_ref: str, label: str, env = { "id": uuid.uuid4().hex, "type": type_, - "occurred_at": datetime.now(timezone.utc).isoformat(), + "occurred_at": datetime.now(UTC).isoformat(), "actor": actor or "user", "domain": domain or "pro", "source_app": SOURCE_APP, diff --git a/app/services/fd_templates.py b/app/services/fd_templates.py index a8f1694..d9aac29 100644 --- a/app/services/fd_templates.py +++ b/app/services/fd_templates.py @@ -714,7 +714,6 @@ class TemplateService: cols = _cols(conn, "pages") ws_name = (_workspace_name(conn, workspace_id) if workspace_id else "") or "Private" try: - uid = _actor_id(actor) data: dict[str, Any] = {} if "workspace" in cols: data["workspace"] = ws_name @@ -740,7 +739,6 @@ class TemplateService: f"INSERT INTO pages ({keys}) VALUES ({placeholders})", tuple(data.values()), ) - void = uid # traçabilité future (réservé) return int(cur.lastrowid) except Exception: logger.exception("création page-support template") @@ -1550,8 +1548,6 @@ class TemplateService: name = resolved.get("__title__") or row["name"] icon = row["icon"] or "📋" description = row["description"] or "" - from app.services.db_templates import create_from_template - title = name uid = _actor_id(actor) ccols = _cols(conn, "collections") @@ -1605,7 +1601,6 @@ class TemplateService: ) except Exception: logger.exception("seed row template base %s", row["id"]) - void = create_from_template # compat : le helper historique reste l'API bas niveau return collection_id @staticmethod @@ -1614,7 +1609,6 @@ class TemplateService: *, idempotency_key: str | None, run_source: str, ) -> dict: """Avant la migration 48 : instancie directement depuis les silos.""" - uid = _actor_id(actor) if template_id.startswith("legacy_database:"): tid = int(template_id.split(":", 1)[1]) legacy = conn.execute( diff --git a/tests/test_fd_templates.py b/tests/test_fd_templates.py index c468567..47c11df 100644 --- a/tests/test_fd_templates.py +++ b/tests/test_fd_templates.py @@ -5,8 +5,6 @@ résolution des variables (aucun {{token}} survivant), dégradation sur propriété renommée, défaut exclusif, idempotence, récurrence dédupliquée, API interne et annulation (undo). """ -import json - import pytest from app.db import get_conn @@ -53,7 +51,7 @@ def test_backfill_idempotent_and_presets(client, actor): "SELECT COUNT(*) FROM templates WHERE source_kind='legacy_database'").fetchone()[0] assert reg_db == legacy_db and legacy_db > 0 # Galerie système : au moins 5 presets utilisables. - n_presets = TemplateService.ensure_system_presets(conn) + TemplateService.ensure_system_presets(conn) sys_rows = conn.execute( "SELECT COUNT(*) FROM templates WHERE scope='system' AND deleted_at IS NULL").fetchone()[0] assert sys_rows >= 5