commit af746edb2bb11b1e04655deb81db959c7ade6146
parent 60e07ddfcee827034808ac0b08f4340edd8f740f
Author: Carlosokumu <carlosokumu254@gmail.com>
Date: Mon, 18 Aug 2025 18:22:46 +0300
ensure ical field DTSTART stores two entries : one with tzid and withoout tzid
Diffstat:
1 file changed, 33 insertions(+), 24 deletions(-)
diff --git a/calendarapp/ical/ical_manager.py b/calendarapp/ical/ical_manager.py
@@ -1,6 +1,6 @@
import os
from icalendar import Calendar, Event, vDuration
-from datetime import datetime
+from datetime import datetime, timedelta, timezone
from typing import Dict, Any
class ICalManager:
@@ -13,25 +13,36 @@ class ICalManager:
def create_event(self, event_data: Dict[str, Any]) -> Event:
event = Event()
-
- event.add('dtstart', event_data['start'])
+
+ start_dt = event_data['start']
+ tzid = event_data.get('tzid')
+
+ event.add('dtstart', start_dt.astimezone(timezone.utc))
+
+ if tzid:
+ event.add('dtstart', start_dt)
+ event['dtstart'][-1].params['TZID'] = tzid
+ else:
+ event.add('dtstart', start_dt)
+
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 'duration' in event_data:
+ if isinstance(event_data['duration'], str):
+ event.add('duration', self._parse_duration(event_data['duration']))
+ else:
+ event.add('duration', event_data['duration'])
+
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']
-
+ event.add('uid', self._generate_uid(start_dt))
+
return event
+
def update_event(self, cal: Calendar, updates: Dict[str, Any],filename: str = None) -> Calendar:
uid = cal.walk('VEVENT')[0].get('uid')
@@ -51,19 +62,17 @@ class ICalManager:
return cal
+ def _parse_duration(self, duration_str: str):
+ hours, minutes = 0, 0
+ if "h" in duration_str:
+ parts = duration_str.split("h")
+ hours = int(parts[0])
+ if "m" in parts[1]:
+ minutes = int(parts[1].replace("m", ""))
+ elif "m" in duration_str:
+ minutes = int(duration_str.replace("m", ""))
- 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
+ return timedelta(hours=hours, minutes=minutes)
def _generate_uid(self, dtstart: datetime) -> str:
"""Generate a unique ID based on event start time."""