From 9e3c3f3832be920d882138d551f780692f542944 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 25 Apr 2021 12:48:39 +0200
Subject: [PATCH] Prefetch object permissions in my_students

---
 aleksis/apps/alsijil/views.py | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index 76608cda4..d41415660 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -711,12 +711,26 @@ def my_students(request: HttpRequest) -> HttpResponse:
         .distinct()
     )
 
+    # Prefetch object permissions for persons and groups the persons are members of
+    # because the object permissions are checked for both persons and groups
+    all_persons = Person.objects.filter(member_of__in=relevant_groups)
+    checker = ObjectPermissionChecker(request.user)
+    checker.prefetch_perms(relevant_groups)
+    checker.prefetch_perms(all_persons)
+
     new_groups = []
     for group in relevant_groups:
         persons = group.generate_person_list_with_class_register_statistics(
-            group.members.prefetch_related("primary_group__owners")
+            group.members.prefetch_related(
+                "primary_group__owners",
+                Prefetch("member_of", queryset=relevant_groups, to_attr="member_of_prefetched"),
+            )
         )
-        new_groups.append((group, persons))
+        persons_for_group = []
+        for person in persons:
+            person.set_object_permission_checker(checker)
+            persons_for_group.append(person)
+        new_groups.append((group, persons_for_group))
 
     context["groups"] = new_groups
     context["excuse_types"] = ExcuseType.objects.all()
-- 
GitLab