from datetime import date, timedelta from djagitit.tableau import refresh_extracts from loguru import logger from ..config import ( QUERY_PATHS, TABLEAU_DATASOURCE_IDS_TTLO, TABLEAU_SITE, ) from ..db import get_rdb, get_rdbs from ..db.queries import QueryLoader def _get_dates(rdb, ql: QueryLoader) -> tuple[date, date]: data = rdb.query(ql.load(QUERY_PATHS.date_ttlo)) return data["base"][0], data["max_s"][0] def _get_date_list(base: date, max_s: date) -> list[date]: delta = max_s - base return [base + timedelta(days=x) for x in range(1, delta.days + 1)] def run_update() -> str | None: """Fill chart + playlist tables day-by-day, rebuild hypers, refresh Tableau.""" logger.info("Starting TTLO update") rdb = get_rdb() rdbs = get_rdbs() ql = QueryLoader() base, max_s = _get_dates(rdb, ql) date_list = _get_date_list(base, max_s) if not date_list: logger.info("TTLO: no new data") return None logger.info(f"TTLO: updating {len(date_list)} day(s)") for d in date_list: logger.info(f"TTLO: filling {d}") rdbs.execute(ql.load(QUERY_PATHS.fill_ttlo_chart, date=str(d))) rdbs.execute(ql.load(QUERY_PATHS.fill_ttlo_playlist, date=str(d))) rdbs.commit() logger.info("TTLO: creating hyper tables") rdbs.execute(ql.load(QUERY_PATHS.make_ttlo_chart_hyper)) rdbs.execute(ql.load(QUERY_PATHS.make_ttlo_playlist_hyper)) rdbs.commit() logger.info("TTLO: triggering Tableau extract refresh") refresh_extracts(TABLEAU_DATASOURCE_IDS_TTLO, site=TABLEAU_SITE) logger.success(f"TTLO updated to {date_list[-1]}") return date_list[-1].strftime("%Y-%m-%d")