From fc4121183ce21d77233d8493835cb6f78cad33a0 Mon Sep 17 00:00:00 2001 From: Deeman Date: Sun, 22 Feb 2026 13:04:32 +0100 Subject: [PATCH] fix: replace stale analytics._conn checks with _db_path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dashboard/routes.py (4 places) and admin/routes.py still checked analytics._conn is not None after _conn was removed in the two-file refactor — causing AttributeError → 500 on every dashboard page. Co-Authored-By: Claude Sonnet 4.6 --- web/src/beanflows/admin/routes.py | 5 ++--- web/src/beanflows/dashboard/routes.py | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/web/src/beanflows/admin/routes.py b/web/src/beanflows/admin/routes.py index 4100993..ce559cf 100644 --- a/web/src/beanflows/admin/routes.py +++ b/web/src/beanflows/admin/routes.py @@ -53,10 +53,9 @@ async def get_dashboard_stats() -> dict: # Analytics stats (DuckDB) analytics = {"commodity_count": 0, "min_year": None, "max_year": None} try: - from ..analytics import _conn as duckdb_conn - from ..analytics import fetch_analytics + from ..analytics import _db_path, fetch_analytics - if duckdb_conn is not None: + if _db_path: rows = await fetch_analytics( """ SELECT COUNT(DISTINCT commodity_code) as commodity_count, diff --git a/web/src/beanflows/dashboard/routes.py b/web/src/beanflows/dashboard/routes.py index 479cca5..9ca9cd6 100644 --- a/web/src/beanflows/dashboard/routes.py +++ b/web/src/beanflows/dashboard/routes.py @@ -121,7 +121,7 @@ async def index(): user = g.user plan = (g.get("subscription") or {}).get("plan", "free") - if analytics._conn is not None: + if analytics._db_path: results = await asyncio.gather( analytics.get_price_latest(analytics.COFFEE_TICKER), analytics.get_cot_positioning_latest(analytics.COFFEE_CFTC_CODE), @@ -193,7 +193,7 @@ async def supply(): current_year = datetime.date.today().year start_year = current_year - rng["years"] - if analytics._conn is not None: + if analytics._db_path: results = await asyncio.gather( analytics.get_global_time_series( analytics.COFFEE_COMMODITY_CODE, @@ -246,7 +246,7 @@ async def positioning(): price_limit = rng["days"] cot_weeks = rng["weeks"] - if analytics._conn is not None: + if analytics._db_path: results = await asyncio.gather( analytics.get_price_latest(analytics.COFFEE_TICKER), analytics.get_price_time_series(analytics.COFFEE_TICKER, limit=price_limit), @@ -292,7 +292,7 @@ async def warehouse(): stocks_latest = stocks_trend = aging_latest = byport_latest = byport_trend = None stocks_trend = aging_latest = byport_trend = [] - if analytics._conn is not None: + if analytics._db_path: if view == "stocks": results = await asyncio.gather( analytics.get_ice_stocks_latest(),