diff --git a/app/database.py b/app/database.py index 93e4b12..cc382cd 100644 --- a/app/database.py +++ b/app/database.py @@ -25,6 +25,34 @@ def create_db_and_tables(): from app.models.settings import AppSettingsTable SQLModel.metadata.create_all(engine) + + # Add new columns to existing tables if they don't exist (SQLite workaround) + _ensure_columns(engine) + + +def _ensure_columns(engine): + """Add new columns to app_settings table if they don't exist""" + from sqlalchemy import inspect, text + + inspector = inspect(engine) + if 'app_settings' not in inspector.get_table_names(): + return + + existing = {col['name'] for col in inspector.get_columns('app_settings')} + + new_columns = { + 'recommendations_filter': 'TEXT DEFAULT "all"', + 'releases_filter': 'TEXT DEFAULT "all"', + 'anime_enabled': 'BOOLEAN DEFAULT 1', + 'series_enabled': 'BOOLEAN DEFAULT 1', + 'download_dir': 'TEXT DEFAULT "downloads"', + } + + with engine.connect() as conn: + for col_name, col_def in new_columns.items(): + if col_name not in existing: + conn.execute(text(f'ALTER TABLE app_settings ADD COLUMN {col_name} {col_def}')) + conn.commit() def get_session() -> Generator[Session, None, None]: diff --git a/app/models/settings.py b/app/models/settings.py index d43af5a..c705c92 100644 --- a/app/models/settings.py +++ b/app/models/settings.py @@ -14,6 +14,19 @@ class AppSettingsBase(SQLModel): # 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") @property def disabled_providers(self) -> List[str]: @@ -46,6 +59,11 @@ class AppSettings(BaseModel): 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" class Config: from_attributes = True @@ -56,3 +74,8 @@ class AppSettingsUpdate(BaseModel): 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 diff --git a/app/routers/router_settings.py b/app/routers/router_settings.py index 0ccf60f..c4238b0 100644 --- a/app/routers/router_settings.py +++ b/app/routers/router_settings.py @@ -39,6 +39,11 @@ async def get_settings( default_lang=settings_obj.default_lang, theme=settings_obj.theme, disabled_providers=settings_obj.disabled_providers, + recommendations_filter=getattr(settings_obj, 'recommendations_filter', 'all'), + releases_filter=getattr(settings_obj, 'releases_filter', 'all'), + anime_enabled=getattr(settings_obj, 'anime_enabled', True), + series_enabled=getattr(settings_obj, 'series_enabled', True), + download_dir=getattr(settings_obj, 'download_dir', 'downloads'), ) @@ -65,6 +70,22 @@ async def update_settings( settings_obj.theme = update_data.theme if update_data.disabled_providers is not None: settings_obj.disabled_providers = update_data.disabled_providers + if update_data.recommendations_filter is not None: + settings_obj.recommendations_filter = update_data.recommendations_filter + if update_data.releases_filter is not None: + settings_obj.releases_filter = update_data.releases_filter + if update_data.anime_enabled is not None: + # Prevent disabling both categories + if not update_data.anime_enabled and not getattr(settings_obj, 'series_enabled', True): + raise HTTPException(status_code=400, detail="Au moins une categorie doit rester active") + settings_obj.anime_enabled = update_data.anime_enabled + if update_data.series_enabled is not None: + # Prevent disabling both categories + if not update_data.series_enabled and not getattr(settings_obj, 'anime_enabled', True): + raise HTTPException(status_code=400, detail="Au moins une categorie doit rester active") + settings_obj.series_enabled = update_data.series_enabled + if update_data.download_dir is not None: + settings_obj.download_dir = update_data.download_dir session.add(settings_obj) session.commit() diff --git a/templates/components/settings_section.html b/templates/components/settings_section.html index 35a4d74..a63606f 100644 --- a/templates/components/settings_section.html +++ b/templates/components/settings_section.html @@ -1,23 +1,23 @@
-

⚙️ Paramètres

+

Parametres

-

Général

+

General

-
+
- +
- +
-
+ +
+

Filtres de contenu

+ +
+ + +
+ +
+ + +
+
+ + +
+

Categories

+

Activez ou desactivez les categories. Au moins une doit rester active.

+ +
+ + + +
+
+
-

Disponibilité des Fournisseurs

+

Disponibilite des Fournisseurs

@@ -61,7 +119,7 @@ hx-swap="none" hx-on::after-request="htmx.trigger('#tab-settings > div', 'refresh-settings')" style="min-width: 100px;"> - {% if provider.enabled %}Désactiver{% else %}Activer{% endif %} + {% if provider.enabled %}Desactiver{% else %}Activer{% endif %}
{% endfor %} @@ -69,6 +127,93 @@
+ +