import datetime import logging import re from sheets_client import SheetsRow INTERVAL_ABBREVS = { "pv": datetime.timedelta(days=1), "vk": datetime.timedelta(days=7), "kk": datetime.timedelta(days=30), "v": datetime.timedelta(days=365), } def _calculate_interval(interval_str: str): match = re.search(r"(\d+)(\w+)", interval_str) number = int(match[1]) abbrev = match[2] try: interval = INTERVAL_ABBREVS[abbrev] except KeyError: raise Exception(f'"{interval_str}" is an invalid interval string!') total_interval = datetime.timedelta(seconds=interval.total_seconds() * number) return total_interval def _timestamp_to_date(timestamp: str): return datetime.datetime.strptime(timestamp, "%Y-%m-%d") def _date_to_timestamp(date): return datetime.datetime.strftime(date, "%Y-%m-%d") def _process_row(row: SheetsRow): interval = _calculate_interval(row.interval) last_done_date = _timestamp_to_date(row.last_done) next_date = last_done_date + interval next_date_str = _date_to_timestamp(next_date) return (next_date, row.name, row.interval) def _is_this_week(processed_row): next_date = processed_row[0] now = datetime.datetime.now() return (next_date - now) < datetime.timedelta(weeks=1) def filter_only_this_weeks_rows(rows: list[SheetsRow]): processed_rows = map(_process_row, rows) return filter(_is_this_week, processed_rows)