- 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>
79 lines
2.4 KiB
Python
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
|