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

Rewrite all queries as union

parent 5c2024ee
No related branches found
No related tags found
1 merge request!381Optimize get objects
Pipeline #193558 passed
......@@ -30,10 +30,12 @@ class LessonEventQuerySet(RecurrencePolymorphicQuerySet):
"""Get all lesson events for a certain person as teacher (including amends)."""
from .models import LessonEvent
amended = LessonEvent.objects.filter(
amended_by__isnull=False, teachers=teacher
).values_list("amended_by__pk", flat=True)
return Q(teachers=teacher) | Q(pk__in=amended)
amended = (
LessonEvent.objects.filter(amended_by__isnull=False, teachers=teacher)
.values_list("amended_by__pk", flat=True)
.union(LessonEvent.objects.filter(teachers=teacher).values_list("pk", flat=True))
)
return Q(pk__in=amended)
def for_teacher(self, teacher: Union[int, Person]) -> "LessonEventQuerySet":
"""Get all lesson events for a certain person as teacher (including amends)."""
......@@ -44,10 +46,12 @@ class LessonEventQuerySet(RecurrencePolymorphicQuerySet):
"""Get all lesson events the person participates in (including amends)."""
from .models import LessonEvent
amended = LessonEvent.objects.filter(
amended_by__isnull=False, groups__members=person
).values_list("amended_by__pk", flat=True)
return Q(groups__members=person) | Q(pk__in=amended)
amended = (
LessonEvent.objects.filter(amended_by__isnull=False, groups__members=person)
.values_list("amended_by__pk", flat=True)
.union(LessonEvent.objects.filter(groups__members=person).values_list("pk", flat=True))
)
return Q(pk__in=amended)
def for_participant(self, person: Union[int, Person]) -> "LessonEventQuerySet":
"""Get all lesson events the person participates in (including amends)."""
......@@ -58,10 +62,20 @@ class LessonEventQuerySet(RecurrencePolymorphicQuerySet):
"""Get all lesson events for a certain group (including amends/as parent group)."""
from .models import LessonEvent
amended = LessonEvent.objects.filter(
Q(amended_by__isnull=False) & (Q(groups=group) | Q(groups__parent_groups=group))
).values_list("amended_by__pk", flat=True)
return Q(groups=group) | Q(groups__parent_groups=group) | Q(pk__in=amended)
amended = (
LessonEvent.objects.filter(amended_by__isnull=False, groups=group)
.values_list("amended_by__pk", flat=True)
.union(
LessonEvent.objects.filter(
amended_by__isnull=False, groups__parent_groups=group
).values_list("amended_by__pk", flat=True)
)
.union(LessonEvent.objects.filter(groups=group).values_list("pk", flat=True))
.union(
LessonEvent.objects.filter(groups__parent_groups=group).values_list("pk", flat=True)
)
)
return Q(pk__in=amended)
def for_group(self, group: Union[int, Group]) -> "LessonEventQuerySet":
"""Get all lesson events for a certain group (including amends/as parent group)."""
......@@ -72,10 +86,12 @@ class LessonEventQuerySet(RecurrencePolymorphicQuerySet):
"""Get all lesson events for a certain room (including amends)."""
from .models import LessonEvent
amended = LessonEvent.objects.filter(
Q(amended_by__isnull=False) & (Q(rooms=room))
).values_list("amended_by__pk", flat=True)
return Q(rooms=room) | Q(pk__in=amended)
amended = (
LessonEvent.objects.filter(amended_by__isnull=False, rooms=room)
.values_list("amended_by__pk", flat=True)
.union(LessonEvent.objects.filter(rooms=room).values_list("pk", flat=True))
)
return Q(pk__in=amended)
def for_room(self, room: Union[int, Room]) -> "LessonEventQuerySet":
"""Get all lesson events for a certain room (including amends)."""
......@@ -86,10 +102,12 @@ class LessonEventQuerySet(RecurrencePolymorphicQuerySet):
"""Get all lesson events for a certain course (including amends)."""
from .models import LessonEvent
amended = LessonEvent.objects.filter(amended_by__isnull=False, course=course).values_list(
"amended_by__pk", flat=True
amended = (
LessonEvent.objects.filter(amended_by__isnull=False, course=course)
.values_list("amended_by__pk", flat=True)
.union(LessonEvent.objects.filter(course=course).values_list("pk", flat=True))
)
return Q(course=course) | Q(pk__in=amended)
return Q(pk__in=amended)
def for_course(self, course: Union[int, Course]) -> "LessonEventQuerySet":
"""Get all lesson events for a certain course (including amends)."""
......@@ -101,15 +119,12 @@ class LessonEventQuerySet(RecurrencePolymorphicQuerySet):
from .models import LessonEvent
amended = (
LessonEvent.objects.filter(
Q(amended_by__isnull=False) & Q(teachers=person)
)
LessonEvent.objects.filter(amended_by__isnull=False, teachers=person)
.values_list("amended_by__pk", flat=True)
.union(
LessonEvent.objects.filter(
Q(amended_by__isnull=False) & Q(groups__members=person)
)
.values_list("amended_by__pk", flat=True)
amended_by__isnull=False, groups__members=person
).values_list("amended_by__pk", flat=True)
)
.union(LessonEvent.objects.filter(teachers=person).values_list("pk", flat=True))
.union(LessonEvent.objects.filter(groups__members=person).values_list("pk", flat=True))
......@@ -130,22 +145,34 @@ class LessonEventQuerySet(RecurrencePolymorphicQuerySet):
"""
from .models import LessonEvent
amended = LessonEvent.objects.filter(
Q(amended_by__isnull=False)
& (
Q(teachers=person)
| Q(groups__members=person)
| Q(groups__owners=person)
| Q(groups__parent_groups__owners=person)
amended = (
LessonEvent.objects.filter(amended_by__isnull=False, teachers=person)
.values_list("amended_by__pk", flat=True)
.union(
LessonEvent.objects.filter(
amended_by__isnull=False, groups__members=person
).values_list("amended_by__pk", flat=True)
)
.union(
LessonEvent.objects.filter(
amended_by__isnull=False, groups__owners=person
).values_list("amended_by__pk", flat=True)
)
.union(
LessonEvent.objects.filter(
amended_by__isnull=False, groups__parent_groups__owners=person
).values_list("amended_by__pk", flat=True)
)
.union(LessonEvent.objects.filter(teachers=person).values_list("pk", flat=True))
.union(LessonEvent.objects.filter(groups__members=person).values_list("pk", flat=True))
.union(LessonEvent.objects.filter(groups__owners=person).values_list("pk", flat=True))
.union(
LessonEvent.objects.filter(groups__parent_groups__owners=person).values_list(
"pk", flat=True
)
)
).values_list("amended_by__pk", flat=True)
return (
Q(teachers=person)
| Q(groups__members=person)
| Q(groups__owners=person)
| Q(groups__parent_groups__owners=person)
| Q(pk__in=amended)
)
return Q(pk__in=amended)
def related_to_person(self, person: Union[int, Person]) -> "LessonEventQuerySet":
"""Get all lesson events a certain person is allowed to see.
......
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