This repository has been archived on 2026-08-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

56 lines
2.5 KiB
Python

import logging
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy import select
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import Session
from .. import models, schemas
from ..database import get_db
from ..deps import get_current_user, require_admin
from ..proxmox_templates import list_templates as discover_templates
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/templates", tags=["templates"])
@router.get("", response_model=list[schemas.TemplateOut])
def list_templates(db: Session = Depends(get_db), _: models.User = Depends(get_current_user)):
"""Возвращает только уже импортированные шаблоны панели."""
return list(db.scalars(select(models.Template).where(models.Template.is_active.is_(True)).order_by(models.Template.created_at.desc())))
@router.get("/from-proxmox")
def list_proxmox_templates(_: models.User = Depends(require_admin)):
"""Ищет шаблоны непосредственно на Proxmox; ничего не записывает в БД."""
try:
return discover_templates()
except Exception:
logger.exception("Не удалось получить список шаблонов Proxmox")
raise HTTPException(status_code=502, detail="Proxmox временно недоступен")
@router.post("", response_model=schemas.TemplateOut, status_code=status.HTTP_201_CREATED)
def create_template(payload: schemas.TemplateCreate, db: Session = Depends(get_db), _: models.User = Depends(require_admin)):
"""Импортирует или создаёт один шаблон в каталоге панели."""
template = models.Template(**payload.model_dump())
db.add(template)
try:
db.commit()
except IntegrityError:
db.rollback()
raise HTTPException(status_code=409, detail="Шаблон с таким именем уже существует")
db.refresh(template)
return template
@router.delete("/{template_id}")
def deactivate_template(template_id: int, db: Session = Depends(get_db), _: models.User = Depends(require_admin)):
"""Деактивирует шаблон без удаления связанных инстансов."""
template = db.get(models.Template, template_id)
if template is None:
raise HTTPException(status_code=404, detail="Шаблон не найден")
template.is_active = False
db.commit()
return {"ok": True}