Files
ad/molodetz/routers/admin/settings.py
T

44 lines
1.7 KiB
Python

# retoor <retoor@molodetz.nl>
from fastapi import APIRouter, Request
from molodetz.database import all_settings, get_setting, set_setting
from molodetz.dependencies import json_or_form
from molodetz.models import SettingsForm
from molodetz.responses import action_result, respond
from molodetz.routers.admin._shared import admin_seo
from molodetz.schemas.admin import SettingsOut
from molodetz.utils.audit import record
from molodetz.utils.auth import require_admin
router = APIRouter()
NUMERIC = ("rate_limit_per_minute", "rate_limit_window_seconds", "session_max_age_days", "session_remember_days", "audit_retention_days")
BOOLEAN = ("maintenance_mode", "friendly_404")
@router.get("/settings")
async def settings_index(request: Request):
require_admin(request)
return respond(request, "admin/settings.html", {"settings": all_settings(), "seo": admin_seo(request, "Instellingen")}, model=SettingsOut)
@router.post("/settings")
async def settings_save(request: Request):
user = require_admin(request)
data = await json_or_form(request, SettingsForm)
changed = []
for key, value in data.model_dump(exclude_none=True).items():
if value == "":
continue
if key in NUMERIC:
try:
value = str(max(1, int(value)))
except ValueError:
continue
if key in BOOLEAN and value not in ("0", "1"):
continue
if get_setting(key) != value:
set_setting(key, value)
changed.append(key)
record(request, "admin.settings.save", payload={"keys": changed}, user=user)
return action_result(request, "/admin/settings", data={"changed": changed})