157 lines
5.0 KiB
Python
157 lines
5.0 KiB
Python
"""Application template management web routes (Super Admin only)."""
|
|
|
|
from fastapi import APIRouter, Request, Depends, Form
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
from sqlalchemy.orm import Session
|
|
from ..database import get_db
|
|
from ..models.user import User
|
|
from ..models.endpoint import ApplicationTemplate, Protocol
|
|
from .deps import require_super_admin_web, flash, get_flashed_messages
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/applications", response_class=HTMLResponse)
|
|
async def list_applications(
|
|
request: Request,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_super_admin_web)
|
|
):
|
|
"""List all application templates."""
|
|
applications = db.query(ApplicationTemplate).order_by(ApplicationTemplate.name).all()
|
|
|
|
return request.app.state.templates.TemplateResponse(
|
|
"applications/list.html",
|
|
{
|
|
"request": request,
|
|
"current_user": current_user,
|
|
"applications": applications,
|
|
"flash_messages": get_flashed_messages(request)
|
|
}
|
|
)
|
|
|
|
|
|
@router.get("/applications/new", response_class=HTMLResponse)
|
|
async def new_application_form(
|
|
request: Request,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_super_admin_web)
|
|
):
|
|
"""New application template form."""
|
|
return request.app.state.templates.TemplateResponse(
|
|
"applications/form.html",
|
|
{
|
|
"request": request,
|
|
"current_user": current_user,
|
|
"application": None,
|
|
"flash_messages": get_flashed_messages(request)
|
|
}
|
|
)
|
|
|
|
|
|
@router.post("/applications/new")
|
|
async def create_application(
|
|
request: Request,
|
|
name: str = Form(...),
|
|
default_port: int = Form(...),
|
|
protocol: str = Form("tcp"),
|
|
description: str = Form(None),
|
|
icon: str = Form(None),
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_super_admin_web)
|
|
):
|
|
"""Create new application template."""
|
|
# Check if name exists
|
|
existing = db.query(ApplicationTemplate).filter(ApplicationTemplate.name == name).first()
|
|
if existing:
|
|
flash(request, "Anwendungsname bereits vergeben", "danger")
|
|
return RedirectResponse(url="/applications/new", status_code=303)
|
|
|
|
application = ApplicationTemplate(
|
|
name=name,
|
|
default_port=default_port,
|
|
protocol=Protocol(protocol),
|
|
description=description or None,
|
|
icon=icon or None
|
|
)
|
|
|
|
db.add(application)
|
|
db.commit()
|
|
|
|
flash(request, f"Anwendung '{name}' erstellt", "success")
|
|
return RedirectResponse(url="/applications", status_code=303)
|
|
|
|
|
|
@router.get("/applications/{app_id}/edit", response_class=HTMLResponse)
|
|
async def edit_application_form(
|
|
request: Request,
|
|
app_id: int,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_super_admin_web)
|
|
):
|
|
"""Edit application template form."""
|
|
application = db.query(ApplicationTemplate).filter(ApplicationTemplate.id == app_id).first()
|
|
if not application:
|
|
flash(request, "Anwendung nicht gefunden", "danger")
|
|
return RedirectResponse(url="/applications", status_code=303)
|
|
|
|
return request.app.state.templates.TemplateResponse(
|
|
"applications/form.html",
|
|
{
|
|
"request": request,
|
|
"current_user": current_user,
|
|
"application": application,
|
|
"flash_messages": get_flashed_messages(request)
|
|
}
|
|
)
|
|
|
|
|
|
@router.post("/applications/{app_id}/edit")
|
|
async def update_application(
|
|
request: Request,
|
|
app_id: int,
|
|
name: str = Form(...),
|
|
default_port: int = Form(...),
|
|
protocol: str = Form("tcp"),
|
|
description: str = Form(None),
|
|
icon: str = Form(None),
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_super_admin_web)
|
|
):
|
|
"""Update application template."""
|
|
application = db.query(ApplicationTemplate).filter(ApplicationTemplate.id == app_id).first()
|
|
if not application:
|
|
flash(request, "Anwendung nicht gefunden", "danger")
|
|
return RedirectResponse(url="/applications", status_code=303)
|
|
|
|
application.name = name
|
|
application.default_port = default_port
|
|
application.protocol = Protocol(protocol)
|
|
application.description = description or None
|
|
application.icon = icon or None
|
|
|
|
db.commit()
|
|
|
|
flash(request, "Anwendung aktualisiert", "success")
|
|
return RedirectResponse(url="/applications", status_code=303)
|
|
|
|
|
|
@router.post("/applications/{app_id}/delete")
|
|
async def delete_application(
|
|
request: Request,
|
|
app_id: int,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(require_super_admin_web)
|
|
):
|
|
"""Delete application template."""
|
|
application = db.query(ApplicationTemplate).filter(ApplicationTemplate.id == app_id).first()
|
|
if not application:
|
|
flash(request, "Anwendung nicht gefunden", "danger")
|
|
return RedirectResponse(url="/applications", status_code=303)
|
|
|
|
db.delete(application)
|
|
db.commit()
|
|
|
|
flash(request, f"Anwendung '{application.name}' gelöscht", "warning")
|
|
return RedirectResponse(url="/applications", status_code=303)
|