From dd2685c667f4ad24f458c6f1897eee37b2f1f392 Mon Sep 17 00:00:00 2001 From: magicfelix <felix@felix-zauberer.de> Date: Tue, 19 Nov 2024 15:44:00 +0100 Subject: [PATCH] Use graphene-django-optimizer and drop get_queryset usage --- aleksis/apps/alsijil/managers.py | 12 ---- aleksis/apps/alsijil/schema/__init__.py | 70 ++++++++++++++------ aleksis/apps/alsijil/schema/documentation.py | 9 +-- aleksis/apps/alsijil/schema/extra_marks.py | 6 -- 4 files changed, 52 insertions(+), 45 deletions(-) diff --git a/aleksis/apps/alsijil/managers.py b/aleksis/apps/alsijil/managers.py index 983a29b8d..b8d17a7aa 100644 --- a/aleksis/apps/alsijil/managers.py +++ b/aleksis/apps/alsijil/managers.py @@ -72,18 +72,6 @@ class GroupRoleAssignmentQuerySet(QuerySet): class DocumentationManager(RecurrencePolymorphicManager): """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(RecurrencePolymorphicManager): """Manager adding specific methods to participation statuses.""" diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py index 8f6bc40c8..ed3d21c41 100644 --- a/aleksis/apps/alsijil/schema/__init__.py +++ b/aleksis/apps/alsijil/schema/__init__.py @@ -3,6 +3,8 @@ from datetime import datetime from django.db.models import BooleanField, ExpressionWrapper, Q import graphene +import graphene_django_optimizer +from guardian.shortcuts import get_objects_for_user from aleksis.apps.chronos.models import LessonEvent from aleksis.apps.cursus.models import Course @@ -21,7 +23,7 @@ from aleksis.core.util.core_helpers import ( ) from ..model_extensions import annotate_person_statistics_for_school_term -from ..models import Documentation, NewPersonalNote, ParticipationStatus +from ..models import Documentation, ExtraMark, NewPersonalNote, ParticipationStatus from .absences import ( AbsencesForPersonsCreateMutation, ) @@ -99,6 +101,19 @@ class Query(graphene.ObjectType): group=graphene.ID(required=True), ) + @staticmethod + def resolve_documentations(root, info, **kwargs): + qs = filter_active_school_term( + info.context, + Documentation.objects.all(), + school_term_field="course__groups__school_term", + ) + if not info.context.user.has_perm("alsijil.view_documentation_rule"): + return graphene_django_optimizer.query( + get_objects_for_user(info.context.user, "alsijil.view_documetation_rule", qs), info + ) + return graphene_django_optimizer.query(qs, info) + def resolve_documentations_by_course_id(root, info, course_id, **kwargs): documentations = Documentation.objects.filter( pk__in=Documentation.objects.filter(course_id=course_id) @@ -109,7 +124,7 @@ class Query(graphene.ObjectType): ) ) ) - return documentations + return graphene_django_optimizer.query(documentations, info) def resolve_documentations_for_coursebook( root, @@ -286,6 +301,12 @@ class Query(graphene.ObjectType): return lessons_for_person + @staticmethod + def resolve_extra_marks(root, info, **kwargs): + if info.context.user.has_perm("alsijil.fetch_extramarks_rule"): + return ExtraMark.objects.all() + raise [] + @staticmethod def resolve_coursebook_absence_reasons(root, info, **kwargs): if not info.context.user.has_perm("kolego.fetch_absencereasons_rule"): @@ -298,9 +319,12 @@ class Query(graphene.ObjectType): if not info.context.user.has_perm("alsijil.view_person_statistics_rule", person): return None school_term = get_active_school_term(info.context) - return annotate_person_statistics_for_school_term( - Person.objects.filter(id=person.id), school_term - ).first() + return graphene_django_optimizer.query( + annotate_person_statistics_for_school_term( + Person.objects.filter(id=person.id), school_term + ).first(), + info, + ) @staticmethod def resolve_participations_of_person(root, info, person): @@ -308,12 +332,15 @@ class Query(graphene.ObjectType): if not info.context.user.has_perm("alsijil.view_person_statistics_rule", person): return [] school_term = get_active_school_term(info.context) - return ParticipationStatus.objects.filter( - person=person, - absence_reason__isnull=False, - datetime_start__date__gte=school_term.date_start, - datetime_end__date__lte=school_term.date_end, - ).order_by("-related_documentation__datetime_start") + return graphene_django_optimizer.query( + ParticipationStatus.objects.filter( + person=person, + absence_reason__isnull=False, + datetime_start__date__gte=school_term.date_start, + datetime_end__date__lte=school_term.date_end, + ).order_by("-related_documentation__datetime_start"), + info, + ) @staticmethod def resolve_personal_notes_for_person(root, info, person): @@ -321,13 +348,16 @@ class Query(graphene.ObjectType): if not info.context.user.has_perm("alsijil.view_person_statistics_rule", person): return [] school_term = get_active_school_term(info.context) - return NewPersonalNote.objects.filter( - person=person, - documentation__in=Documentation.objects.filter( - datetime_start__date__gte=school_term.date_start, - datetime_end__date__lte=school_term.date_end, - ), - ).order_by("-documentation__datetime_start") + return graphene_django_optimizer.query( + NewPersonalNote.objects.filter( + person=person, + documentation__in=Documentation.objects.filter( + datetime_start__date__gte=school_term.date_start, + datetime_end__date__lte=school_term.date_end, + ), + ).order_by("-documentation__datetime_start"), + info, + ) @staticmethod def resolve_statistics_by_group(root, info, group): @@ -337,7 +367,9 @@ class Query(graphene.ObjectType): school_term = get_active_school_term(info.context) members = group.members.all() - return annotate_person_statistics_for_school_term(members, school_term, group=group) + return graphene_django_optimizer.query( + annotate_person_statistics_for_school_term(members, school_term, group=group), info + ) class Mutation(graphene.ObjectType): diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py index 159ca08f4..b833de336 100644 --- a/aleksis/apps/alsijil/schema/documentation.py +++ b/aleksis/apps/alsijil/schema/documentation.py @@ -20,7 +20,7 @@ from aleksis.core.schema.base import ( DjangoFilterMixin, PermissionsTypeMixin, ) -from aleksis.core.util.core_helpers import filter_active_school_term, has_person +from aleksis.core.util.core_helpers import has_person from ..models import Documentation from .participation_status import ParticipationStatusType @@ -114,13 +114,6 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp return [] return root.participations.all() - @classmethod - def get_queryset(cls, queryset, info): - qs = super().get_queryset(queryset, info) - return filter_active_school_term( - info.context, qs, school_term_field="course__groups__school_term" - ) - class DocumentationInputType(graphene.InputObjectType): id = graphene.ID(required=True) diff --git a/aleksis/apps/alsijil/schema/extra_marks.py b/aleksis/apps/alsijil/schema/extra_marks.py index 2b1e3723d..be062b7ed 100644 --- a/aleksis/apps/alsijil/schema/extra_marks.py +++ b/aleksis/apps/alsijil/schema/extra_marks.py @@ -23,12 +23,6 @@ class ExtraMarkType( model = ExtraMark fields = ("id", "short_name", "name", "colour_fg", "colour_bg", "show_in_coursebook") - @classmethod - def get_queryset(cls, queryset, info): - if info.context.user.has_perm("alsijil.fetch_extramarks_rule"): - return queryset - raise PermissionDenied() - class ExtraMarkBatchCreateMutation(BaseBatchCreateMutation): class Meta: -- GitLab