klg-asutk-app/backend/app/api/routes/document_templates.py
Yuriy 0cf1cfdaec feat: библиотека шаблонов документов (25 шт.) в стиле REFLY
- DocumentTemplate: модель, CRUD API, seed 25 шаблонов
- Категории: заявки, сертификаты, акты, письма, формы, отчёты, приказы
- Стандарты: РФ (ФАП-145/146/148/246), ICAO, EASA, FAA
- Бренд-бук REFLY: шапка, подвал, цвета #1e3a5f, печатный формат A4
- Поля contenteditable для заполнения в браузере
- DocumentPreviewModal: просмотр, заполнение, печать
- Страница /templates с фильтрами по категории и стандарту
- Alembic миграция 0002_document_templates

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-15 16:37:09 +03:00

79 lines
2.4 KiB
Python

"""Шаблоны документов — CRUD + предпросмотр."""
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from pydantic import BaseModel
from app.api.deps import get_current_user, require_roles, get_db
from app.api.helpers import paginate_query
from app.models.document_template import DocumentTemplate
router = APIRouter(tags=["document_templates"])
class TemplateOut(BaseModel):
id: str
code: str
name: str
category: str
standard: str
description: str | None
html_content: str
version: int
class Config:
from_attributes = True
class TemplateUpdate(BaseModel):
name: str | None = None
description: str | None = None
html_content: str | None = None
@router.get("/document-templates")
def list_templates(
category: str | None = None,
standard: str | None = None,
page: int = Query(1, ge=1),
per_page: int = Query(50, ge=1, le=100),
db: Session = Depends(get_db),
user=Depends(get_current_user),
):
q = db.query(DocumentTemplate).filter(DocumentTemplate.is_active == True)
if category:
q = q.filter(DocumentTemplate.category == category)
if standard:
q = q.filter(DocumentTemplate.standard == standard)
q = q.order_by(DocumentTemplate.sort_order, DocumentTemplate.name)
return paginate_query(q, page, per_page)
@router.get("/document-templates/{template_id}", response_model=TemplateOut)
def get_template(template_id: str, db: Session = Depends(get_db), user=Depends(get_current_user)):
t = db.query(DocumentTemplate).filter(DocumentTemplate.id == template_id).first()
if not t:
raise HTTPException(404, "Template not found")
return t
@router.patch("/document-templates/{template_id}", response_model=TemplateOut,
dependencies=[Depends(require_roles("admin", "authority_inspector"))])
def update_template(
template_id: str,
payload: TemplateUpdate,
db: Session = Depends(get_db),
user=Depends(get_current_user),
):
t = db.query(DocumentTemplate).filter(DocumentTemplate.id == template_id).first()
if not t:
raise HTTPException(404, "Template not found")
if payload.name is not None:
t.name = payload.name
if payload.description is not None:
t.description = payload.description
if payload.html_content is not None:
t.html_content = payload.html_content
db.commit()
db.refresh(t)
return t