3dc5dd8fe9
- Fix register/login: dict-style access on UserTable ORM objects - Fix HTMX auth: inject JWT token in all HTMX request headers - Fix FS7 search: use DLE AJAX endpoint /engine/ajax/search.php - Fix ZT search: use ?p=series&search=QUERY (not DLE format) - Fix provider health: load hardcoded providers + domain manager - Add self.id to all anime/series providers - Redesign homepage: Netflix-style horizontal scroll cards (.hc) - Redesign search results: grouped by title, poster + synopsis + 3 buttons - Add Télécharger dropdown: season download + episode picker - Fix navbar CSS: restore .tabs flex layout, remove orphan rules - Fix HTMX spinner: remove inline display:none, use CSS indicator - Add AGENTS.md files across project for developer documentation
2.1 KiB
2.1 KiB
Models (app/models/)
OVERVIEW
SQLModel/Pydantic models combining database tables (SQLModel) and API schemas (Pydantic). Each domain has a Base → Table → Schema pattern.
STRUCTURE
models/
├── __init__.py # Core: DownloadStatus, DownloadTask, DownloadRequest, AnimeMetadata, AnimeSearchResult
├── auth.py # User, UserCreate, UserLogin, Token, UserTable, UserInDB
├── watchlist.py # WatchlistItem, WatchlistSettings, AutoDownloadResult (+ Table variants)
├── sonarr.py # SonarrWebhookPayload, SonarrMapping, SonarrConfig, SonarrSeries (+ Table variants)
├── favorites.py # Favorites-related models
└── settings.py # AppSettings, AppSettingsUpdate (+ Table variant)
WHERE TO LOOK
| Need | File | Key Classes |
|---|---|---|
| Download task | __init__.py |
DownloadTask, DownloadStatus, DownloadRequest |
| Anime metadata | __init__.py |
AnimeMetadata, AnimeSearchResult |
| User/auth | auth.py |
User, UserCreate, UserLogin, Token, UserTable |
| Watchlist | watchlist.py |
WatchlistItem, WatchlistSettings, WatchlistItemTable |
| Sonarr | sonarr.py |
SonarrWebhookPayload, SonarrMapping, SonarrConfig, SonarrSeries |
| App settings | settings.py |
AppSettings, AppSettingsUpdate |
CONVENTIONS
Triple-class pattern (for DB-backed models):
*Base— Pydantic base with shared fields*Table— SQLModel table class (__tablename__,id, FK columns)- Final class — API schema (inherits from both, adds Config)
Enums: PascalCase class, UPPER_SNAKE values (e.g., DownloadStatus.PENDING, WatchlistStatus.ACTIVE).
JSON columns: Stored as JSON strings in SQLite, accessed via @property methods (e.g., WatchlistItemTable.genres parses genres_json).
Config classes: Each API schema has class Config: from_attributes = True for ORM mode.
ANTI-PATTERNS
- Do NOT add new fields to
*Basewithout updating corresponding*Tableand schema classes - Do NOT use
Optionalfor required API fields — use Pydantic defaults - Empty
except:insettings.py:22— known tech debt