commit 6384141815d503a612eef5377741997555d145b1
parent 71c1a64e713264e78f6e46d2eeb2e39388879bc2
Author: Carlosokumu <carlosokumu254@gmail.com>
Date: Thu, 14 Aug 2025 21:04:40 +0300
add logic to load existing ical files
Diffstat:
1 file changed, 40 insertions(+), 0 deletions(-)
diff --git a/calendarapp/ical/ical_manager.py b/calendarapp/ical/ical_manager.py
@@ -1,3 +1,4 @@
+import os
from icalendar import Calendar, Event, vDuration
from datetime import datetime
from typing import Dict, Any
@@ -31,6 +32,21 @@ class ICalManager:
event['dtstart'].params['TZID'] = event_data['tzid']
return event
+
+ def update_event(self, cal: Calendar, updates: Dict[str, Any], uid: str) -> Calendar:
+ event_found = False
+ for component in cal.walk():
+ if component.name == "VEVENT" and str(component.get("UID")) == uid:
+ event_found = True
+ for key, value in updates.items():
+ component[key] = value
+ break
+
+ if not event_found:
+ raise ValueError(f"No event with UID {uid} found.")
+
+ return cal
+
def _parse_duration(self, duration_str: str) -> tuple[int, int]:
"""Parse duration string in format 'XhYm' into hours and minutes."""
@@ -48,6 +64,30 @@ class ICalManager:
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 load_ical_file(self, filename: str) -> Calendar:
+ """Load an iCalendar file from disk with error handling."""
+ if not os.path.exists(filename):
+ raise FileNotFoundError(f"iCalendar file '{filename}' does not exist.")
+
+ try:
+ with open(filename, 'rb') as f:
+ data = f.read()
+ self.calendar = Calendar.from_ical(data)
+ return self.calendar
+ except Exception as e:
+ raise ValueError(f"Failed to parse iCalendar file '{filename}': {e}")
+
+
+ def get_all_events(self,cal):
+ """
+ Return a list of all VEVENT components in the calendar.
+ """
+ events = []
+ for component in cal.walk():
+ if component.name == "VEVENT":
+ events.append(component)
+ return events
def save_to_file(self, event: Event, filename: str) -> None:
"""Save calendar with event to .ics file."""