From f24a99fa99bd121206d7b7d6f6a4e76c52ef29cc Mon Sep 17 00:00:00 2001
From: magicfelix <felix@felix-zauberer.de>
Date: Fri, 22 Nov 2024 14:09:26 +0100
Subject: [PATCH] Optimize and drop unnecessary coursebook queries

---
 aleksis/apps/alsijil/models.py          | 18 +++++++-------
 aleksis/apps/alsijil/schema/__init__.py | 31 +++----------------------
 2 files changed, 13 insertions(+), 36 deletions(-)

diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 7d869c497..e628fecb5 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -139,7 +139,6 @@ class Documentation(CalendarEvent):
         events: list,
         incomplete: Optional[bool] = False,
         absences_exist: Optional[bool] = False,
-        request: Optional[HttpRequest] = None,
     ) -> tuple:
         """Get all the documentations for the events.
         Create dummy documentations if none exist.
@@ -149,11 +148,15 @@ class Documentation(CalendarEvent):
         dummies = []
 
         # Prefetch existing documentations to speed things up
-        existing_documentations = Documentation.objects.filter(
-            datetime_start__lte=datetime_end,
-            datetime_end__gte=datetime_start,
-            amends__in=[e["REFERENCE_OBJECT"] for e in events],
-        ).prefetch_related("participations")
+        existing_documentations = (
+            Documentation.objects.filter(
+                datetime_start__lte=datetime_end,
+                datetime_end__gte=datetime_start,
+                amends__in=[e["REFERENCE_OBJECT"] for e in events],
+            )
+            .prefetch_related("participations", "teachers")
+            .select_related("course", "subject")
+        )
 
         for event in events:
             if incomplete and event["STATUS"] == "CANCELLED":
@@ -214,7 +217,6 @@ class Documentation(CalendarEvent):
         start: datetime,
         end: datetime,
         incomplete: Optional[bool] = False,
-        request: Optional[HttpRequest] = None,
     ) -> tuple:
         """Get all the documentations for the person from start to end datetime.
         Create dummy documentations if none exist.
@@ -233,7 +235,7 @@ class Documentation(CalendarEvent):
             with_reference_object=True,
         )
 
-        return Documentation.get_documentations_for_events(start, end, events, incomplete, request)
+        return Documentation.get_documentations_for_events(start, end, events, incomplete)
 
     @classmethod
     def parse_dummy(
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index ed3d21c41..604cda6cd 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -4,7 +4,6 @@ from django.db.models import BooleanField, ExpressionWrapper, Q
 
 import graphene
 import graphene_django_optimizer
-from guardian.shortcuts import get_objects_for_user
 
 from aleksis.apps.chronos.models import LessonEvent
 from aleksis.apps.cursus.models import Course
@@ -54,7 +53,6 @@ from .statistics import StatisticsByPersonType
 
 
 class Query(graphene.ObjectType):
-    documentations = FilterOrderList(DocumentationType)
     documentations_by_course_id = FilterOrderList(
         DocumentationType, course_id=graphene.ID(required=True)
     )
@@ -101,19 +99,6 @@ class Query(graphene.ObjectType):
         group=graphene.ID(required=True),
     )
 
-    @staticmethod
-    def resolve_documentations(root, info, **kwargs):
-        qs = filter_active_school_term(
-            info.context,
-            Documentation.objects.all(),
-            school_term_field="course__groups__school_term",
-        )
-        if not info.context.user.has_perm("alsijil.view_documentation_rule"):
-            return graphene_django_optimizer.query(
-                get_objects_for_user(info.context.user, "alsijil.view_documetation_rule", qs), info
-            )
-        return graphene_django_optimizer.query(qs, info)
-
     def resolve_documentations_by_course_id(root, info, course_id, **kwargs):
         documentations = Documentation.objects.filter(
             pk__in=Documentation.objects.filter(course_id=course_id)
@@ -173,23 +158,15 @@ class Query(graphene.ObjectType):
             )
 
         school_term = get_active_school_term(info.context)
-        q = Q(
-            pk__in=LessonEvent.objects.filter(groups__school_term=school_term)
-            .values_list("id", flat=True)
-            .union(
-                LessonEvent.objects.filter(course__groups__school_term=school_term).values_list(
-                    "id", flat=True
-                )
-            )
-        )
-        qs = LessonEvent.objects.filter(q)
+        date_start = date_start if date_start > school_term.date_start else school_term.date_start
+        date_end = date_end if date_end < school_term.date_end else school_term.date_end
+
         events = LessonEvent.get_single_events(
             datetime.combine(date_start, datetime.min.time()),
             datetime.combine(date_end, datetime.max.time()),
             info.context,
             event_params,
             with_reference_object=True,
-            queryset=qs,
         )
 
         # Lookup or create documentations and return them all.
@@ -199,7 +176,6 @@ class Query(graphene.ObjectType):
             events,
             incomplete,
             absences_exist,
-            info.context,
         )
         return docs + dummies
 
@@ -294,7 +270,6 @@ class Query(graphene.ObjectType):
                 person,
                 start,
                 end,
-                info.context,
             )
 
             lessons_for_person.append(LessonsForPersonType(id=person, lessons=docs + dummies))
-- 
GitLab