Skip to content
Snippets Groups Projects
Verified Commit 93cedb72 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Add managers with select_related and prefetch_related, also add memoize for some often used methods

parent 7ca73c54
No related branches found
No related tags found
1 merge request!83Minimize query count
Pipeline #3629 passed
This commit is part of merge request !83. Comments created here will be created in the context of that merge request.
......@@ -112,11 +112,90 @@ class LessonSubstitutionManager(CurrentSiteManager):
.select_related(
"lesson_period",
"lesson_period__lesson",
"lesson_period__lesson__subject",
"subject",
"lesson_period__period",
"room",
"lesson_period__room",
)
.prefetch_related(
"lesson_period__lesson__groups",
"lesson_period__lesson__groups__parent_groups",
"teachers",
"lesson_period__lesson__teachers",
)
)
class SupervisionManager(CurrentSiteManager):
"""Manager adding specific methods to supervisions."""
def get_queryset(self):
"""Ensure all related data is loaded as well."""
return (
super()
.get_queryset()
.select_related(
"teacher",
"area",
"break_item",
"break_item__after_period",
"break_item__before_period",
)
)
class SupervisionSubstitutionManager(CurrentSiteManager):
"""Manager adding specific methods to supervision substitutions."""
def get_queryset(self):
"""Ensure all related data is loaded as well."""
return (
super()
.get_queryset()
.select_related(
"teacher",
"supervision",
"supervision__teacher",
"supervision__area",
"supervision__break_item",
"supervision__break_item__after_period",
"supervision__break_item__before_period",
)
)
class EventManager(CurrentSiteManager):
"""Manager adding specific methods to events."""
def get_queryset(self):
"""Ensure all related data is loaded as well."""
return (
super()
.get_queryset()
.select_related("period_from", "period_to")
.prefetch_related(
"groups",
"groups__school_term",
"groups__parent_groups",
"teachers",
"rooms",
)
)
class ExtraLessonManager(CurrentSiteManager):
"""Manager adding specific methods to extra lessons."""
def get_queryset(self):
"""Ensure all related data is loaded as well."""
return (
super()
.get_queryset()
.select_related("room", "period", "subject")
.prefetch_related(
"groups", "groups__school_term", "groups__parent_groups", "teachers",
)
.prefetch_related("lesson_period__lesson__groups", "teachers")
)
......
......@@ -5,6 +5,7 @@ from __future__ import annotations
from datetime import date, datetime, time, timedelta
from typing import Dict, List, Optional, Tuple, Union
from cache_memoize import cache_memoize
from django.core.exceptions import ValidationError
from django.db import models
from django.db.models import Max, Min, Q
......@@ -33,7 +34,7 @@ from aleksis.apps.chronos.managers import (
LessonSubstitutionQuerySet,
SupervisionQuerySet,
TeacherPropertiesMixin,
ValidityRangeQuerySet,
ValidityRangeQuerySet, SupervisionManager, SupervisionSubstitutionManager, EventManager, ExtraLessonManager,
)
from aleksis.apps.chronos.mixins import (
ValidityRangeRelatedExtensibleModel,
......@@ -68,6 +69,7 @@ class ValidityRange(ExtensibleModel):
date_end = models.DateField(verbose_name=_("End date"))
@classmethod
@cache_memoize(3600)
def get_current(cls, day: Optional[date] = None):
if not day:
day = timezone.now().date()
......@@ -206,6 +208,7 @@ class TimePeriod(ValidityRangeRelatedExtensibleModel):
return url_prev, url_next
@classproperty
@cache_memoize(3600)
def period_min(cls) -> int:
return (
......@@ -215,6 +218,7 @@ class TimePeriod(ValidityRangeRelatedExtensibleModel):
)
@classproperty
@cache_memoize(3600)
def period_max(cls) -> int:
return (
cls.objects.for_current_or_all()
......@@ -223,6 +227,7 @@ class TimePeriod(ValidityRangeRelatedExtensibleModel):
)
@classproperty
@cache_memoize(3600)
def time_min(cls) -> Optional[time]:
return (
cls.objects.for_current_or_all()
......@@ -231,6 +236,7 @@ class TimePeriod(ValidityRangeRelatedExtensibleModel):
)
@classproperty
@cache_memoize(3600)
def time_max(cls) -> Optional[time]:
return (
cls.objects.for_current_or_all()
......@@ -239,6 +245,7 @@ class TimePeriod(ValidityRangeRelatedExtensibleModel):
)
@classproperty
@cache_memoize(3600)
def weekday_min(cls) -> int:
return (
cls.objects.for_current_or_all()
......@@ -247,6 +254,7 @@ class TimePeriod(ValidityRangeRelatedExtensibleModel):
)
@classproperty
@cache_memoize(3600)
def weekday_max(cls) -> int:
return (
cls.objects.for_current_or_all()
......@@ -255,6 +263,7 @@ class TimePeriod(ValidityRangeRelatedExtensibleModel):
)
@classproperty
@cache_memoize(3600)
def period_choices(cls) -> List[Tuple[Union[str, int], str]]:
"""Build choice list of periods for usage within Django."""
time_periods = (
......@@ -812,7 +821,7 @@ class Break(ValidityRangeRelatedExtensibleModel):
class Supervision(ValidityRangeRelatedExtensibleModel, WeekAnnotationMixin):
objects = CurrentSiteManager.from_queryset(SupervisionQuerySet)()
objects = SupervisionManager.from_queryset(SupervisionQuerySet)()
area = models.ForeignKey(
SupervisionArea,
......@@ -863,6 +872,8 @@ class Supervision(ValidityRangeRelatedExtensibleModel, WeekAnnotationMixin):
class SupervisionSubstitution(ExtensibleModel):
objects = SupervisionSubstitutionManager()
date = models.DateField(verbose_name=_("Date"))
supervision = models.ForeignKey(
Supervision,
......@@ -895,7 +906,7 @@ class Event(
):
label_ = "event"
objects = CurrentSiteManager.from_queryset(EventQuerySet)()
objects = EventManager.from_queryset(EventQuerySet)()
title = models.CharField(
verbose_name=_("Title"), max_length=255, blank=True, null=True
......@@ -963,7 +974,7 @@ class ExtraLesson(
):
label_ = "extra_lesson"
objects = CurrentSiteManager.from_queryset(ExtraLessonQuerySet)()
objects = ExtraLessonManager.from_queryset(ExtraLessonQuerySet)()
week = models.IntegerField(
verbose_name=_("Week"), default=CalendarWeek.current_week
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment