Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c8fc3070a | ||
|
|
49164ce057 |
@@ -1,5 +1,31 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v7.82.1 (2026-10-25) — CI : lint ruff vert et littéral de version resynchronisé
|
||||
|
||||
- **Lint (CI run 2304, job 7058)** : les 16 erreurs `ruff check
|
||||
app tests` sont corrigées dans le code, sans toucher à la
|
||||
configuration ruff ni ajouter de `noqa` : import du routeur MCP
|
||||
remonté en tête de `app/main.py` (E402/I001) ; `raise … from
|
||||
None` / `from exc` sur les 8 `raise` dans des `except` de
|
||||
`app/routers/api_v2/templates_io.py` (B904) ; `datetime.UTC`
|
||||
dans `app/services/agent_evenements.py` (UP017) ; variables
|
||||
mortes `void`/`uid` et import devenu inutilisé retirés de
|
||||
`app/services/fd_templates.py` (F841) ; import `json`
|
||||
inutilisé et variable `n_presets` morte retirés de
|
||||
`tests/test_fd_templates.py` (F401/F841).
|
||||
- **Test de version** : `test_pwa_offline` cherche le littéral
|
||||
`version="…"` dans `app/main.py` — patron historique des bumps
|
||||
(`scripts/bump_version.py` le cherche aussi), rompu en 7.80.2
|
||||
quand l'argument FastAPI est passé à la lecture dynamique de
|
||||
`VERSION`. Le littéral est reposé en commentaire de
|
||||
synchronisation explicite (`version="7.82.1"`), à mettre à
|
||||
jour à chaque bump ; la version runtime reste lue
|
||||
dynamiquement depuis `VERSION` par `_lire_version()`.
|
||||
- Aucun autre comportement modifié. Huit échecs de tests
|
||||
pré-existants (antérieurs à la 7.82.0, prouvés par comparaison
|
||||
des runs ciblés sur `eb4c42b` et `f844940`) restent ouverts et
|
||||
ne sont pas corrigés par cette version.
|
||||
|
||||
## v7.82.0 (2026-10-25) — Noms publics dracodev par configuration (dev/prod)
|
||||
|
||||
- **Aucun nom public d'une autre application n'est plus codé en dur**
|
||||
|
||||
+8
-2
@@ -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.1"
|
||||
# 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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user