diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 7b74944b11716f608edf15958f90f7c5aec4c7ca..3632661e3bf3f616c5a06ba4e830b9cbc8d877f8 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -79,11 +79,7 @@ class SelectForm(forms.Form): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.fields["group"].queryset = ( - Group.objects.for_current_school_term_or_all() - .annotate(lessons_count=Count("lessons")) - .filter(lessons_count__gt=0) - ) + self.fields["group"].queryset = Group.get_groups_with_lessons() PersonalNoteFormSet = forms.modelformset_factory( diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index 0fbfd957568f8a3850642362a0ca755a94e59bbe..847d815c72f1893bbf3a269cff4f273da984c327 100644 --- a/aleksis/apps/alsijil/model_extensions.py +++ b/aleksis/apps/alsijil/model_extensions.py @@ -1,7 +1,8 @@ from datetime import date from typing import Dict, Optional, Union -from django.db.models import Exists, OuterRef, QuerySet +from django.db.models import Exists, OuterRef, Q, QuerySet +from django.db.models.aggregates import Count import reversion from calendarweek import CalendarWeek @@ -204,3 +205,28 @@ def get_extra_marks( stats[extra_mark] = qs return stats + + +@Group.class_method +def get_groups_with_lessons(cls: Group): + """Get all groups which have related lessons or child groups with related lessons.""" + group_pks = ( + cls.objects.for_current_school_term_or_all() + .annotate(lessons_count=Count("lessons")) + .filter(lessons_count__gt=0) + .values_list("pk", flat=True) + ) + groups = cls.objects.filter( + Q(child_groups__pk__in=group_pks) | Q(pk__in=group_pks) + ).distinct() + + return groups + + +@Person.method +def get_owner_groups_with_lessons(self: Person): + """Get all groups the person is an owner of and which have related lessons. + + Groups which have child groups with related lessons are also included. + """ + return Group.get_groups_with_lessons().filter(owners=self) diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index b6b76985ecfc6a9cfc4495e8950a721058751dda..0919d0ed4856c947882f5e84d24767bc687cd875 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -463,11 +463,7 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: def my_students(request: HttpRequest) -> HttpResponse: context = {} - relevant_groups = ( - Group.objects.for_current_school_term_or_all() - .annotate(lessons_count=Count("lessons")) - .filter(lessons_count__gt=0, owners=request.user.person) - ) + relevant_groups = request.user.person.get_owner_groups_with_lessons() persons = Person.objects.filter(member_of__in=relevant_groups) context["persons"] = persons return render(request, "alsijil/class_register/persons.html", context) @@ -475,12 +471,7 @@ def my_students(request: HttpRequest) -> HttpResponse: def my_groups(request: HttpRequest) -> HttpResponse: context = {} - groups = ( - Group.objects.for_current_school_term_or_all() - .annotate(lessons_count=Count("lessons")) - .filter(lessons_count__gt=0, owners=request.user.person) - ) - context["groups"] = groups + context["groups"] = request.user.person.get_owner_groups_with_lessons() return render(request, "alsijil/class_register/groups.html", context)