From cbe2050b3c28231fae67340766ab244c317c14e0 Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Thu, 10 Sep 2020 13:37:31 +0200 Subject: [PATCH] Optimize model extensions --- aleksis/apps/alsijil/model_extensions.py | 9 +++++---- aleksis/apps/alsijil/models.py | 7 +++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index 63096efa5..24a8ebcac 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 e64bac1af..fe9d60e42 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") -- GitLab