| from __future__ import annotations |
|
|
| from datetime import datetime, timedelta, timezone |
| from uuid import uuid4 |
| from zoneinfo import ZoneInfo |
|
|
|
|
| HOUR_OPTIONS = [f"{hour:02d}" for hour in range(24)] |
| MINUTE_OPTIONS = [f"{minute:02d}" for minute in range(60)] |
|
|
|
|
| def compute_end_time(start_hour: str, start_minute: str) -> tuple[str, str]: |
| start_time = datetime(2000, 1, 1, int(start_hour), int(start_minute), tzinfo=timezone.utc) |
| end_time = start_time + timedelta(hours=2) |
| return end_time.strftime("%H"), end_time.strftime("%M") |
|
|
|
|
| def format_time(hour: str, minute: str) -> str: |
| return f"{hour} : {minute}" |
|
|
|
|
| def get_next_occurrence_minutes(end_hour: str, end_minute: str) -> int: |
| now = datetime.now(ZoneInfo("Asia/Ho_Chi_Minh")) |
| end_time = now.replace(hour=int(end_hour), minute=int(end_minute), second=0, microsecond=0) |
| if end_time < now: |
| end_time += timedelta(days=1) |
| return int((end_time - now).total_seconds() // 60) |
|
|
|
|
| def sort_cards_by_upcoming_time(cards: list[dict]) -> list[dict[str, str]]: |
| return sorted( |
| cards, |
| key=lambda card: ( |
| get_next_occurrence_minutes(card.get("endHour", "23"), card.get("endMinute", "59")), |
| card.get("title", "").lower(), |
| card.get("createdAt", ""), |
| ), |
| ) |
|
|
|
|
| def build_card_payload() -> dict[str, str]: |
| end_hour, end_minute = compute_end_time("08", "00") |
| return { |
| "id": "", |
| "title": "", |
| "startHour": "08", |
| "startMinute": "00", |
| "endHour": end_hour, |
| "endMinute": end_minute, |
| "createdAt": "", |
| "clientKey": str(uuid4()), |
| "tabId": "", |
| } |
|
|
|
|
| def normalize_cards(cards: list[dict]) -> list[dict[str, str]]: |
| normalized = [] |
| for card in cards: |
| start_hour = str(card.get("startHour", "08")).zfill(2) |
| start_minute = str(card.get("startMinute", "00")).zfill(2) |
| end_hour, end_minute = compute_end_time(start_hour, start_minute) |
| normalized.append( |
| { |
| "id": str(card.get("id", "")), |
| "title": str(card.get("title", "")), |
| "startHour": start_hour, |
| "startMinute": start_minute, |
| "endHour": str(card.get("endHour", end_hour)).zfill(2), |
| "endMinute": str(card.get("endMinute", end_minute)).zfill(2), |
| "createdAt": str(card.get("createdAt", "")), |
| "clientKey": str(card.get("clientKey", uuid4())), |
| "tabId": str(card.get("tabId", "")), |
| } |
| ) |
| return normalized |
|
|