From 93c6d3bb60e94b56cf988e609bb1c3a7ada4a4b5 Mon Sep 17 00:00:00 2001
From: Dominik George <nik@naturalnet.de>
Date: Thu, 14 Jan 2021 21:20:16 +0100
Subject: [PATCH] Look up content type amd permissions inside generated
 function
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #126 — module loading must not have side effects, and
generating the predicates calls the database.

Under normal operation, cache_memoize and/or django-cachalot ensure
the database lookup is not done on every permission check.
---
 aleksis/apps/alsijil/util/predicates.py | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py
index 43889191b..95c7825c2 100644
--- a/aleksis/apps/alsijil/util/predicates.py
+++ b/aleksis/apps/alsijil/util/predicates.py
@@ -113,11 +113,10 @@ def has_person_group_object_perm(perm: str):
     """
     name = f"has_person_group_object_perm:{perm}"
 
-    ct = get_content_type_by_perm(perm)
-    permissions = Permission.objects.filter(content_type=ct, codename=perm)
-
     @predicate(name)
     def fn(user: User, obj: Person) -> bool:
+        ct = get_content_type_by_perm(perm)
+        permissions = Permission.objects.filter(content_type=ct, codename=perm)
         groups = obj.member_of.all()
         qs = UserObjectPermission.objects.filter(
             object_pk__in=list(groups.values_list("pk", flat=True)),
@@ -151,13 +150,12 @@ def has_lesson_group_object_perm(perm: str):
     """
     name = f"has_lesson_group_object_perm:{perm}"
 
-    ct = get_content_type_by_perm(perm)
-    permissions = Permission.objects.filter(content_type=ct, codename=perm)
-
     @predicate(name)
     def fn(user: User, obj: LessonPeriod) -> bool:
         if hasattr(obj, "lesson"):
             groups = obj.lesson.groups.all()
+            ct = get_content_type_by_perm(perm)
+            permissions = Permission.objects.filter(content_type=ct, codename=perm)
             qs = UserObjectPermission.objects.filter(
                 object_pk__in=list(groups.values_list("pk", flat=True)),
                 content_type=ct,
@@ -177,12 +175,11 @@ def has_personal_note_group_perm(perm: str):
     """
     name = f"has_personal_note_person_or_group_perm:{perm}"
 
-    ct = get_content_type_by_perm(perm)
-    permissions = Permission.objects.filter(content_type=ct, codename=perm)
-
     @predicate(name)
     def fn(user: User, obj: PersonalNote) -> bool:
         if hasattr(obj, "person"):
+            ct = get_content_type_by_perm(perm)
+            permissions = Permission.objects.filter(content_type=ct, codename=perm)
             groups = obj.person.member_of.all()
             qs = UserObjectPermission.objects.filter(
                 object_pk__in=list(groups.values_list("pk", flat=True)),
-- 
GitLab