diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index 63096efa56ad136538bd5cd197c011eb00687edb..24a8ebcac5e6602f805335196641e53c86c0c8c3 100644 --- a/aleksis/apps/alsijil/model_extensions.py +++ b/aleksis/apps/alsijil/model_extensions.py @@ -1,5 +1,5 @@ from datetime import date -from typing import Dict, Optional, Union +from typing import Dict, Optional, Union, Iterator from django.db.models import Exists, OuterRef, QuerySet from django.utils.translation import gettext as _ @@ -186,11 +186,12 @@ def get_or_create_lesson_documentation( @LessonPeriod.method -def get_absences(self, week: Optional[CalendarWeek] = None) -> QuerySet: +def get_absences(self, week: Optional[CalendarWeek] = None) -> Iterator: """Get all personal notes of absent persons for this lesson.""" if not week: week = self.week - return self.personal_notes.filter(week=week.week, year=week.year, absent=True) + + return filter(lambda p: p.week == week.week and p.year == week.year and p.absent, self.personal_notes.all()) @LessonPeriod.method @@ -230,7 +231,7 @@ def get_extra_marks( week = self.week stats = {} - for extra_mark in ExtraMark.objects.all(): + for extra_mark in ExtraMark.all: qs = self.personal_notes.filter( week=week.week, year=week.year, extra_marks=extra_mark ) diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index e64bac1afd260f3571c17bfa6b2c639c03d5b915..fe9d60e42e882fe418be6f263a3bc01e25663308 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -1,4 +1,6 @@ +from cache_memoize import cache_memoize from django.db import models +from django.utils.decorators import classproperty from django.utils.formats import date_format from django.utils.translation import gettext_lazy as _ @@ -207,6 +209,11 @@ class ExtraMark(ExtensibleModel): def count_label(self): return f"{self.short_name}_count" + @classproperty + @cache_memoize(3600) + def all(cls): + return cls.objects.all() + class Meta: ordering = ["short_name"] verbose_name = _("Extra mark")