From 91f6d24c23cc53b395a9dbf8533d938eec107672 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 21 Oct 2021 11:39:16 +0200 Subject: [PATCH 4/5] agendas: add separate method for prefetching recurring events (#57957) --- chrono/agendas/models.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index dc27c56c..eb3ea4c1 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -879,6 +879,21 @@ class Agenda(models.Model): if e.desk_id == desk.pk or e.unavailability_calendar_id in uc_ids ] + @staticmethod + def prefetch_recurring_events(qs): + recurring_event_queryset = Event.objects.filter( + Q(publication_datetime__isnull=True) | Q(publication_datetime__lte=now()), + recurrence_days__isnull=False, + ) + qs = qs.prefetch_related( + Prefetch( + 'event_set', + queryset=recurring_event_queryset, + to_attr='prefetched_recurring_events', + ) + ) + return qs + @staticmethod def prefetch_events_and_exceptions( qs, user_external_id=None, show_past_events=False, min_start=None, max_start=None @@ -898,10 +913,6 @@ class Agenda(models.Model): if max_start: event_queryset = event_queryset.filter(start_datetime__lt=max_start) - recurring_event_queryset = Event.objects.filter( - Q(publication_datetime__isnull=True) | Q(publication_datetime__lte=now()), - recurrence_days__isnull=False, - ) exceptions_desk = Desk.objects.filter(slug='_exceptions_holder').prefetch_related( 'unavailability_calendars' ) @@ -911,17 +922,13 @@ class Agenda(models.Model): queryset=event_queryset, to_attr='prefetched_events', ), - Prefetch( - 'event_set', - queryset=recurring_event_queryset, - to_attr='prefetched_recurring_events', - ), Prefetch( 'desk_set', queryset=exceptions_desk, to_attr='prefetched_desks', ), ) + qs = Agenda.prefetch_recurring_events(qs) agendas_exceptions = TimePeriodException.objects.filter( Q(desk__slug='_exceptions_holder', desk__agenda__in=qs) | Q( -- 2.30.2