feat: add AdminSettingsForm model and migrate admin settings endpoint to Pydantic validation

This commit is contained in:
2026-05-23 03:55:50 +00:00
parent 92911bedc9
commit 7285432ea7
3 changed files with 21 additions and 8 deletions
+15 -1
View File
@@ -1,4 +1,4 @@
from typing import Optional, Literal
from typing import Literal
from pydantic import BaseModel, Field, field_validator, model_validator
from devplacepy.constants import TOPICS
@@ -159,3 +159,17 @@ class AdminRoleForm(BaseModel):
class AdminPasswordForm(BaseModel):
password: str = Field(min_length=6, max_length=128)
class AdminSettingsForm(BaseModel):
site_name: str = Field(default="", max_length=200)
site_description: str = Field(default="", max_length=500)
site_tagline: str = Field(default="", max_length=500)
news_grade_threshold: str = Field(default="", max_length=10)
news_api_url: str = Field(default="", max_length=500)
news_ai_url: str = Field(default="", max_length=500)
news_ai_model: str = Field(default="", max_length=200)
news_ai_key: str = Field(default="", max_length=500)
max_upload_size_mb: str = Field(default="", max_length=10)
allowed_file_types: str = Field(default="", max_length=1000)
max_attachments_per_resource: str = Field(default="", max_length=10)
+3 -4
View File
@@ -2,7 +2,7 @@ import logging
from typing import Annotated
from datetime import datetime
from fastapi import APIRouter, Request, Form
from devplacepy.models import AdminRoleForm, AdminPasswordForm
from devplacepy.models import AdminRoleForm, AdminPasswordForm, AdminSettingsForm
from fastapi.responses import HTMLResponse, RedirectResponse
from devplacepy.database import get_table, db, build_pagination
from devplacepy.templating import templates
@@ -210,11 +210,10 @@ async def admin_news_delete(request: Request, uid: str):
@router.post("/settings")
async def admin_settings_save(request: Request):
async def admin_settings_save(request: Request, data: Annotated[AdminSettingsForm, Form()]):
admin = require_admin(request)
form = await request.form()
settings = get_table("site_settings")
for key, value in form.multi_items():
for key, value in data.model_dump().items():
existing = settings.find_one(key=key)
if existing:
settings.update({"id": existing["id"], "key": key, "value": value}, ["id"])