agendas: factorize recurring event update code (#57305)

This commit is contained in:
Nicolas Roche 2021-10-05 14:36:29 +02:00
parent 25b5222dd4
commit 9a2272396b
2 changed files with 24 additions and 19 deletions

View File

@ -22,6 +22,7 @@ import itertools
import math
import sys
import uuid
from contextlib import contextmanager
import requests
import vobject
@ -1409,6 +1410,23 @@ class Event(models.Model):
self.slug = generate_slug(self, seen_slugs=seen_slugs, agenda=self.agenda)
return super().save(*args, **kwargs)
@contextmanager
def update_recurrences(self, changed_data, cleaned_data, protected_fields, exclude_fields):
with transaction.atomic():
if any(field for field in changed_data if field in protected_fields):
self.recurrences.all().delete()
elif self.recurrence_days:
update_fields = {
field: value for field, value in cleaned_data.items() if field not in exclude_fields
}
self.recurrences.update(**update_fields)
yield
if self.recurrence_end_date:
self.recurrences.filter(start_datetime__gt=self.recurrence_end_date).delete()
excluded_datetimes = [evt.datetime_slug for evt in self.recurrences.all()]
self.create_all_recurrences(excluded_datetimes)
@property
def base_slug(self):
# label can be empty

View File

@ -24,7 +24,6 @@ from django import forms
from django.conf import settings
from django.contrib.auth.models import Group
from django.core.exceptions import FieldDoesNotExist
from django.db import transaction
from django.forms import ValidationError
from django.utils.encoding import force_text
from django.utils.six import StringIO
@ -280,25 +279,13 @@ class EventForm(NewEventForm):
self.cleaned_data['recurrence_end_date'] = None
def save(self, *args, **kwargs):
with transaction.atomic():
if any(field for field in self.changed_data if field in self.protected_fields):
self.instance.recurrences.all().delete()
elif self.instance.recurrence_days:
protected_fields = list(self.protected_fields) + ['recurrence_end_date', 'frequency']
update_fields = {
field: value
for field, value in self.cleaned_data.items()
if field not in protected_fields
}
self.instance.recurrences.update(**update_fields)
with self.instance.update_recurrences(
self.changed_data,
self.cleaned_data,
self.protected_fields,
list(self.protected_fields) + ['recurrence_end_date', 'frequency'],
):
super().save(*args, **kwargs)
if self.instance.recurrence_end_date:
self.instance.recurrences.filter(
start_datetime__gt=self.instance.recurrence_end_date
).delete()
excluded_datetimes = [event.datetime_slug for event in self.instance.recurrences.all()]
self.instance.create_all_recurrences(excluded_datetimes)
return self.instance