Skip to content
Snippets Groups Projects
Verified Commit 9a24025b authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Add cached content type getter

parent 060e8cb7
No related branches found
No related tags found
1 merge request!368Add cached content type getter
Pipeline #3769 failed
...@@ -361,6 +361,18 @@ def handle_uploaded_file(f, filename: str): ...@@ -361,6 +361,18 @@ def handle_uploaded_file(f, filename: str):
destination.write(chunk) 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) @cache_memoize(3600)
def queryset_rules_filter( def queryset_rules_filter(
obj: Union[HttpRequest, Model], queryset: QuerySet, perm: str obj: Union[HttpRequest, Model], queryset: QuerySet, perm: str
......
from django.contrib.auth.backends import ModelBackend from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.db.models import Model from django.db.models import Model
from django.http import HttpRequest from django.http import HttpRequest
...@@ -9,7 +8,7 @@ from guardian.shortcuts import get_objects_for_user ...@@ -9,7 +8,7 @@ from guardian.shortcuts import get_objects_for_user
from rules import predicate from rules import predicate
from ..models import Group 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 has_person as has_person_helper
from .core_helpers import queryset_rules_filter from .core_helpers import queryset_rules_filter
...@@ -65,12 +64,7 @@ def has_any_object(perm: str, klass): ...@@ -65,12 +64,7 @@ def has_any_object(perm: str, klass):
@predicate(name) @predicate(name)
def fn(user: User) -> bool: def fn(user: User) -> bool:
try: ct_perm = get_content_type_by_perm(perm)
ct_perm = ContentType.objects.get(
app_label=perm.split(".", 1)[0], permission__codename=perm.split(".", 1)[1]
)
except ContentType.DoesNotExist:
ct_perm = None
if ct_perm and ct_perm.model_class() == klass: if ct_perm and ct_perm.model_class() == klass:
return get_objects_for_user(user, perm, klass).exists() return get_objects_for_user(user, perm, klass).exists()
else: else:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment