"""Pure calendar utility functions (no ORM dependencies). Extracted from events/bp/calendar/services/calendar_view.py so that blog admin (and any other app) can use them without cross-app imports. """ from __future__ import annotations import calendar as pycalendar from datetime import datetime, timezone from quart import request def parse_int_arg(name: str, default: int | None = None) -> int | None: """Parse an integer query parameter from the request.""" val = request.args.get(name, "").strip() if not val: return default try: return int(val) except ValueError: return default def add_months(year: int, month: int, delta: int) -> tuple[int, int]: """Add (or subtract) months to a given year/month, handling year overflow.""" new_month = month + delta new_year = year + (new_month - 1) // 12 new_month = ((new_month - 1) % 12) + 1 return new_year, new_month def build_calendar_weeks(year: int, month: int) -> list[list[dict]]: """Build a calendar grid for the given year and month. Returns a list of weeks, where each week is a list of 7 day dicts. """ today = datetime.now(timezone.utc).date() cal = pycalendar.Calendar(firstweekday=0) # 0 = Monday weeks: list[list[dict]] = [] for week in cal.monthdatescalendar(year, month): week_days = [] for d in week: week_days.append( { "date": d, "in_month": (d.month == month), "is_today": (d == today), } ) weeks.append(week_days) return weeks