From 126627e796ebd0591fd11aa1fc1c6f8bfa697519 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 10 Dec 2020 14:56:06 +0100 Subject: [PATCH 1/2] agendas: move desks prefetch code from view to model (#48306) --- chrono/agendas/models.py | 17 +++++++++++++++++ chrono/manager/views.py | 15 +-------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 4821ffc..8b8981e 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -529,6 +529,23 @@ class Agenda(models.Model): except (VariableDoesNotExist, TemplateSyntaxError): return + def prefetch_desks_and_exceptions(self): + assert self.kind != 'events' + + self.prefetched_desks = self.desk_set.all().prefetch_related( + 'timeperiod_set', 'unavailability_calendars', + ) + all_desks_exceptions = TimePeriodException.objects.filter( + Q(desk__in=self.prefetched_desks) | Q(unavailability_calendar__desks__in=self.prefetched_desks) + ).select_related('source') + for desk in self.prefetched_desks: + uc_ids = [uc.pk for uc in desk.unavailability_calendars.all()] + desk.prefetched_exceptions = [ + e + for e in all_desks_exceptions + if e.desk_id == desk.pk or e.unavailability_calendar_id in uc_ids + ] + class VirtualMember(models.Model): '''Trough model to link virtual agendas to their real agendas. diff --git a/chrono/manager/views.py b/chrono/manager/views.py index e146209..8bb6ec3 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -1353,20 +1353,7 @@ class AgendaSettings(ManagedAgendaMixin, DetailView): def get_object(self, *args, **kwargs): if self.agenda.kind == 'meetings': - self.agenda.prefetched_desks = self.agenda.desk_set.all().prefetch_related( - 'timeperiod_set', 'unavailability_calendars', - ) - all_desks_exceptions = TimePeriodException.objects.filter( - Q(desk__in=self.agenda.prefetched_desks) - | Q(unavailability_calendar__desks__in=self.agenda.prefetched_desks) - ).select_related('source') - for desk in self.agenda.prefetched_desks: - uc_ids = [uc.pk for uc in desk.unavailability_calendars.all()] - desk.prefetched_exceptions = [ - e - for e in all_desks_exceptions - if e.desk_id == desk.pk or e.unavailability_calendar_id in uc_ids - ] + self.agenda.prefetch_desks_and_exceptions() return self.agenda def get_context_data(self, **kwargs): -- 2.20.1