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 _ ...@@ -11,7 +11,7 @@ from django.utils.translation import gettext as _
from calendarweek import CalendarWeek from calendarweek import CalendarWeek
from aleksis.apps.chronos.managers import DateRangeQuerySetMixin from aleksis.apps.chronos.managers import DateRangeQuerySetMixin
from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations from aleksis.core.managers import AlekSISBaseManagerWithoutMigrations, PolymorphicBaseManager
if TYPE_CHECKING: if TYPE_CHECKING:
from aleksis.core.models import Group from aleksis.core.models import Group
...@@ -187,3 +187,27 @@ class GroupRoleAssignmentQuerySet(DateRangeQuerySetMixin, QuerySet): ...@@ -187,3 +187,27 @@ class GroupRoleAssignmentQuerySet(DateRangeQuerySetMixin, QuerySet):
def for_group(self, group: "Group"): def for_group(self, group: "Group"):
"""Filter all role assignments for a group.""" """Filter all role assignments for a group."""
return self.filter(Q(groups=group) | Q(groups__child_groups=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 ( ...@@ -24,12 +24,14 @@ from aleksis.apps.alsijil.data_checks import (
PersonalNoteOnHolidaysDataCheck, PersonalNoteOnHolidaysDataCheck,
) )
from aleksis.apps.alsijil.managers import ( from aleksis.apps.alsijil.managers import (
DocumentationManager,
GroupRoleAssignmentManager, GroupRoleAssignmentManager,
GroupRoleAssignmentQuerySet, GroupRoleAssignmentQuerySet,
GroupRoleManager, GroupRoleManager,
GroupRoleQuerySet, GroupRoleQuerySet,
LessonDocumentationManager, LessonDocumentationManager,
LessonDocumentationQuerySet, LessonDocumentationQuerySet,
ParticipationStatusManager,
PersonalNoteManager, PersonalNoteManager,
PersonalNoteQuerySet, PersonalNoteQuerySet,
) )
...@@ -460,6 +462,8 @@ class Documentation(CalendarEvent): ...@@ -460,6 +462,8 @@ class Documentation(CalendarEvent):
# FIXME: DataCheck # FIXME: DataCheck
objects = DocumentationManager()
course = models.ForeignKey( course = models.ForeignKey(
Course, Course,
models.PROTECT, models.PROTECT,
...@@ -727,6 +731,8 @@ class ParticipationStatus(CalendarEvent): ...@@ -727,6 +731,8 @@ class ParticipationStatus(CalendarEvent):
# FIXME: DataChecks # FIXME: DataChecks
objects = ParticipationStatusManager()
person = models.ForeignKey( person = models.ForeignKey(
"core.Person", models.CASCADE, related_name="participations", verbose_name=_("Person") "core.Person", models.CASCADE, related_name="participations", verbose_name=_("Person")
) )
...@@ -760,7 +766,7 @@ class ParticipationStatus(CalendarEvent): ...@@ -760,7 +766,7 @@ class ParticipationStatus(CalendarEvent):
) )
def __str__(self) -> str: def __str__(self) -> str:
return f"{self.related_documentation}, {self.person}" return f"{self.related_documentation.id}, {self.person}"
class Meta: class Meta:
verbose_name = _("Participation Status") verbose_name = _("Participation Status")
......
...@@ -78,7 +78,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp ...@@ -78,7 +78,7 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
# A dummy documentation will not have any participations # A dummy documentation will not have any participations
if str(root.pk).startswith("DUMMY") or not hasattr(root, "participations"): if str(root.pk).startswith("DUMMY") or not hasattr(root, "participations"):
return [] return []
return root.participations.all() return root.participations.select_related("absence_reason", "base_absence").all()
class DocumentationInputType(graphene.InputObjectType): class DocumentationInputType(graphene.InputObjectType):
......
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