from datetime import date, timedelta from djagitit.tableau import refresh_extracts from loguru import logger from ..config import ( COUNTRY_CODES, 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, date]: data = rdb.query(ql.load(QUERY_PATHS.date)) return data["base"][0], data["latest_available"][0] def _get_week_list(base: date, latest: date) -> list[date]: return [ base + timedelta(days=7 * i) for i in range(1, ((latest - base).days // 7) + 1) ] def run_update() -> str | None: """Fill main table week-by-week per country, rebuild hyper, refresh Tableau.""" logger.info("Starting contribution update") rdb = get_rdb() rdbs = get_rdbs() ql = QueryLoader() base, latest = _get_dates(rdb, ql) logger.info(f"Base: {base}, latest available: {latest}") week_list = _get_week_list(base, latest) if not week_list: logger.info("No new data") return None logger.info(f"Updating {len(week_list)} week(s)") for w in week_list: logger.info(f"Processing {w}") for cc in COUNTRY_CODES: logger.debug(f" {cc}") try: rdbs.execute(ql.load( QUERY_PATHS.fill_main, wsds=str(w), country_code=cc, )) rdbs.commit() except Exception as e: logger.error(f"Failed for {cc} on {w}: {e}") logger.info("Creating hyper table") rdbs.execute(ql.load(QUERY_PATHS.make_hyper)) rdbs.commit() logger.info("Triggering Tableau extract refresh") refresh_extracts(TABLEAU_DATASOURCE_IDS, site=TABLEAU_SITE) logger.success(f"Contribution updated to {week_list[-1]}") return week_list[-1].strftime("%Y-%m-%d")