diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index 2c5420200e3dd9a6c60ad562e495d198be4a8b39..25b036d58849e9902ff65d29c9aa5fbcfcc0d7ec 100644 --- a/aleksis/apps/alsijil/model_extensions.py +++ b/aleksis/apps/alsijil/model_extensions.py @@ -420,21 +420,34 @@ def generate_person_list_with_class_register_statistics( persons = persons.select_related("primary_group", "primary_group__school_term").order_by( "last_name", "first_name" ) + available_personal_notes = ( + PersonalNote.objects.filter( + Q(event__in=events) + | Q(lesson_period__in=lesson_periods) + | Q(extra_lesson__in=extra_lessons) + ) + .order_by("person__id") + .distinct() + ) + if get_site_preferences()["alsijil__merge_personal_notes_of_parallel_lessons"]: + available_personal_notes = available_personal_notes.distinct( + "year", + "week", + "lesson_period__period__weekday", + "lesson_period__period__period", + "person__last_name", + "person__first_name", + "person__id", + ) persons = persons.annotate( filtered_personal_notes=FilteredRelation( - "personal_notes", - condition=( - Q(personal_notes__event__in=events) - | Q(personal_notes__lesson_period__in=lesson_periods) - | Q(personal_notes__extra_lesson__in=extra_lessons) - ), + "personal_notes", condition=Q(personal_notes__in=available_personal_notes) ) ).annotate( absences_count=Count( "filtered_personal_notes", filter=Q(filtered_personal_notes__absent=True) & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False), - distinct=True, ), excused=Count( "filtered_personal_notes", @@ -443,7 +456,6 @@ def generate_person_list_with_class_register_statistics( filtered_personal_notes__excused=True, ) & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False), - distinct=True, ), excused_without_excuse_type=Count( "filtered_personal_notes", @@ -452,16 +464,16 @@ def generate_person_list_with_class_register_statistics( filtered_personal_notes__excused=True, filtered_personal_notes__excuse_type__isnull=True, ), - distinct=True, ), unexcused=Count( "filtered_personal_notes", filter=Q(filtered_personal_notes__absent=True, filtered_personal_notes__excused=False), - distinct=True, ), tardiness=Sum("filtered_personal_notes__tardiness"), tardiness_count=Count( - "filtered_personal_notes", filter=Q(filtered_personal_notes__tardiness__gt=0), distinct=True + "filtered_personal_notes", + filter=Q(filtered_personal_notes__tardiness__gt=0), + distinct=True, ), ) diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py index 2fd34fa7fc4f802a52ead1d2d0291789be4fb9ce..90c1a79ad8f3835f584e0eda055b3c9a054cb6d9 100644 --- a/aleksis/apps/alsijil/preferences.py +++ b/aleksis/apps/alsijil/preferences.py @@ -120,6 +120,14 @@ class GroupOwnersCanAssignRolesToParents(BooleanPreference): ) +@site_preferences_registry.register +class MergePersonalNotesOfParallelLessons(BooleanPreference): + section = alsijil + name = "merge_personal_notes_of_parallel_lessons" + default = False + verbose_name = _("Merge the personal notes of parallel lessons") + + @person_preferences_registry.register class ShowGroupRolesInWeekView(BooleanPreference): section = alsijil