"""Предпросмотр шаблонов и сообщений (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( '' )