diff --git a/lektor/lektordata/scripts/calendar-fetcher-main.py b/lektor/lektordata/scripts/calendar-fetcher-main.py index e12db70..c915cf0 100644 --- a/lektor/lektordata/scripts/calendar-fetcher-main.py +++ b/lektor/lektordata/scripts/calendar-fetcher-main.py @@ -2,16 +2,67 @@ import sys from pathlib import Path -from datetime import datetime, date +from datetime import datetime, date, timedelta from typing import Optional, NamedTuple from dataclasses import dataclass - +from copy import deepcopy import requests from bs4 import BeautifulSoup -from icalendar import Calendar +from icalendar import Calendar, Event import recurring_ical_events import locale + +#This is duplicated code from calendar-fetcher.py +def split_multiday_events(events): + """ + Split multi-day events into separate daily events. + + Args: + events: Iterator of iCal events + + Returns: + List of events where multi-day events are split into daily events + """ + split_events = [] + + for event in events: + # Get start and end dates + start = event.get('dtstart').dt + end = event.get('dtend').dt if event.get('dtend') else start + + # Convert datetime to date if needed + if isinstance(start, datetime): + start = start.date() + if isinstance(end, datetime): + end = end.date() + + # If it's a single day event or not a date/datetime, add as is + if not isinstance(start, date) or not isinstance(end, date) or start == end: + split_events.append(event) + continue + + # For multi-day events, create separate events for each day + current_date = start + while current_date < end: + # Create a copy of the original event + daily_event = Event() + for key in event: + daily_event[key] = deepcopy(event[key]) + + + # Update the date for this instance + daily_event['dtstart'].dt = current_date + + if 'dtend' in daily_event: + daily_event['dtend'].dt = current_date + timedelta(days=1) + + split_events.append(daily_event) + current_date += timedelta(days=1) + return split_events + + + @dataclass class EventDetails: weekday: str @@ -83,8 +134,8 @@ page.html def get_next_event(self, calendar: Calendar) -> Optional[EventDetails]: try: - events = recurring_ical_events.of(calendar).after(datetime.now()) - event = next(events) + events = split_multiday_events(recurring_ical_events.of(calendar).after(datetime.now())) + event = events[0] start = event.get('dtstart').dt return EventDetails( diff --git a/lektor/lektordata/scripts/calendar-fetcher.py b/lektor/lektordata/scripts/calendar-fetcher.py index dc27858..806d221 100644 --- a/lektor/lektordata/scripts/calendar-fetcher.py +++ b/lektor/lektordata/scripts/calendar-fetcher.py @@ -6,7 +6,7 @@ from icalendar import Calendar, Event import locale import sys - +#This is duplicated code from calendar-fetcher-main.py def split_multiday_events(events): """ Split multi-day events into separate daily events.