From c7ce2dc709cb937f8fd6465c98bc825fc66d59f8 Mon Sep 17 00:00:00 2001 From: Tom Teichler <tom.teichler@teckids.org> Date: Sun, 29 Sep 2019 13:16:19 +0200 Subject: [PATCH] Add filter. Advances #34. --- biscuit/apps/alsijil/views.py | 87 ++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/biscuit/apps/alsijil/views.py b/biscuit/apps/alsijil/views.py index ec8096f49..fd8b87dfc 100644 --- a/biscuit/apps/alsijil/views.py +++ b/biscuit/apps/alsijil/views.py @@ -128,34 +128,77 @@ def group_week(request: HttpRequest, year: Optional[int] = None, week: Optional[ Q(lesson__groups=group) | Q(lesson__groups__parent_groups=group) ).distinct() - # Aggregate all personal notes for this group and week - persons = Person.objects.filter( - is_active=True + elif teacher: + # Get all lesson periods for the selected teacher + lesson_periods = LessonPeriod.objects.annotate( + has_documentation=Exists(LessonDocumentation.objects.filter( + ~Q(topic__exact=''), + lesson_period=OuterRef('pk'), + week=wanted_week.week + )) ).filter( - Q(member_of=group) | Q(member_of__parent_groups=group) - ).distinct().prefetch_related( - 'personal_notes' - ).annotate( - absences=Count('personal_notes__absent', filter=Q( - personal_notes__lesson_period__in=lesson_periods, - personal_notes__week=wanted_week.week, - personal_notes__absent=True - )), - unexcused=Count('personal_notes__absent', filter=Q( - personal_notes__lesson_period__in=lesson_periods, - personal_notes__week=wanted_week.week, - personal_notes__absent=True, - personal_notes__excused=False - )), - tardiness=Sum('personal_notes__late', filter=Q( - personal_notes__lesson_period__in=lesson_periods, - personal_notes__week=wanted_week.week + lesson__date_start__lte=wanted_week[0] + timedelta(days=1) * (F('period__weekday') - 1), + lesson__date_end__gte=wanted_week[0] + timedelta(days=1) * (F('period__weekday') - 1) + ).select_related( + 'lesson', 'lesson__subject', 'period', 'room' + ).prefetch_related( + 'lesson__groups', 'lesson__teachers', 'substitutions' + ).extra( + select={'_week': wanted_week.week} + ).filter( + Q(lesson__teachers=teachers) + ).distinct() + + elif room: + # Get all lesson periods for the selected teacher + lesson_periods = LessonPeriod.objects.annotate( + has_documentation=Exists(LessonDocumentation.objects.filter( + ~Q(topic__exact=''), + lesson_period=OuterRef('pk'), + week=wanted_week.week )) - ) + ).filter( + lesson__date_start__lte=wanted_week[0] + timedelta(days=1) * (F('period__weekday') - 1), + lesson__date_end__gte=wanted_week[0] + timedelta(days=1) * (F('period__weekday') - 1) + ).select_related( + 'lesson', 'lesson__subject', 'period', 'room' + ).prefetch_related( + 'lesson__groups', 'lesson__teachers', 'substitutions' + ).extra( + select={'_week': wanted_week.week} + ).filter( + Q(room=room) + ).distinct() + else: lesson_periods = None persons = None + # Aggregate all personal notes for this group and week + persons = Person.objects.filter( + is_active=True + ).filter( + Q(member_of=group) | Q(member_of__parent_groups=group) + ).distinct().prefetch_related( + 'personal_notes' + ).annotate( + absences=Count('personal_notes__absent', filter=Q( + personal_notes__lesson_period__in=lesson_periods, + personal_notes__week=wanted_week.week, + personal_notes__absent=True + )), + unexcused=Count('personal_notes__absent', filter=Q( + personal_notes__lesson_period__in=lesson_periods, + personal_notes__week=wanted_week.week, + personal_notes__absent=True, + personal_notes__excused=False + )), + tardiness=Sum('personal_notes__late', filter=Q( + personal_notes__lesson_period__in=lesson_periods, + personal_notes__week=wanted_week.week + )) + ) + # Add a form to filter the view select_form = SelectForm(request.GET or None) -- GitLab