Do not re-upload events if they aren't changed.
This commit is contained in:
parent
628356366e
commit
34a2c840cd
|
@ -65,7 +65,7 @@ class CalDAVCalendar(models.Model):
|
||||||
return cal
|
return cal
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def upload_events(self, events: List[Event], purge: bool = True, ignore_invalid_recurring: bool = False) -> Tuple[int, int, int]:
|
def upload_events(self, events: List[Event], purge: bool = True, ignore_invalid_recurring: bool = False) -> Tuple[int, int, int, int]:
|
||||||
"""
|
"""
|
||||||
Upload events to this calendar. If purge is True, all old events will be removed.
|
Upload events to this calendar. If purge is True, all old events will be removed.
|
||||||
:param events: The events to upload
|
:param events: The events to upload
|
||||||
|
@ -74,8 +74,8 @@ class CalDAVCalendar(models.Model):
|
||||||
:type purge: bool
|
:type purge: bool
|
||||||
:param ignore_invalid_recurring: Whether to ignore errors when adding invalid recurring events (GCalendar does this)
|
:param ignore_invalid_recurring: Whether to ignore errors when adding invalid recurring events (GCalendar does this)
|
||||||
:type ignore_invalid_recurring: bool
|
:type ignore_invalid_recurring: bool
|
||||||
:return Amount of events added, updated, and deleted
|
:return Amount of events added, updated, unchanged, and deleted
|
||||||
:rtype Tuple[int, int, int]
|
:rtype Tuple[int, int, int, int]
|
||||||
"""
|
"""
|
||||||
logger = logging.getLogger("davinci.icalendar.CalDAVCalendar.upload_events")
|
logger = logging.getLogger("davinci.icalendar.CalDAVCalendar.upload_events")
|
||||||
calendar = self.get_calendar()
|
calendar = self.get_calendar()
|
||||||
|
@ -88,6 +88,7 @@ class CalDAVCalendar(models.Model):
|
||||||
|
|
||||||
updated = 0
|
updated = 0
|
||||||
added = 0
|
added = 0
|
||||||
|
unchanged = 0
|
||||||
|
|
||||||
# Import events
|
# Import events
|
||||||
for event in events:
|
for event in events:
|
||||||
|
@ -102,8 +103,22 @@ class CalDAVCalendar(models.Model):
|
||||||
# Need to overwrite
|
# Need to overwrite
|
||||||
try:
|
try:
|
||||||
cevent = calendar.event_by_uid(event.uid)
|
cevent = calendar.event_by_uid(event.uid)
|
||||||
cevent.data = vcal.fix(ev)
|
|
||||||
cevent.save()
|
replace = False
|
||||||
|
|
||||||
|
# If a sequence number is available, only overwrite if it is higher in the ICS event.
|
||||||
|
if hasattr(cevent.vobject_instance.vevent, 'sequence') and any([x.name == "SEQUENCE" for x in event.extra]):
|
||||||
|
ics_sequence = [x.value for x in event.extra if x.name == "SEQUENCE"][0]
|
||||||
|
dav_sequence = cevent.vobject_instance.vevent.sequence.value
|
||||||
|
if int(ics_sequence) > int(dav_sequence):
|
||||||
|
replace = True
|
||||||
|
|
||||||
|
if replace:
|
||||||
|
cevent.data = vcal.fix(ev)
|
||||||
|
cevent.save()
|
||||||
|
updated += 1
|
||||||
|
else:
|
||||||
|
unchanged += 1
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if ignore_invalid_recurring and len([x for x in event.extra if x.name == "RECURRENCE-ID"]) > 0:
|
if ignore_invalid_recurring and len([x for x in event.extra if x.name == "RECURRENCE-ID"]) > 0:
|
||||||
# Recurring event from GCal, ignore
|
# Recurring event from GCal, ignore
|
||||||
|
@ -113,7 +128,6 @@ class CalDAVCalendar(models.Model):
|
||||||
logger.error(f"======EVENT======\n{ev}\n=================")
|
logger.error(f"======EVENT======\n{ev}\n=================")
|
||||||
|
|
||||||
purge_uids.remove(event.uid)
|
purge_uids.remove(event.uid)
|
||||||
updated += 1
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
|
@ -131,4 +145,4 @@ class CalDAVCalendar(models.Model):
|
||||||
else:
|
else:
|
||||||
deleted = 0
|
deleted = 0
|
||||||
|
|
||||||
return added, updated, deleted
|
return added, updated, unchanged, deleted
|
||||||
|
|
|
@ -21,10 +21,10 @@ class Command(BaseCommand):
|
||||||
logger.debug(f"Synchronizing {sync.name}...")
|
logger.debug(f"Synchronizing {sync.name}...")
|
||||||
|
|
||||||
events = sync.get_events()
|
events = sync.get_events()
|
||||||
added, existing, deleted = sync.target.upload_events(events, purge=sync.purge, ignore_invalid_recurring=True)
|
added, existing, unchanged, deleted = sync.target.upload_events(events, purge=sync.purge, ignore_invalid_recurring=True)
|
||||||
|
|
||||||
sync.last_sync = timezone.now()
|
sync.last_sync = timezone.now()
|
||||||
sync.save()
|
sync.save()
|
||||||
logger.debug(f"Sync for {sync.name} done! {added} events added, {existing} updated, and {deleted} purged.")
|
logger.debug(f"Sync for {sync.name} done! {added} events added, {existing} updated, {unchanged} unchanged, and {deleted} purged.")
|
||||||
|
|
||||||
logger.debug("iCal sync complete!")
|
logger.debug("iCal sync complete!")
|
||||||
|
|
|
@ -21,10 +21,10 @@ class Command(BaseCommand):
|
||||||
logger.debug(f"Synchronizing {sync.name}...")
|
logger.debug(f"Synchronizing {sync.name}...")
|
||||||
|
|
||||||
events = sync.get_events()
|
events = sync.get_events()
|
||||||
added, existing, deleted = sync.target.upload_events(events, purge=sync.purge)
|
added, existing, unchanged, deleted = sync.target.upload_events(events, purge=sync.purge)
|
||||||
|
|
||||||
sync.last_sync = timezone.now()
|
sync.last_sync = timezone.now()
|
||||||
sync.save()
|
sync.save()
|
||||||
logger.debug(f"Sync for {sync.name} done! {added} events added, {existing} updated, and {deleted} purged.")
|
logger.debug(f"Sync for {sync.name} done! {added} events added, {existing} updated. {unchanged} unchanged, and {deleted} purged.")
|
||||||
|
|
||||||
logger.debug("iCal sync complete!")
|
logger.debug("iCal sync complete!")
|
||||||
|
|
Loading…
Reference in a new issue