|
| 1 | +from time import sleep |
| 2 | +from datetime import timedelta, datetime |
| 3 | +from submodules.model import daemon |
| 4 | +from submodules.model.enums import AdminQueries |
| 5 | +from submodules.model.global_objects import sums_table as sums_table_db_go |
| 6 | +from submodules.model.business_objects import general |
| 7 | +import traceback |
| 8 | + |
| 9 | + |
| 10 | +NEXT_EXEC = {} |
| 11 | +SUM_TABLE_TASKS = { |
| 12 | + AdminQueries.PRIVATEMODE_USE_OVER_TIME.value: timedelta(days=1), |
| 13 | +} |
| 14 | +SUM_TABLE_REMOVES = { |
| 15 | + AdminQueries.PRIVATEMODE_USE_OVER_TIME.value: timedelta(days=90), |
| 16 | +} |
| 17 | + |
| 18 | + |
| 19 | +def start_sums_table_thread() -> None: |
| 20 | + __init_next_exec() |
| 21 | + daemon.run_without_db_token(__sum_table_thread) |
| 22 | + |
| 23 | + |
| 24 | +def __sum_table_thread() -> None: |
| 25 | + global NEXT_EXEC, SUM_TABLE_TASKS |
| 26 | + while True: |
| 27 | + sleep(5) |
| 28 | + now = datetime.now() |
| 29 | + # collect only keys that are due |
| 30 | + to_run = [ |
| 31 | + (k, delta) |
| 32 | + for k, delta in SUM_TABLE_TASKS.items() |
| 33 | + if now >= NEXT_EXEC.get(k, datetime.min) |
| 34 | + ] |
| 35 | + |
| 36 | + if not to_run: |
| 37 | + continue |
| 38 | + |
| 39 | + if to_run: |
| 40 | + try: |
| 41 | + general.get_ctx_token() |
| 42 | + for key, delta in to_run: |
| 43 | + data = __get_sum_data_by_key(key) |
| 44 | + if not data: |
| 45 | + raise ValueError("No sum data found") |
| 46 | + sums_table_db_go.create(sum_key=key, data=data, with_commit=True) |
| 47 | + NEXT_EXEC[key] = now + delta |
| 48 | + _cleanup_old_entries() # only if something run we clean so we dont do this to often |
| 49 | + except Exception: |
| 50 | + print(traceback.format_exc(), flush=True) |
| 51 | + finally: |
| 52 | + general.remove_and_refresh_session() |
| 53 | + |
| 54 | + |
| 55 | +def __init_next_exec() -> None: |
| 56 | + global NEXT_EXEC |
| 57 | + |
| 58 | + for key, delta in SUM_TABLE_TASKS.items(): |
| 59 | + NEXT_EXEC[key] = sums_table_db_go.get_last_execution_by_key(key) |
| 60 | + if NEXT_EXEC[key] is None: |
| 61 | + NEXT_EXEC[key] = datetime.now() |
| 62 | + else: |
| 63 | + NEXT_EXEC[key] = NEXT_EXEC[key] + delta |
| 64 | + |
| 65 | + |
| 66 | +def __get_sum_data_by_key(sum_key: str) -> dict: |
| 67 | + if sum_key == AdminQueries.PRIVATEMODE_USE_OVER_TIME.value: |
| 68 | + return sums_table_db_go.get_privatemode_sum_snapshot() |
| 69 | + return None |
| 70 | + |
| 71 | + |
| 72 | +def _cleanup_old_entries() -> None: |
| 73 | + global NEXT_EXEC |
| 74 | + for key, delta in SUM_TABLE_REMOVES.items(): |
| 75 | + sums_table_db_go.clean_old_entries(key, delta) |
0 commit comments