first commit
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
"""Routes du dashboard admin — authentification requise."""
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
from fastapi import APIRouter, Request, Form
|
||||
from fastapi.responses import HTMLResponse, RedirectResponse
|
||||
from fastapi.templating import Jinja2Templates
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
_templates = Jinja2Templates(
|
||||
directory=Path(__file__).parent.parent.parent / "frontend" / "templates"
|
||||
)
|
||||
|
||||
|
||||
def _is_auth(request: Request) -> bool:
|
||||
return request.session.get("authenticated") is True
|
||||
|
||||
|
||||
def _require_auth(request: Request):
|
||||
if not _is_auth(request):
|
||||
return RedirectResponse(url="/admin/login", status_code=302)
|
||||
return None
|
||||
|
||||
|
||||
# ── Auth ──────────────────────────────────────────────────────────────────────
|
||||
|
||||
@router.get("/admin/login", response_class=HTMLResponse)
|
||||
async def login_page(request: Request):
|
||||
if _is_auth(request):
|
||||
return RedirectResponse(url="/admin", status_code=302)
|
||||
return _templates.TemplateResponse("admin/login.html", {"request": request, "error": None})
|
||||
|
||||
|
||||
@router.post("/admin/login")
|
||||
async def login(request: Request, password: str = Form(...)):
|
||||
cfg = request.app.state.config
|
||||
if password == cfg.app.admin_password:
|
||||
request.session["authenticated"] = True
|
||||
return RedirectResponse(url="/admin", status_code=302)
|
||||
return _templates.TemplateResponse(
|
||||
"admin/login.html",
|
||||
{"request": request, "error": "Mot de passe incorrect"},
|
||||
)
|
||||
|
||||
|
||||
@router.get("/admin/logout")
|
||||
async def logout(request: Request):
|
||||
request.session.clear()
|
||||
return RedirectResponse(url="/admin/login", status_code=302)
|
||||
|
||||
|
||||
# ── Pages admin ───────────────────────────────────────────────────────────────
|
||||
|
||||
@router.get("/admin", response_class=HTMLResponse)
|
||||
async def admin_dashboard(request: Request):
|
||||
redirect = _require_auth(request)
|
||||
if redirect:
|
||||
return redirect
|
||||
|
||||
sys_svc = request.app.state.system_service
|
||||
cfg = request.app.state.config
|
||||
led = request.app.state.led_service
|
||||
btn = request.app.state.button_service
|
||||
|
||||
stats = sys_svc.get_stats()
|
||||
services = sys_svc.get_services_status()
|
||||
|
||||
return _templates.TemplateResponse("admin/dashboard.html", {
|
||||
"request": request,
|
||||
"config": cfg,
|
||||
"stats": stats,
|
||||
"services": services,
|
||||
"led_effect": led.current_effect,
|
||||
"relay_state": btn.relay_state if btn else True,
|
||||
"print_mode": cfg.print.mode,
|
||||
})
|
||||
|
||||
|
||||
@router.get("/admin/gallery", response_class=HTMLResponse)
|
||||
async def admin_gallery(request: Request):
|
||||
redirect = _require_auth(request)
|
||||
if redirect:
|
||||
return redirect
|
||||
cfg = request.app.state.config
|
||||
return _templates.TemplateResponse("admin/gallery.html", {
|
||||
"request": request,
|
||||
"config": cfg,
|
||||
})
|
||||
|
||||
|
||||
@router.get("/admin/actions", response_class=HTMLResponse)
|
||||
async def admin_actions(request: Request):
|
||||
redirect = _require_auth(request)
|
||||
if redirect:
|
||||
return redirect
|
||||
|
||||
pb = request.app.state.photobooth_service
|
||||
cfg = request.app.state.config
|
||||
pb_config = await pb.read_pb_config()
|
||||
actions = pb_config.get("actions", {}).get("image", [])
|
||||
|
||||
return _templates.TemplateResponse("admin/actions.html", {
|
||||
"request": request,
|
||||
"config": cfg,
|
||||
"pb_actions": actions,
|
||||
"button_mapping": cfg.button_actions,
|
||||
})
|
||||
|
||||
|
||||
@router.get("/admin/print", response_class=HTMLResponse)
|
||||
async def admin_print(request: Request):
|
||||
redirect = _require_auth(request)
|
||||
if redirect:
|
||||
return redirect
|
||||
|
||||
printer_svc = request.app.state.printer_service
|
||||
cfg = request.app.state.config
|
||||
|
||||
queue = await printer_svc.get_queue()
|
||||
printers = await printer_svc.get_printers_status()
|
||||
|
||||
return _templates.TemplateResponse("admin/print.html", {
|
||||
"request": request,
|
||||
"config": cfg,
|
||||
"queue": queue,
|
||||
"printers": printers,
|
||||
})
|
||||
Reference in New Issue
Block a user