"""Предпросмотр шаблонов и сообщений (HTMX).""" from __future__ import annotations import html from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse from admin.preview import SAMPLE_CONTEXT from admin.security import check_csrf from common.texts.render import MAX_MESSAGE_LENGTH, TemplateError, render, validate router = APIRouter(tags=["preview"]) @router.post("/preview", response_class=HTMLResponse) async def preview_message(request: Request) -> HTMLResponse: """Отрендерить текст с тестовыми значениями; результат — в sandbox-iframe.""" form = await request.form() check_csrf(request, str(form.get("csrf_token", ""))) text = str(form.get("text", "")) unknown = validate(text) if unknown: return HTMLResponse( '

Неизвестные теги: ' + html.escape(", ".join(unknown)) + "

" ) try: rendered = render(text, SAMPLE_CONTEXT) except TemplateError as exc: # pragma: no cover - validate уже отсекает неизвестные теги return HTMLResponse(f'

{html.escape(str(exc))}

') if len(rendered) > MAX_MESSAGE_LENGTH: return HTMLResponse( f'

Текст длиннее лимита Telegram: ' f"{len(rendered)} из {MAX_MESSAGE_LENGTH} символов.

" ) return HTMLResponse( '' )