From f792b808c14246a524a82017595d44f7efaeeab6 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 11 Mar 2021 12:00:43 +0100 Subject: [PATCH 1/2] manager: use slug instead of start_datetime to identify event recurrence (#52112) --- chrono/agendas/models.py | 9 ++++++++- chrono/manager/forms.py | 5 +---- tests/test_manager.py | 9 +++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index b25a954..0ccc88c 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -616,7 +616,7 @@ class Agenda(models.Model): excluded_datetimes = collections.defaultdict(list) for event in events: if event.primary_event_id: - excluded_datetimes[event.primary_event_id].append(make_naive(event.start_datetime)) + excluded_datetimes[event.primary_event_id].append(event.datetime_slug) events = [ e for e in events if (not e.cancelled or include_cancelled) and (not e.full or include_full) @@ -1436,6 +1436,13 @@ class Event(models.Model): recurrences = self.get_recurrences(localtime(now()), make_aware(max_datetime), excluded_datetimes) Event.objects.bulk_create(recurrences) + @property + def datetime_slug(self): + assert self.primary_event is not None, 'only for event recurrence' + + datetime_part = self.slug.rsplit('--')[-1] + return datetime.datetime.strptime(datetime_part, '%Y-%m-%d-%H%M') + class BookingColor(models.Model): COLOR_COUNT = 8 diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index 5a6c5fa..5b240ee 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -241,10 +241,7 @@ class EventForm(forms.ModelForm): self.instance.recurrences.filter( start_datetime__gt=self.instance.recurrence_end_date ).delete() - excluded_datetimes = [ - make_naive(dt) - for dt in self.instance.recurrences.values_list('start_datetime', flat=True) - ] + excluded_datetimes = [event.datetime_slug for event in self.instance.recurrences.all()] self.instance.create_all_recurrences(excluded_datetimes) return self.instance diff --git a/tests/test_manager.py b/tests/test_manager.py index 6e5a19e..eb321d5 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -1618,6 +1618,15 @@ def test_edit_recurring_event_with_end_date(settings, app, admin_user, freezer): # old recurrences were deleted assert not Event.objects.filter(primary_event=event, start_datetime=now()).exists() + # if start datetime of a recurrence is edited, it stays that way + recurrence = event.recurrences.first() + recurrence.start_datetime += datetime.timedelta(hours=1) + recurrence.save() + resp = app.get('/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id)) + resp = resp.form.submit() + assert Event.objects.filter(primary_event=event).count() == 5 + assert Event.objects.filter(primary_event=event, start_datetime=recurrence.start_datetime).count() == 1 + # editing recurrence_end_date is permitted as long as bookings are not impacted event_recurrence = Event.objects.get(primary_event=event, start_datetime__day=15) Booking.objects.create(event=event_recurrence) -- 2.20.1