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

Avoid unnecessary queries to fetch related data

parent f5c2d1a0
No related branches found
No related tags found
1 merge request!360Resolve "Add absence management to course book student dialog"
Pipeline #188562 failed
......@@ -11,7 +11,7 @@ from django.utils.translation import gettext as _
from calendarweek import CalendarWeek
from aleksis.apps.chronos.managers import DateRangeQuerySetMixin
from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations
from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations, PolymorphicBaseManager
if TYPE_CHECKING:
from aleksis.core.models import Group
......@@ -187,3 +187,27 @@ class GroupRoleAssignmentQuerySet(DateRangeQuerySetMixin, QuerySet):
def for_group(self, group: "Group"):
"""Filter all role assignments for a group."""
return self.filter(Q(groups=group) | Q(groups__child_groups=group))
class DocumentationManager(PolymorphicBaseManager):
"""Manager adding specific methods to documentations."""
def get_queryset(self):
"""Ensure often used related data are loaded as well."""
return (
super()
.get_queryset()
.select_related(
"course",
"subject",
)
.prefetch_related("teachers")
)
class ParticipationStatusManager(PolymorphicBaseManager):
"""Manager adding specific methods to participation statuses."""
def get_queryset(self):
"""Ensure often used related data are loaded as well."""
return super().get_queryset().select_related("person", "absence_reason", "base_absence")
......@@ -24,12 +24,14 @@ from aleksis.apps.alsijil.data_checks import (
PersonalNoteOnHolidaysDataCheck,
)
from aleksis.apps.alsijil.managers import (
DocumentationManager,
GroupRoleAssignmentManager,
GroupRoleAssignmentQuerySet,
GroupRoleManager,
GroupRoleQuerySet,
LessonDocumentationManager,
LessonDocumentationQuerySet,
ParticipationStatusManager,
PersonalNoteManager,
PersonalNoteQuerySet,
)
......@@ -460,6 +462,8 @@ class Documentation(CalendarEvent):
# FIXME: DataCheck
objects = DocumentationManager()
course = models.ForeignKey(
Course,
models.PROTECT,
......@@ -727,6 +731,8 @@ class ParticipationStatus(CalendarEvent):
# FIXME: DataChecks
objects = ParticipationStatusManager()
person = models.ForeignKey(
"core.Person", models.CASCADE, related_name="participations", verbose_name=_("Person")
)
......@@ -760,7 +766,7 @@ class ParticipationStatus(CalendarEvent):
)
def __str__(self) -> str:
return f"{self.related_documentation}, {self.person}"
return f"{self.related_documentation.id}, {self.person}"
class Meta:
verbose_name = _("Participation Status")
......
......@@ -78,7 +78,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
# A dummy documentation will not have any participations
if str(root.pk).startswith("DUMMY") or not hasattr(root, "participations"):
return []
return root.participations.all()
return root.participations.select_related("absence_reason", "base_absence").all()
class DocumentationInputType(graphene.InputObjectType):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment