agendas: factorize recurring event update code (#57305)
This commit is contained in:
parent
25b5222dd4
commit
9a2272396b
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue