From 81195d3f73b09e7a08b9acb70f8de79fe48c1e2f Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Sun, 27 Oct 2019 14:24:22 +0100
Subject: [PATCH] Move group, teacher and room filters to QuerySet. Advances
 #33, #34; closes #39.

---
 biscuit/apps/chronos/models.py | 12 ++++++++++++
 biscuit/apps/chronos/views.py  | 11 ++++-------
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/biscuit/apps/chronos/models.py b/biscuit/apps/chronos/models.py
index 05dd51cd..b791e16d 100644
--- a/biscuit/apps/chronos/models.py
+++ b/biscuit/apps/chronos/models.py
@@ -36,6 +36,18 @@ class LessonPeriodQuerySet(models.QuerySet):
             select={'_week': wanted_week.week}
         )
 
+    def filter_group(self, group: int):
+        return self.filter(
+                Q(lesson__groups__pk=group) | Q(lesson__groups__parent_groups__pk=group))
+
+    def filter_teacher(self, teacher: int):
+        return self.filter(
+                Q(substitutions__teachers__pk=teacher, substitutions__week=models.F('_week')) | Q(lesson__teachers__pk=teacher))
+
+    def filter_room(self, room: int):
+        return self.filter(
+                Q(substitutions__room__pk=room, substitutions__week=models.F('_week')) | Q(room__pk=room))
+
 
 class TimePeriod(SchoolRelated):
     WEEKDAY_CHOICES = [
diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py
index cf2c293b..b981c06e 100644
--- a/biscuit/apps/chronos/views.py
+++ b/biscuit/apps/chronos/views.py
@@ -31,17 +31,14 @@ def timetable(request: HttpRequest, year: Optional[int] = None, week: Optional[i
 
     lesson_periods = LessonPeriod.objects.in_week(wanted_week)
 
+    # Incrementally filter lesson periods by GET parameters
     if request.GET.get('group', None) or request.GET.get('teacher', None) or request.GET.get('room', None):
-        # Incrementally filter lesson periods by GET parameters
         if 'group' in request.GET and request.GET['group']:
-            lesson_periods = lesson_periods.filter(
-                Q(lesson__groups__pk=int(request.GET['group'])) | Q(lesson__groups__parent_groups__pk=int(request.GET['group'])))
+            lesson_periods = lesson_periods.filter_group(int(request.GET['group']))
         if 'teacher' in request.GET and request.GET['teacher']:
-            lesson_periods = lesson_periods.filter(
-                Q(substitutions__teachers__pk=int(request.GET['teacher']), substitutions__week=wanted_week.week) | Q(lesson__teachers__pk=int(request.GET['teacher'])))
+            lesson_periods = lesson_periods.filter_teacher(int(request.GET['teacher']))
         if 'room' in request.GET and request.GET['room']:
-            lesson_periods = lesson_periods.filter(
-                room__pk=int(request.GET['room']))
+            lesson_periods = lesson_periods.room_filter(int(request.GET['room']))
     else:
         # Redirect to a selected view if no filter provided
         if request.user.person:
-- 
GitLab