Skip to content
Snippets Groups Projects
Commit 32ef21a6 authored by yuha's avatar yuha
Browse files

Optimize performance of predicates with custom permission queries

parent f56f70a5
No related branches found
No related tags found
1 merge request!90Performance optimizations
Pipeline #3670 passed
...@@ -135,14 +135,16 @@ def has_lesson_group_object_perm(perm: str): ...@@ -135,14 +135,16 @@ 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)
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"):
for group in obj.lesson.groups.all(): groups = obj.lesson.groups.all()
if check_object_permission(user, perm, group): qs = UserObjectPermission.objects.filter(object_pk__in=groups.values_list("pk", flat=True), content_type=ct, user=user, permission__in=permissions)
return True return qs.exists()
return False return False
return True
return fn return fn
...@@ -154,13 +156,16 @@ def has_personal_note_group_perm(perm: str): ...@@ -154,13 +156,16 @@ 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)
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"):
for group in obj.person.member_of.all(): groups = obj.person.member_of.all()
if check_object_permission(user, perm, group): qs = UserObjectPermission.objects.filter(object_pk__in=groups.values_list("pk", flat=True), content_type=ct, user=user, permission__in=permissions)
return True return qs.exists()
return False return False
return fn return fn
...@@ -224,10 +229,10 @@ def has_any_object_absence(user: User) -> bool: ...@@ -224,10 +229,10 @@ def has_any_object_absence(user: User) -> bool:
""" """
Predicate which builds a query with all the persons the given users is allowed to register an absence for. Predicate which builds a query with all the persons the given users is allowed to register an absence for.
""" """
if get_objects_for_user(user, "core.register_absence_person", Person).exists():
return True
if Person.objects.filter(member_of__owners=user.person).exists(): if Person.objects.filter(member_of__owners=user.person).exists():
return True return True
if get_objects_for_user(user, "core.register_absence_person", Person).exists():
return True
if Person.objects.filter( if Person.objects.filter(
member_of__in=get_objects_for_user(user, "core.register_absence_group", Group) member_of__in=get_objects_for_user(user, "core.register_absence_group", Group)
).exists(): ).exists():
......
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