commit 59917ab92556a4f3a14ff19bc94f9dd8d58b60d4
parent 5b35a92a863018525b62df22d69be347ff877c36
Author: Carlosokumu <carlosokumu254@gmail.com>
Date: Thu, 14 Aug 2025 00:27:52 +0300
add an IcalManager
Diffstat:
1 file changed, 56 insertions(+), 0 deletions(-)
diff --git a/calendarapp/ical/ical_manager.py b/calendarapp/ical/ical_manager.py
@@ -0,0 +1,56 @@
+from icalendar import Calendar, Event, vDuration
+from datetime import datetime
+from typing import Dict, Any
+
+class ICalManager:
+
+ """Handles parsing, representing, and writing iCalendar files"""
+ def __init__(self):
+ self.calendar = Calendar()
+ self.calendar.add('prodid', '-//CalendarApp//mxm.dk//')
+ self.calendar.add('version', '2.0')
+
+ def create_event(self, event_data: Dict[str, Any]) -> Event:
+ event = Event()
+
+ event.add('dtstart', event_data['start'])
+ event.add('summary', event_data['summary'])
+ event.add('location', event_data['location'])
+ event.add('description', event_data['description'])
+ event.add('organizer', event_data['organizer'])
+
+ if 'end' in event_data:
+ event.add('dtend', event_data['end'])
+
+ if 'uid' in event_data:
+ event.add('uid', event_data['uid'])
+ else:
+ event.add('uid', self._generate_uid(event_data['start']))
+
+ if 'tzid' in event_data:
+ event['dtstart'].params['TZID'] = event_data['tzid']
+
+ return event
+
+ def _parse_duration(self, duration_str: str) -> tuple[int, int]:
+ """Parse duration string in format 'XhYm' into hours and minutes."""
+ hours = 0
+ minutes = 0
+
+ if 'h' in duration_str:
+ hours = int(duration_str.split('h')[0])
+ if 'm' in duration_str:
+ minutes_part = duration_str.split('h')[-1] if 'h' in duration_str else duration_str
+ minutes = int(minutes_part.split('m')[0])
+
+ return hours, minutes
+
+ def _generate_uid(self, dtstart: datetime) -> str:
+ """Generate a unique ID based on event start time."""
+ return f"{dtstart.strftime('%Y%m%dT%H%M%S')}@calendarapp"
+
+ def save_to_file(self, event: Event, filename: str) -> None:
+ """Save calendar with event to .ics file."""
+ self.calendar.add_component(event)
+ with open(filename, 'wb') as f:
+ f.write(self.calendar.to_ical())