from datetime import date, timedelta from djagitit.tableau import refresh_extracts from loguru import logger from ..config import QUERY_PATHS, TABLEAU_DATASOURCE_IDS, TABLEAU_SITE from ..db import get_rdb, get_rdbs from ..db.queries import QueryLoader def _get_dates(rdb, ql: QueryLoader) -> tuple[date | None, date | None]: data = rdb.query(ql.load(QUERY_PATHS.date)) base = data["base"][0] max_s = data["max_s"][0] if base is None or max_s is None: return base, max_s start_date = base + timedelta(days=1) return start_date, max_s def run_update() -> str | None: logger.info("Starting summer 2025 update") rdb = get_rdb() rdbs = get_rdbs() ql = QueryLoader() start_date, end_date = _get_dates(rdb, ql) if start_date is None or end_date is None: logger.warning("Could not determine date range (empty table or no source data)") return None if start_date > end_date: logger.info("No new data") return None date_list = [ start_date + timedelta(days=x) for x in range((end_date - start_date).days + 1) ] logger.info(f"Updating {len(date_list)} day(s): {date_list[0]} to {date_list[-1]}") for d in date_list: ds = str(d) logger.info(f"Processing {d}") status = rdbs.execute(ql.load(QUERY_PATHS.fill_main, date=ds)) rdbs.commit() if not status: logger.error(f"Failed to fill main for {d}") return None logger.info("Rebuilding hyper table") status = rdbs.execute(ql.load(QUERY_PATHS.make_hyper)) rdbs.commit() if not status: logger.error("Failed to rebuild hyper table") return None refresh_extracts(TABLEAU_DATASOURCE_IDS, site=TABLEAU_SITE) logger.success(f"Summer 2025 updated to {date_list[-1]}") return date_list[-1].strftime("%Y-%m-%d")