From b11115aa61154bb4640a55de2a66cb97ef8f977d Mon Sep 17 00:00:00 2001 From: Dominik George <dominik.george@teckids.org> Date: Sun, 27 Oct 2019 13:51:40 +0100 Subject: [PATCH] Add i_week() method to LessonPeriod's QuerySet. Advances #33 and #34. --- biscuit/apps/chronos/models.py | 16 ++++++++++++++-- biscuit/apps/chronos/views.py | 8 +------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/biscuit/apps/chronos/models.py b/biscuit/apps/chronos/models.py index ca292c56..05dd51cd 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 ec6be60b..cf2c293b 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 -- GitLab