44 lines
1.6 KiB
Python
44 lines
1.6 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, "Settings")}, 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})
|