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

Use get_content_type_by_perm in predicates

parent eb2f42e7
No related branches found
No related tags found
1 merge request!90Performance optimizations
from typing import Union from typing import Union
from django.contrib.auth.models import User, Permission from django.contrib.auth.models import Permission, User
from django.contrib.contenttypes.models import ContentType
from guardian.models import UserObjectPermission
from guardian.models import UserObjectPermission
from guardian.shortcuts import get_objects_for_user from guardian.shortcuts import get_objects_for_user
from rules import predicate from rules import predicate
from aleksis.apps.chronos.models import LessonPeriod from aleksis.apps.chronos.models import LessonPeriod
from aleksis.core.models import Group, Person from aleksis.core.models import Group, Person
from aleksis.core.util.core_helpers import get_site_preferences from aleksis.core.util.core_helpers import get_content_type_by_perm, get_site_preferences
from aleksis.core.util.predicates import check_object_permission
from ..models import PersonalNote from ..models import PersonalNote
...@@ -109,13 +107,18 @@ def has_person_group_object_perm(perm: str): ...@@ -109,13 +107,18 @@ def has_person_group_object_perm(perm: str):
""" """
name = f"has_person_group_object_perm:{perm}" name = f"has_person_group_object_perm:{perm}"
ct = ContentType.objects.get_for_model(Group) ct = get_content_type_by_perm(perm)
permissions = Permission.objects.filter(content_type=ct, codename=perm) permissions = Permission.objects.filter(content_type=ct, codename=perm)
@predicate(name) @predicate(name)
def fn(user: User, obj: Person) -> bool: def fn(user: User, obj: Person) -> bool:
groups = obj.member_of.all() groups = obj.member_of.all()
qs = UserObjectPermission.objects.filter(object_pk__in=list(groups.values_list("pk", flat=True)), content_type=ct, user=user, permission__in=permissions) qs = UserObjectPermission.objects.filter(
object_pk__in=list(groups.values_list("pk", flat=True)),
content_type=ct,
user=user,
permission__in=permissions,
)
return qs.exists() return qs.exists()
return fn return fn
...@@ -142,14 +145,19 @@ def has_lesson_group_object_perm(perm: str): ...@@ -142,14 +145,19 @@ def has_lesson_group_object_perm(perm: str):
""" """
name = f"has_lesson_group_object_perm:{perm}" name = f"has_lesson_group_object_perm:{perm}"
ct = ContentType.objects.get_for_model(Group) ct = get_content_type_by_perm(perm)
permissions = Permission.objects.filter(content_type=ct, codename=perm) permissions = Permission.objects.filter(content_type=ct, codename=perm)
@predicate(name) @predicate(name)
def fn(user: User, obj: LessonPeriod) -> bool: def fn(user: User, obj: LessonPeriod) -> bool:
if hasattr(obj, "lesson"): if hasattr(obj, "lesson"):
groups = obj.lesson.groups.all() groups = obj.lesson.groups.all()
qs = UserObjectPermission.objects.filter(object_pk__in=list(groups.values_list("pk", flat=True)), content_type=ct, user=user, permission__in=permissions) qs = UserObjectPermission.objects.filter(
object_pk__in=list(groups.values_list("pk", flat=True)),
content_type=ct,
user=user,
permission__in=permissions,
)
return qs.exists() return qs.exists()
return False return False
...@@ -163,14 +171,19 @@ def has_personal_note_group_perm(perm: str): ...@@ -163,14 +171,19 @@ def has_personal_note_group_perm(perm: str):
""" """
name = f"has_personal_note_person_or_group_perm:{perm}" name = f"has_personal_note_person_or_group_perm:{perm}"
ct = ContentType.objects.get_for_model(Person) ct = get_content_type_by_perm(perm)
permissions = Permission.objects.filter(content_type=ct, codename=perm) permissions = Permission.objects.filter(content_type=ct, codename=perm)
@predicate(name) @predicate(name)
def fn(user: User, obj: PersonalNote) -> bool: def fn(user: User, obj: PersonalNote) -> bool:
if hasattr(obj, "person"): if hasattr(obj, "person"):
groups = obj.person.member_of.all() groups = obj.person.member_of.all()
qs = UserObjectPermission.objects.filter(object_pk__in=list(groups.values_list("pk", flat=True)), content_type=ct, user=user, permission__in=permissions) qs = UserObjectPermission.objects.filter(
object_pk__in=list(groups.values_list("pk", flat=True)),
content_type=ct,
user=user,
permission__in=permissions,
)
return qs.exists() return qs.exists()
return False return False
......
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