Backend: - Add type validation and coercion for settings API - Implement SettingStorage and SettingType in registry - Improve CRUD operations for settings Frontend: - Refactor Theme, Language, Sidebar, ViewMode contexts - Simplify admin components (GeneralTab, SettingsTab, UsersTab) - Add new settings endpoints to API client - Improve App initialization flow Infrastructure: - Update Dockerfile and docker-compose.yml - Add .dockerignore - Update Makefile and README 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
"""CRUD operations for Settings."""
|
|
|
|
import json
|
|
from typing import Optional
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.settings import Settings
|
|
|
|
|
|
def get_setting(db: Session, key: str) -> Optional[Settings]:
|
|
"""Get a setting by key."""
|
|
return db.query(Settings).filter(Settings.key == key).first()
|
|
|
|
|
|
def get_setting_value(db: Session, key: str, default: any = None) -> any:
|
|
"""Get a setting value by key, with optional default."""
|
|
setting = get_setting(db, key)
|
|
if setting:
|
|
return setting.get_value()
|
|
return default
|
|
|
|
|
|
def update_setting(db: Session, key: str, value: any) -> Settings:
|
|
"""Update or create a setting."""
|
|
setting = get_setting(db, key)
|
|
|
|
if setting is None:
|
|
setting = Settings(key=key)
|
|
db.add(setting)
|
|
|
|
# Determine how to store the value (DB has only bool + string columns)
|
|
if isinstance(value, bool):
|
|
setting.value_bool = value
|
|
setting.value_str = None
|
|
elif isinstance(value, str) and value.lower() in ("true", "false", "1", "0"):
|
|
setting.value_bool = value.lower() in ("true", "1")
|
|
setting.value_str = None
|
|
elif isinstance(value, (dict, list)):
|
|
setting.value_str = json.dumps(value)
|
|
setting.value_bool = None
|
|
else:
|
|
setting.value_str = str(value)
|
|
setting.value_bool = None
|
|
|
|
db.commit()
|
|
db.refresh(setting)
|
|
return setting
|
|
|
|
|
|
def get_all_settings(db: Session) -> list[Settings]:
|
|
"""Get all settings."""
|
|
return db.query(Settings).all()
|