diff --git a/.last-branch b/.last-branch index 9bf017c..f35a538 100644 --- a/.last-branch +++ b/.last-branch @@ -1 +1 @@ -v20260204-02-performance-optimizations +v20260204-03-dashboard-redirect-setting diff --git a/containers/backupchecks/src/backend/app/__init__.py b/containers/backupchecks/src/backend/app/__init__.py index 2b54a76..43857f0 100644 --- a/containers/backupchecks/src/backend/app/__init__.py +++ b/containers/backupchecks/src/backend/app/__init__.py @@ -69,6 +69,9 @@ def create_app(): This ensures that when a user opens the site for the first time each day, they land on the dashboard regardless of the bookmarked/deeplinked URL. + + This behavior is controlled by the system setting `require_daily_dashboard_visit`. + When disabled (the default), users can navigate directly to any page. """ # Only for normal page loads. @@ -99,6 +102,18 @@ def create_app(): session["daily_dashboard_seen"] = _get_today_ui_date() return None + # Check if the feature is enabled in system settings. + try: + from .models import SystemSettings + + settings = SystemSettings.query.first() + if not settings or not getattr(settings, "require_daily_dashboard_visit", False): + # Feature is disabled; skip redirect. + return None + except Exception: + # On any error (e.g. column doesn't exist yet), skip redirect. + return None + today = _get_today_ui_date() seen = (session.get("daily_dashboard_seen") or "").strip() if seen != today: diff --git a/containers/backupchecks/src/backend/app/main/routes_settings.py b/containers/backupchecks/src/backend/app/main/routes_settings.py index 96dba4d..189fa7d 100644 --- a/containers/backupchecks/src/backend/app/main/routes_settings.py +++ b/containers/backupchecks/src/backend/app/main/routes_settings.py @@ -434,6 +434,10 @@ def settings(): if "ui_timezone" in request.form: settings.ui_timezone = (request.form.get("ui_timezone") or "").strip() or "Europe/Amsterdam" + # Navigation setting is in the same form (General tab), so process it here. + # Checkbox: present in form = checked, absent = unchecked. + settings.require_daily_dashboard_visit = bool(request.form.get("require_daily_dashboard_visit")) + # Autotask integration if "autotask_enabled" in request.form: settings.autotask_enabled = bool(request.form.get("autotask_enabled")) diff --git a/containers/backupchecks/src/backend/app/migrations.py b/containers/backupchecks/src/backend/app/migrations.py index de5c0d9..f11213d 100644 --- a/containers/backupchecks/src/backend/app/migrations.py +++ b/containers/backupchecks/src/backend/app/migrations.py @@ -931,6 +931,7 @@ def run_migrations() -> None: migrate_reporting_tables() migrate_reporting_report_config() migrate_performance_indexes() + migrate_system_settings_require_daily_dashboard_visit() print("[migrations] All migrations completed.") @@ -1115,6 +1116,38 @@ def migrate_jobs_archiving() -> None: print("[migrations] migrate_jobs_archiving completed.") +def migrate_system_settings_require_daily_dashboard_visit() -> None: + """Add require_daily_dashboard_visit column to system_settings if missing. + + When enabled, authenticated users are redirected to the dashboard on + their first page view each day. + """ + table = "system_settings" + column = "require_daily_dashboard_visit" + + try: + engine = db.get_engine() + except Exception as exc: + print(f"[migrations] Could not get engine for system_settings require_daily_dashboard_visit migration: {exc}") + return + + try: + if _column_exists(table, column): + print("[migrations] system_settings.require_daily_dashboard_visit already exists.") + return + + with engine.begin() as conn: + conn.execute( + text( + f'ALTER TABLE "{table}" ADD COLUMN {column} BOOLEAN NOT NULL DEFAULT FALSE' + ) + ) + + print("[migrations] migrate_system_settings_require_daily_dashboard_visit completed.") + except Exception as exc: + print(f"[migrations] Failed to migrate system_settings.require_daily_dashboard_visit: {exc}") + + def migrate_performance_indexes() -> None: """Add performance indexes for frequently queried foreign key columns. diff --git a/containers/backupchecks/src/backend/app/models.py b/containers/backupchecks/src/backend/app/models.py index 326863e..79aa0b1 100644 --- a/containers/backupchecks/src/backend/app/models.py +++ b/containers/backupchecks/src/backend/app/models.py @@ -107,6 +107,10 @@ class SystemSettings(db.Model): # UI display timezone (IANA name). Used for rendering times in the web interface. ui_timezone = db.Column(db.String(64), nullable=False, default="Europe/Amsterdam") + # Navigation behavior: require visiting dashboard first each day. + # When enabled, authenticated users are redirected to the dashboard on + # their first page view each day before they can navigate elsewhere. + require_daily_dashboard_visit = db.Column(db.Boolean, nullable=False, default=False) # Autotask integration settings autotask_enabled = db.Column(db.Boolean, nullable=False, default=False) @@ -129,6 +133,7 @@ class SystemSettings(db.Model): autotask_cached_priorities_json = db.Column(db.Text, nullable=True) autotask_cached_ticket_statuses_json = db.Column(db.Text, nullable=True) autotask_reference_last_sync_at = db.Column(db.DateTime, nullable=True) + created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) updated_at = db.Column( db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False diff --git a/containers/backupchecks/src/templates/main/settings.html b/containers/backupchecks/src/templates/main/settings.html index 3b848e0..67c6b1e 100644 --- a/containers/backupchecks/src/templates/main/settings.html +++ b/containers/backupchecks/src/templates/main/settings.html @@ -139,6 +139,17 @@ +
+
Navigation
+
+
+ + +
+
When enabled, users are redirected to the dashboard on their first page view each day, regardless of which page they try to access.
+
+
+
diff --git a/docs/changelog-claude.md b/docs/changelog-claude.md index b0c8248..1c12ed3 100644 --- a/docs/changelog-claude.md +++ b/docs/changelog-claude.md @@ -6,6 +6,11 @@ This file documents all changes made to this project via Claude Code. ### Added - `docs/changelog-claude.md` - Changelog file for tracking changes made via Claude Code +- Setting to enable/disable daily dashboard redirect requirement (Settings > General > Navigation) + - New `require_daily_dashboard_visit` column in `SystemSettings` model + - Migration in `migrations.py` to add the column + - Toggle in Settings General page under new "Navigation" card + - Default value is OFF (disabled) - users can navigate directly to any page ### Changed - Converted changelog to English (all project documentation must be in English)