diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index d681e04addb79970530528058a82a4934d6d8f0f..4d2487e0ccf091c07040084401e442dcd7684b30 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -154,7 +154,9 @@ class Documentation(CalendarEvent): datetime_end__gte=datetime_start, amends__in=[e["REFERENCE_OBJECT"] for e in events], ) - .prefetch_related("participations", "teachers") + .prefetch_related( + "participations", "teachers", "personal_notes", "personal_notes__extra_mark" + ) .select_related("course", "subject") ) diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py index fe45b7fb248a59da62a95e07063e19732626dc91..93e844c5642eed9e987f32366dfb2f02e69d6346 100644 --- a/aleksis/apps/alsijil/schema/documentation.py +++ b/aleksis/apps/alsijil/schema/documentation.py @@ -117,6 +117,11 @@ class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp p for p in root.participations.all() if p.person == info.context.user.person ] return [] + + # Annotate participations with prefetched documentation data for personal notes + for participation in root.participations.all(): + participation._prefetched_documentation = root + return root.participations.all() diff --git a/aleksis/apps/alsijil/schema/participation_status.py b/aleksis/apps/alsijil/schema/participation_status.py index 22e5820594994b2d1bb4c81ae4f5a83f615bea0b..bb0e24e0564ab5f87a3fe1a25c85f4d8c5766241 100644 --- a/aleksis/apps/alsijil/schema/participation_status.py +++ b/aleksis/apps/alsijil/schema/participation_status.py @@ -41,6 +41,12 @@ class ParticipationStatusType( @staticmethod def resolve_notes_with_extra_mark(root: ParticipationStatus, info, **kwargs): + if hasattr(root, "_prefetched_documentation"): + return [ + p + for p in root._prefetched_documentation.personal_notes.all() + if p.person_id == root.person_id and p.extra_mark + ] return NewPersonalNote.objects.filter( person=root.person, documentation=root.related_documentation, @@ -49,6 +55,12 @@ class ParticipationStatusType( @staticmethod def resolve_notes_with_note(root: ParticipationStatus, info, **kwargs): + if hasattr(root, "_prefetched_documentation"): + return [ + p + for p in root._prefetched_documentation.personal_notes.all() + if p.person_id == root.person_id and p.note + ] return NewPersonalNote.objects.filter( person=root.person, documentation=root.related_documentation,