87f245d3fc
- Sunset Glitch color palette applied to all templates - Font Awesome icons throughout UI - Download manager with parallel queue and progress tracking - Settings page with dynamic configuration - Recommendations router enhanced with scoring - Local vendor libs (Alpine.js, HTMX) for offline support - Auto test suite with screenshots - Series releases list component - New download model
95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
"""Models for application settings with SQLModel support"""
|
|
import uuid
|
|
import json
|
|
from pydantic import BaseModel, Field as PydanticField
|
|
from typing import Optional, List, Dict
|
|
from datetime import datetime
|
|
from sqlmodel import SQLModel, Field, Column, String
|
|
|
|
|
|
class AppSettingsBase(SQLModel):
|
|
"""Base schema for application settings"""
|
|
default_lang: str = Field(default="vostfr")
|
|
theme: str = Field(default="dark")
|
|
|
|
# Store list of disabled providers as a JSON string
|
|
disabled_providers_json: str = Field(default="[]", sa_column=Column(String))
|
|
|
|
# #9: Filter for recommendations section ("all", "anime", "series")
|
|
recommendations_filter: str = Field(default="all", sa_column=Column(String))
|
|
|
|
# #10: Filter for latest releases section ("all", "anime", "series")
|
|
releases_filter: str = Field(default="all", sa_column=Column(String))
|
|
|
|
# #11: Enable/disable categories
|
|
anime_enabled: bool = Field(default=True)
|
|
series_enabled: bool = Field(default=True)
|
|
|
|
# #12: Custom download directory
|
|
download_dir: str = Field(default="downloads")
|
|
|
|
# #13: Content weight mode ("auto" = based on download habits, "manual" = user-defined)
|
|
content_weight_mode: str = Field(default="auto", sa_column=Column(String))
|
|
|
|
# #14: Manual content weights (used when content_weight_mode = "manual")
|
|
content_weight_anime: int = Field(default=2)
|
|
content_weight_series: int = Field(default=1)
|
|
|
|
@property
|
|
def disabled_providers(self) -> List[str]:
|
|
try:
|
|
return json.loads(self.disabled_providers_json or "[]")
|
|
except:
|
|
return []
|
|
|
|
@disabled_providers.setter
|
|
def disabled_providers(self, value: List[str]):
|
|
self.disabled_providers_json = json.dumps(value or [])
|
|
|
|
|
|
class AppSettingsTable(AppSettingsBase, table=True):
|
|
"""Database table for application settings"""
|
|
__tablename__ = "app_settings"
|
|
|
|
id: str = Field(
|
|
default_factory=lambda: str(uuid.uuid4()),
|
|
primary_key=True,
|
|
index=True,
|
|
nullable=False
|
|
)
|
|
user_id: str = Field(foreign_key="users.id", index=True, unique=True)
|
|
updated_at: datetime = Field(default_factory=datetime.now)
|
|
|
|
|
|
class AppSettings(BaseModel):
|
|
"""Application settings (API Response)"""
|
|
default_lang: str = "vostfr"
|
|
theme: str = "dark"
|
|
disabled_providers: List[str] = []
|
|
recommendations_filter: str = "all"
|
|
releases_filter: str = "all"
|
|
anime_enabled: bool = True
|
|
series_enabled: bool = True
|
|
download_dir: str = "downloads"
|
|
content_weight_mode: str = "auto"
|
|
content_weight_anime: int = 2
|
|
content_weight_series: int = 1
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class AppSettingsUpdate(BaseModel):
|
|
"""Model for updating application settings"""
|
|
default_lang: Optional[str] = None
|
|
theme: Optional[str] = None
|
|
disabled_providers: Optional[List[str]] = None
|
|
recommendations_filter: Optional[str] = None
|
|
releases_filter: Optional[str] = None
|
|
anime_enabled: Optional[bool] = None
|
|
series_enabled: Optional[bool] = None
|
|
download_dir: Optional[str] = None
|
|
content_weight_mode: Optional[str] = None
|
|
content_weight_anime: Optional[int] = None
|
|
content_weight_series: Optional[int] = None
|