diff --git a/khal/controllers.py b/khal/controllers.py index 6148f29ec..ae10c6059 100644 --- a/khal/controllers.py +++ b/khal/controllers.py @@ -765,7 +765,7 @@ def print_ics(conf, name, ics, format): events = [item for item in cal.walk() if item.name == "VEVENT"] events_grouped = defaultdict(list) for event in events: - events_grouped[event["UID"]].append(event) + events_grouped[event.get("UID", f"khal-vevent-without-uid-{id(event)}")].append(event) vevents = [] for uid in events_grouped: diff --git a/khal/khalendar/event.py b/khal/khalendar/event.py index 8fda097e5..029c5aac8 100644 --- a/khal/khalendar/event.py +++ b/khal/khalendar/event.py @@ -347,7 +347,10 @@ def duration(self) -> dt.timedelta: @property def uid(self) -> str: - return self._vevents[self.ref]["UID"] + try: + return self._vevents[self.ref]["UID"] + except KeyError: + return f"khal-vevent-without-uid-{id(self.ref)}" @property def organizer(self) -> str: diff --git a/tests/event_test.py b/tests/event_test.py index c33e4ed94..d1a8bdb9b 100644 --- a/tests/event_test.py +++ b/tests/event_test.py @@ -736,6 +736,11 @@ def test_sort_event_summary(): assert event1 < event2 +def test_uid_missing(): + event_uid = _get_text("event_uid_missing") + assert event_uid.uid.startswith("khal-vevent-without-uid-") + + def test_create_timezone_in_future(): """Events too far into the future (after the next DST transition) used to be created with invalid timezones""" diff --git a/tests/ics/event_uid_missing.ics b/tests/ics/event_uid_missing.ics new file mode 100644 index 000000000..123422e26 --- /dev/null +++ b/tests/ics/event_uid_missing.ics @@ -0,0 +1,8 @@ +BEGIN:VCALENDAR +VERSION:2.0 +BEGIN:VEVENT +SUMMARY:Missing uid +DTSTART;TZID=Europe/Berlin:20140707T090000 +DTEND;TZID=Europe/Berlin:20140707T140000 +END:VEVENT +END:VCALENDAR