"""Calendar.""" import typing from datetime import timedelta from .event import Event event_type_color_map = { "bank_holiday": "success-subtle", "conference": "primary-subtle", "us_holiday": "secondary-subtle", "birthday": "info-subtle", "waste_schedule": "danger-subtle", } colors = { "primary-subtle": "#cfe2ff", "secondary-subtle": "#e2e3e5", "success-subtle": "#d1e7dd", "info-subtle": "#cff4fc", "warning-subtle": "#fff3cd", "danger-subtle": "#f8d7da", } def build_events(events: list[Event]) -> list[dict[str, typing.Any]]: """Build list of events for FullCalendar.""" items: list[dict[str, typing.Any]] = [] one_day = timedelta(days=1) for e in events: if e.name == "today": continue if e.name == "accommodation": assert e.title and e.end_date item = { "allDay": True, "title": e.title_with_emoji, "start": e.as_date.isoformat(), "end": (e.end_as_date + one_day).isoformat(), "url": e.url, } items.append(item) item = { "allDay": False, "title": "checkin: " + e.title, "start": e.date.isoformat(), "url": e.url, } items.append(item) item = { "allDay": False, "title": "checkout: " + e.title, "start": e.end_date.isoformat(), "url": e.url, } items.append(item) continue if e.has_time: end = e.end_date or e.date + timedelta(minutes=30) else: end = (e.end_as_date if e.end_date else e.as_date) + one_day item = { "allDay": not e.has_time, "title": e.title_with_emoji, "start": e.date.isoformat(), "end": end.isoformat(), } if e.name in event_type_color_map: item["color"] = colors[event_type_color_map[e.name]] item["textColor"] = "black" if e.url: item["url"] = e.url items.append(item) return items