From dd2685c667f4ad24f458c6f1897eee37b2f1f392 Mon Sep 17 00:00:00 2001
From: magicfelix <felix@felix-zauberer.de>
Date: Tue, 19 Nov 2024 15:44:00 +0100
Subject: [PATCH] Use graphene-django-optimizer and drop get_queryset usage

---
 aleksis/apps/alsijil/managers.py             | 12 ----
 aleksis/apps/alsijil/schema/__init__.py      | 70 ++++++++++++++------
 aleksis/apps/alsijil/schema/documentation.py |  9 +--
 aleksis/apps/alsijil/schema/extra_marks.py   |  6 --
 4 files changed, 52 insertions(+), 45 deletions(-)

diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py
index 983a29b8d..b8d17a7aa 100644
--- a/aleksis/apps/alsijil/managers.py
+++ b/aleksis/apps/alsijil/managers.py
@@ -72,18 +72,6 @@ class GroupRoleAssignmentQuerySet(QuerySet):
 class DocumentationManager(RecurrencePolymorphicManager):
     """Manager adding specific methods to documentations."""
 
-    def get_queryset(self):
-        """Ensure often used related data are loaded as well."""
-        return (
-            super()
-            .get_queryset()
-            .select_related(
-                "course",
-                "subject",
-            )
-            .prefetch_related("teachers")
-        )
-
 
 class ParticipationStatusManager(RecurrencePolymorphicManager):
     """Manager adding specific methods to participation statuses."""
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index 8f6bc40c8..ed3d21c41 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -3,6 +3,8 @@ from datetime import datetime
 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
@@ -21,7 +23,7 @@ from aleksis.core.util.core_helpers import (
 )
 
 from ..model_extensions import annotate_person_statistics_for_school_term
-from ..models import Documentation, NewPersonalNote, ParticipationStatus
+from ..models import Documentation, ExtraMark, NewPersonalNote, ParticipationStatus
 from .absences import (
     AbsencesForPersonsCreateMutation,
 )
@@ -99,6 +101,19 @@ 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)
@@ -109,7 +124,7 @@ class Query(graphene.ObjectType):
                 )
             )
         )
-        return documentations
+        return graphene_django_optimizer.query(documentations, info)
 
     def resolve_documentations_for_coursebook(
         root,
@@ -286,6 +301,12 @@ class Query(graphene.ObjectType):
 
         return lessons_for_person
 
+    @staticmethod
+    def resolve_extra_marks(root, info, **kwargs):
+        if info.context.user.has_perm("alsijil.fetch_extramarks_rule"):
+            return ExtraMark.objects.all()
+        raise []
+
     @staticmethod
     def resolve_coursebook_absence_reasons(root, info, **kwargs):
         if not info.context.user.has_perm("kolego.fetch_absencereasons_rule"):
@@ -298,9 +319,12 @@ class Query(graphene.ObjectType):
         if not info.context.user.has_perm("alsijil.view_person_statistics_rule", person):
             return None
         school_term = get_active_school_term(info.context)
-        return annotate_person_statistics_for_school_term(
-            Person.objects.filter(id=person.id), school_term
-        ).first()
+        return graphene_django_optimizer.query(
+            annotate_person_statistics_for_school_term(
+                Person.objects.filter(id=person.id), school_term
+            ).first(),
+            info,
+        )
 
     @staticmethod
     def resolve_participations_of_person(root, info, person):
@@ -308,12 +332,15 @@ class Query(graphene.ObjectType):
         if not info.context.user.has_perm("alsijil.view_person_statistics_rule", person):
             return []
         school_term = get_active_school_term(info.context)
-        return ParticipationStatus.objects.filter(
-            person=person,
-            absence_reason__isnull=False,
-            datetime_start__date__gte=school_term.date_start,
-            datetime_end__date__lte=school_term.date_end,
-        ).order_by("-related_documentation__datetime_start")
+        return graphene_django_optimizer.query(
+            ParticipationStatus.objects.filter(
+                person=person,
+                absence_reason__isnull=False,
+                datetime_start__date__gte=school_term.date_start,
+                datetime_end__date__lte=school_term.date_end,
+            ).order_by("-related_documentation__datetime_start"),
+            info,
+        )
 
     @staticmethod
     def resolve_personal_notes_for_person(root, info, person):
@@ -321,13 +348,16 @@ class Query(graphene.ObjectType):
         if not info.context.user.has_perm("alsijil.view_person_statistics_rule", person):
             return []
         school_term = get_active_school_term(info.context)
-        return NewPersonalNote.objects.filter(
-            person=person,
-            documentation__in=Documentation.objects.filter(
-                datetime_start__date__gte=school_term.date_start,
-                datetime_end__date__lte=school_term.date_end,
-            ),
-        ).order_by("-documentation__datetime_start")
+        return graphene_django_optimizer.query(
+            NewPersonalNote.objects.filter(
+                person=person,
+                documentation__in=Documentation.objects.filter(
+                    datetime_start__date__gte=school_term.date_start,
+                    datetime_end__date__lte=school_term.date_end,
+                ),
+            ).order_by("-documentation__datetime_start"),
+            info,
+        )
 
     @staticmethod
     def resolve_statistics_by_group(root, info, group):
@@ -337,7 +367,9 @@ class Query(graphene.ObjectType):
         school_term = get_active_school_term(info.context)
 
         members = group.members.all()
-        return annotate_person_statistics_for_school_term(members, school_term, group=group)
+        return graphene_django_optimizer.query(
+            annotate_person_statistics_for_school_term(members, school_term, group=group), info
+        )
 
 
 class Mutation(graphene.ObjectType):
diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
index 159ca08f4..b833de336 100644
--- a/aleksis/apps/alsijil/schema/documentation.py
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -20,7 +20,7 @@ from aleksis.core.schema.base import (
     DjangoFilterMixin,
     PermissionsTypeMixin,
 )
-from aleksis.core.util.core_helpers import filter_active_school_term, has_person
+from aleksis.core.util.core_helpers import has_person
 
 from ..models import Documentation
 from .participation_status import ParticipationStatusType
@@ -114,13 +114,6 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
             return []
         return root.participations.all()
 
-    @classmethod
-    def get_queryset(cls, queryset, info):
-        qs = super().get_queryset(queryset, info)
-        return filter_active_school_term(
-            info.context, qs, school_term_field="course__groups__school_term"
-        )
-
 
 class DocumentationInputType(graphene.InputObjectType):
     id = graphene.ID(required=True)
diff --git a/aleksis/apps/alsijil/schema/extra_marks.py b/aleksis/apps/alsijil/schema/extra_marks.py
index 2b1e3723d..be062b7ed 100644
--- a/aleksis/apps/alsijil/schema/extra_marks.py
+++ b/aleksis/apps/alsijil/schema/extra_marks.py
@@ -23,12 +23,6 @@ class ExtraMarkType(
         model = ExtraMark
         fields = ("id", "short_name", "name", "colour_fg", "colour_bg", "show_in_coursebook")
 
-    @classmethod
-    def get_queryset(cls, queryset, info):
-        if info.context.user.has_perm("alsijil.fetch_extramarks_rule"):
-            return queryset
-        raise PermissionDenied()
-
 
 class ExtraMarkBatchCreateMutation(BaseBatchCreateMutation):
     class Meta:
-- 
GitLab