From 4c18f7ec6cf415a65fadd334db950972deea40ca Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Sun, 27 Oct 2019 13:41:56 +0100
Subject: [PATCH] Introduce ModelManager for LessonPeriod. Advances #33.

---
 biscuit/apps/chronos/models.py | 15 +++++++++++++++
 biscuit/apps/chronos/views.py  |  4 ----
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/biscuit/apps/chronos/models.py b/biscuit/apps/chronos/models.py
index 93eb2fd0..ca292c56 100644
--- a/biscuit/apps/chronos/models.py
+++ b/biscuit/apps/chronos/models.py
@@ -12,6 +12,19 @@ from biscuit.core.mixins import SchoolRelated
 from .util import CalendarWeek
 
 
+class LessonPeriodManager(models.Manager):
+    ''' Manager adding specific methods to lesson periods. '''
+
+    def get_queryset(self):
+        ''' Ensures all related lesson data is loaded as well. '''
+
+        return super().get_queryset().select_related(
+            'lesson', 'lesson__subject', 'period', 'room'
+        ).prefetch_related(
+            'lesson__groups', 'lesson__teachers', 'substitutions'
+        )
+
+
 class TimePeriod(SchoolRelated):
     WEEKDAY_CHOICES = [
         (0, _('Sunday')),
@@ -147,6 +160,8 @@ class LessonSubstitution(SchoolRelated):
 
 
 class LessonPeriod(SchoolRelated):
+    objects = LessonPeriodManager()
+
     lesson = models.ForeignKey('Lesson', models.CASCADE, related_name='lesson_periods')
     period = models.ForeignKey('TimePeriod', models.CASCADE, related_name='lesson_periods')
 
diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py
index d35a6686..ec6be60b 100644
--- a/biscuit/apps/chronos/views.py
+++ b/biscuit/apps/chronos/views.py
@@ -33,10 +33,6 @@ def timetable(request: HttpRequest, year: Optional[int] = None, week: Optional[i
     lesson_periods = LessonPeriod.objects.filter(
         lesson__date_start__lte=wanted_week[0] + timedelta(days=1) * (F('period__weekday') - 1),
         lesson__date_end__gte=wanted_week[0] + timedelta(days=1) * (F('period__weekday') - 1)
-    ).select_related(
-        'lesson', 'lesson__subject', 'period', 'room'
-    ).prefetch_related(
-        'lesson__groups', 'lesson__teachers', 'substitutions'
     ).extra(
         select={'_week': wanted_week.week}
     )
-- 
GitLab