Add padding to each event UID to avoid conflicts when adding same events/icalendars to caldav calendars.

This commit is contained in:
Kevin Alberts 2020-11-11 21:20:45 +01:00
parent 06c5c485f7
commit 0cacd98f23
Signed by: Kurocon
GPG key ID: BCD496FEBA0C6BC1
2 changed files with 24 additions and 1 deletions

View file

@ -1,6 +1,11 @@
from typing import List
from urllib.request import urlopen
import ics
from django.utils.text import slugify
from ics import Event
from davinci.caldav.models import CalDAVCalendar
def get_ical_from_url(ical_url):
@ -11,3 +16,17 @@ def get_ical_from_url(ical_url):
def split_events(data):
c = ics.Calendar(data.decode('utf-8'))
return c.events
def fix_ical_uid(event: Event, padding: str):
e = event.clone()
e.uid = f"{event.uid}{padding}"
return e
def fix_ical_uids(events: List[Event], calendar: CalDAVCalendar):
# Pad the uids with some string related to the calendar
# So that if someone wants to sync the same .ics to two calendars, the UIDs are different. We will do this by
# appending the string "@slugified-server-name+slugified-username+slugified-calendar-name" to each uid.
padding = f"@{slugify(calendar.server.name)}+{slugify(calendar.server.username)}+{slugify(calendar.name)}"
return [fix_ical_uid(event, padding) for event in events]

View file

@ -30,4 +30,8 @@ class ICalSync(models.Model):
def get_events(self):
data = ical_utils.get_ical_from_url(self.ical_url)
return ical_utils.split_events(data)
events = ical_utils.split_events(data)
# We have to pad the uids with some string related to the target calendar,
# So that if someone wants to sync the same .ics to two calendars, the UIDs are different.
fixed_events = ical_utils.fix_ical_uids(events, self.target)
return fixed_events