From 9a1893c54695a098e19aeb65a6e94f560b8c3410 Mon Sep 17 00:00:00 2001 From: Padreug Date: Sat, 25 Apr 2026 19:08:13 +0200 Subject: [PATCH] Fix startup: load Fava settings from DB instead of hardcoded defaults castle_start() was using CastleSettings() defaults (slug=castle-ledger) instead of reading the saved settings from the database. This caused all Fava queries to 404 on instances where the ledger slug differs from the default (e.g. demo-ledger). Now loads settings from extension_settings table at startup, falling back to defaults only if no saved settings exist. Co-Authored-By: Claude Opus 4.6 (1M context) --- __init__.py | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/__init__.py b/__init__.py index 6209e9d..438d0f1 100644 --- a/__init__.py +++ b/__init__.py @@ -38,16 +38,35 @@ def castle_start(): from .models import CastleSettings from .tasks import wait_for_account_sync - # Initialize Fava client with default settings - # (Will be re-initialized if admin updates settings) - defaults = CastleSettings() - try: + async def _init_fava(): + """Load saved settings from DB, fall back to defaults.""" + from .crud import db as castle_db + + settings = None + try: + row = await castle_db.fetchone( + "SELECT * FROM extension_settings LIMIT 1", + model=CastleSettings, + ) + if row: + settings = row + logger.info(f"Loaded Castle settings from DB: {settings.fava_url}/{settings.fava_ledger_slug}") + except Exception as e: + logger.warning(f"Could not load settings from DB: {e}") + + if not settings: + settings = CastleSettings() + logger.info(f"Using default Castle settings: {settings.fava_url}/{settings.fava_ledger_slug}") + init_fava_client( - fava_url=defaults.fava_url, - ledger_slug=defaults.fava_ledger_slug, - timeout=defaults.fava_timeout + fava_url=settings.fava_url, + ledger_slug=settings.fava_ledger_slug, + timeout=settings.fava_timeout ) - logger.info(f"Fava client initialized: {defaults.fava_url}/{defaults.fava_ledger_slug}") + logger.info(f"Fava client initialized: {settings.fava_url}/{settings.fava_ledger_slug}") + + try: + asyncio.get_event_loop().create_task(_init_fava()) except Exception as e: logger.error(f"Failed to initialize Fava client: {e}") logger.warning("Castle will not function without Fava. Please configure Fava settings.")