diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 84688f87ac580588b2c02cbdeb84bb00ee154e51..286084df6180dbf0ffa9f32d1cbb0b7ce84cf8cb 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -81,15 +81,7 @@ class SelectForm(forms.Form): person = self.request.user.person - group_pks = ( - Group.objects.for_current_school_term_or_all() - .annotate(lessons_count=Count("lessons")) - .filter(lessons_count__gt=0) - .values_list("pk", flat=True) - ) - group_qs = Group.objects.filter( - Q(child_groups__pk__in=group_pks) | Q(pk__in=group_pks) - ).distinct() + group_qs = Group.get_groups_with_lessons() if not check_global_permission(self.request.user, "alsijil.view_week"): group_qs = ( @@ -164,7 +156,9 @@ class RegisterAbsenceForm(forms.Form): ) ) ) - self.fields["person"].queryset = Person.objects.filter(pk__in=list(persons_qs.values_list("pk", flat=True))) + self.fields["person"].queryset = Person.objects.filter( + pk__in=list(persons_qs.values_list("pk", flat=True)) + ) self.fields["from_period"].choices = period_choices self.fields["to_period"].choices = period_choices diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index a88f042a04af5071e64a0da7ef3ffc7bf399dcc5..d24752f144ca4823d594b8873cc429145d1a7213 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 from django.utils.translation import gettext as _ import reversion @@ -239,3 +240,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/templates/alsijil/absences/register.html b/aleksis/apps/alsijil/templates/alsijil/absences/register.html index b14890e21438a6e452c4fa3e6c595f99d5b856dd..4074c947fb5016b912bdfaf6d793bdf1a1b263b1 100644 --- a/aleksis/apps/alsijil/templates/alsijil/absences/register.html +++ b/aleksis/apps/alsijil/templates/alsijil/absences/register.html @@ -17,7 +17,7 @@ $(document).ready(function () { $("#id_date_start").change(function () { $("#id_date_end").val($("#id_date_start").val()); - $("#id_date_end").change(); + initDatePicker("#id_date_end"); }); }); </script> diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index 99f69d86d040ccbca436e8d5baac149328053624..b4ad6650066431531fda7e55a128f69b53156410 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -476,12 +476,8 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse: @permission_required("alsijil.view_my_students") 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) - ) - persons = Person.objects.filter(member_of__in=relevant_groups).distinct() + 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) @@ -489,12 +485,7 @@ def my_students(request: HttpRequest) -> HttpResponse: @permission_required("alsijil.view_my_groups",) 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)