diff --git a/biscuit/apps/chronos/models.py b/biscuit/apps/chronos/models.py index 05dd51cd49a47f85acab86b4b7d929266d069d05..b791e16d5d59fa49be48c8d4ecf1a9d13d48084c 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 cf2c293b1936b0f747a227db1945afcba7113a26..b981c06e6fb0c6f3b710622c19e3c79a4d224206 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: