From 059a3b95c2736c60acfafd686908372be4567b16 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 (#51778) --- chrono/agendas/models.py | 11 +++++++++-- chrono/manager/forms.py | 5 +---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 8e06bac..e6246c4 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -594,7 +594,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) @@ -641,7 +641,7 @@ class Agenda(models.Model): report.events.set(events) # add recurrences - excluded_datetimes = [make_naive(dt) for dt in recurrences.values_list('start_datetime', flat=True)] + excluded_datetimes = [event.datetime_slug for event in recurrences] Event.create_events_recurrences( recurring_events.filter(recurrence_end_date__isnull=False), excluded_datetimes ) @@ -1487,6 +1487,13 @@ class Event(models.Model): ) 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 9017164..dcf36a1 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -238,10 +238,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 -- 2.20.1