From 104427f24c7e71a5f9900593215d2d96a3cef65f Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 9 Oct 2026 18:13:25 +0200 Subject: [PATCH 1/2] events: Use stable UIDs in ICS feeds Derive each event's UID from its page id instead of letting the ics library generate a random one on every download. Random UIDs break calendar sync clients such as vdirsyncer. --- mpicms/events/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mpicms/events/models.py b/mpicms/events/models.py index a0494aa..735e518 100644 --- a/mpicms/events/models.py +++ b/mpicms/events/models.py @@ -125,6 +125,7 @@ def get_ics(self, external=False): for event in self.events.filter(external=external): e = ICSEvent( name=event.title, + uid='event-%d@intranet.molgen.mpg.de' % event.pk, begin=event.start, end=event.end, description=event.search_description, From 645662c338965d9b18ae65672c1a3ae34f4c3a50 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Fri, 9 Oct 2026 18:16:55 +0200 Subject: [PATCH 2/2] events: Sort ICS feed entries newest first The ics library keeps events in a set, so the feed came out in random order. Order by start date and time, newest first, with the page id as tie-breaker, and keep that order through serialization. --- mpicms/events/models.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mpicms/events/models.py b/mpicms/events/models.py index 735e518..bc7fa3e 100644 --- a/mpicms/events/models.py +++ b/mpicms/events/models.py @@ -122,7 +122,11 @@ def clean(self): # Prevent more than one event index def get_ics(self, external=False): c = Calendar() - for event in self.events.filter(external=external): + # ics 0.7 keeps events in a set, which serializes in random order. + # The serializer only iterates over it, so a list keeps our order. + c.events = [] + events = self.events.filter(external=external).order_by('-start_date', '-start_time', '-pk') + for event in events: e = ICSEvent( name=event.title, uid='event-%d@intranet.molgen.mpg.de' % event.pk, @@ -134,7 +138,7 @@ def get_ics(self, external=False): ) if type(event.start) is date: e.make_all_day() - c.events.add(e) + c.events.append(e) return c