diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py index 6428e293c158ecd37af26b8e3a3625b24011a5a0..aeffad13fb6d1d869a8b6e2793b18f36a9063096 100644 --- a/aleksis/core/util/core_helpers.py +++ b/aleksis/core/util/core_helpers.py @@ -361,6 +361,18 @@ def handle_uploaded_file(f, filename: str): destination.write(chunk) +@cache_memoize(3600) +def get_content_type_by_perm(perm: str) -> Union["ContentType", None]: + from django.contrib.contenttypes.models import ContentType # noqa + + try: + return ContentType.objects.get( + app_label=perm.split(".", 1)[0], permission__codename=perm.split(".", 1)[1] + ) + except ContentType.DoesNotExist: + return None + + @cache_memoize(3600) def queryset_rules_filter( obj: Union[HttpRequest, Model], queryset: QuerySet, perm: str diff --git a/aleksis/core/util/predicates.py b/aleksis/core/util/predicates.py index 46fe98c7379034eb07b3bad2a7c442ab4d9e02b5..d107b425bab206b9a1a0c57d0cb4a4e997a82d34 100644 --- a/aleksis/core/util/predicates.py +++ b/aleksis/core/util/predicates.py @@ -1,6 +1,5 @@ from django.contrib.auth.backends import ModelBackend from django.contrib.auth.models import User -from django.contrib.contenttypes.models import ContentType from django.db.models import Model from django.http import HttpRequest @@ -9,7 +8,7 @@ from guardian.shortcuts import get_objects_for_user from rules import predicate from ..models import Group -from .core_helpers import get_site_preferences +from .core_helpers import get_content_type_by_perm, get_site_preferences from .core_helpers import has_person as has_person_helper from .core_helpers import queryset_rules_filter @@ -65,12 +64,7 @@ def has_any_object(perm: str, klass): @predicate(name) def fn(user: User) -> bool: - try: - ct_perm = ContentType.objects.get( - app_label=perm.split(".", 1)[0], permission__codename=perm.split(".", 1)[1] - ) - except ContentType.DoesNotExist: - ct_perm = None + ct_perm = get_content_type_by_perm(perm) if ct_perm and ct_perm.model_class() == klass: return get_objects_for_user(user, perm, klass).exists() else: