84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
"""Domains: top-level organizational buckets."""
|
|
|
|
from fastapi import APIRouter, Request, Form, Depends
|
|
from fastapi.templating import Jinja2Templates
|
|
from fastapi.responses import RedirectResponse
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from typing import Optional
|
|
|
|
from core.database import get_db
|
|
from core.base_repository import BaseRepository
|
|
from core.sidebar import get_sidebar_data
|
|
|
|
router = APIRouter(prefix="/domains", tags=["domains"])
|
|
templates = Jinja2Templates(directory="templates")
|
|
|
|
|
|
@router.get("/")
|
|
async def list_domains(request: Request, db: AsyncSession = Depends(get_db)):
|
|
repo = BaseRepository("domains", db)
|
|
sidebar = await get_sidebar_data(db)
|
|
items = await repo.list(sort="sort_order")
|
|
return templates.TemplateResponse("domains.html", {
|
|
"request": request, "sidebar": sidebar, "items": items,
|
|
"page_title": "Domains", "active_nav": "domains",
|
|
})
|
|
|
|
|
|
@router.get("/create")
|
|
async def create_form(request: Request, db: AsyncSession = Depends(get_db)):
|
|
sidebar = await get_sidebar_data(db)
|
|
return templates.TemplateResponse("domain_form.html", {
|
|
"request": request, "sidebar": sidebar,
|
|
"page_title": "New Domain", "active_nav": "domains",
|
|
"item": None,
|
|
})
|
|
|
|
|
|
@router.post("/create")
|
|
async def create_domain(
|
|
request: Request,
|
|
name: str = Form(...),
|
|
color: Optional[str] = Form(None),
|
|
description: Optional[str] = Form(None),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
repo = BaseRepository("domains", db)
|
|
domain = await repo.create({"name": name, "color": color, "description": description})
|
|
return RedirectResponse(url="/domains", status_code=303)
|
|
|
|
|
|
@router.get("/{domain_id}/edit")
|
|
async def edit_form(domain_id: str, request: Request, db: AsyncSession = Depends(get_db)):
|
|
repo = BaseRepository("domains", db)
|
|
sidebar = await get_sidebar_data(db)
|
|
item = await repo.get(domain_id)
|
|
if not item:
|
|
return RedirectResponse(url="/domains", status_code=303)
|
|
return templates.TemplateResponse("domain_form.html", {
|
|
"request": request, "sidebar": sidebar,
|
|
"page_title": f"Edit {item['name']}", "active_nav": "domains",
|
|
"item": item,
|
|
})
|
|
|
|
|
|
@router.post("/{domain_id}/edit")
|
|
async def update_domain(
|
|
domain_id: str,
|
|
request: Request,
|
|
name: str = Form(...),
|
|
color: Optional[str] = Form(None),
|
|
description: Optional[str] = Form(None),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
repo = BaseRepository("domains", db)
|
|
await repo.update(domain_id, {"name": name, "color": color, "description": description})
|
|
return RedirectResponse(url="/domains", status_code=303)
|
|
|
|
|
|
@router.post("/{domain_id}/delete")
|
|
async def delete_domain(domain_id: str, db: AsyncSession = Depends(get_db)):
|
|
repo = BaseRepository("domains", db)
|
|
await repo.soft_delete(domain_id)
|
|
return RedirectResponse(url="/domains", status_code=303)
|