diff --git a/biscuit/apps/chronos/models.py b/biscuit/apps/chronos/models.py index ca292c56d4ed024ad6d8703963ab0a94c58f6b16..05dd51cd49a47f85acab86b4b7d929266d069d05 100644 --- a/biscuit/apps/chronos/models.py +++ b/biscuit/apps/chronos/models.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timedelta from typing import Dict, Optional, Tuple from django.core import validators @@ -25,6 +25,18 @@ class LessonPeriodManager(models.Manager): ) +class LessonPeriodQuerySet(models.QuerySet): + ''' Overrides default QuerySet to add specific methods for lesson data. ''' + + def in_week(self, wanted_week: CalendarWeek): + return self.filter( + lesson__date_start__lte=wanted_week[0] + timedelta(days=1) * (models.F('period__weekday') - 1), + lesson__date_end__gte=wanted_week[0] + timedelta(days=1) * (models.F('period__weekday') - 1) + ).extra( + select={'_week': wanted_week.week} + ) + + class TimePeriod(SchoolRelated): WEEKDAY_CHOICES = [ (0, _('Sunday')), @@ -160,7 +172,7 @@ class LessonSubstitution(SchoolRelated): class LessonPeriod(SchoolRelated): - objects = LessonPeriodManager() + objects = LessonPeriodManager.from_queryset(LessonPeriodQuerySet)() 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 ec6be60b76428744e2ed115301f06a8da527aa87..cf2c293b1936b0f747a227db1945afcba7113a26 100644 --- a/biscuit/apps/chronos/views.py +++ b/biscuit/apps/chronos/views.py @@ -3,7 +3,6 @@ from collections import OrderedDict from typing import Optional from django.contrib.auth.decorators import login_required -from django.db.models import F, Max, Min, Q from django.http import HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.views.decorators.cache import cache_page @@ -30,12 +29,7 @@ def timetable(request: HttpRequest, year: Optional[int] = None, week: Optional[i else: wanted_week = CalendarWeek() - 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) - ).extra( - select={'_week': wanted_week.week} - ) + lesson_periods = LessonPeriod.objects.in_week(wanted_week) 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