From 5795aa01a00dff8759dbd0f5b00834b26a5abf89 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Mon, 7 Sep 2020 14:23:38 +0200
Subject: [PATCH] Add personal note manager in order to prefetch some data

---
 aleksis/apps/alsijil/managers.py | 23 +++++++++++++++++++++++
 aleksis/apps/alsijil/models.py   |  3 +++
 2 files changed, 26 insertions(+)
 create mode 100644 aleksis/apps/alsijil/managers.py

diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py
new file mode 100644
index 000000000..b2589345a
--- /dev/null
+++ b/aleksis/apps/alsijil/managers.py
@@ -0,0 +1,23 @@
+from aleksis.core.managers import CurrentSiteManagerWithoutMigrations
+
+
+class PersonalNoteManager(CurrentSiteManagerWithoutMigrations):
+    """Manager adding specific methods to personal notes."""
+
+    def get_queryset(self):
+        """Ensure all related lesson and person data are loaded as well."""
+        return (
+            super()
+            .get_queryset()
+            .select_related(
+                "person",
+                "excuse_type",
+                "lesson_period",
+                "lesson_period__lesson",
+                "lesson_period__lesson__subject",
+                "lesson_period__period",
+                "lesson_period__lesson__validity",
+                "lesson_period__lesson__validity__school_term",
+            )
+            .prefetch_related("extra_marks")
+        )
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 66f6477d2..e64bac1af 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _
 
 from calendarweek import CalendarWeek
 
+from aleksis.apps.alsijil.managers import PersonalNoteManager
 from aleksis.apps.chronos.mixins import WeekRelatedMixin
 from aleksis.apps.chronos.models import LessonPeriod
 from aleksis.apps.chronos.util.date import get_current_year
@@ -46,6 +47,8 @@ class PersonalNote(ExtensibleModel, WeekRelatedMixin):
     and remarks about a student in a single lesson period.
     """
 
+    objects = PersonalNoteManager()
+
     person = models.ForeignKey(
         "core.Person", models.CASCADE, related_name="personal_notes"
     )
-- 
GitLab