From 98984611be323d735c5be0dc2c7a46243a055ac9 Mon Sep 17 00:00:00 2001 From: Dominik George <dominik.george@teckids.org> Date: Wed, 4 Sep 2019 16:32:41 +0200 Subject: [PATCH] Add personal notes to group view. Closes #18. --- .../alsijil/templates/alsijil/group_week.html | 22 ++++++++++++++++--- biscuit/apps/alsijil/views.py | 17 +++++++++++++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/biscuit/apps/alsijil/templates/alsijil/group_week.html b/biscuit/apps/alsijil/templates/alsijil/group_week.html index 959b80b51..ae51de99e 100644 --- a/biscuit/apps/alsijil/templates/alsijil/group_week.html +++ b/biscuit/apps/alsijil/templates/alsijil/group_week.html @@ -60,9 +60,25 @@ <div class="card-header bg-light text-dark"> {% blocktrans %}Personal notes{% endblocktrans %} </div> - <div class="card-body"> - Not implemented yet. - </div> + {% for person in persons %} + <div class="card-body"> + <h5 class="card-title">{{ person.full_name }}</h5> + <p class="card-text"> + {% trans "Absent" %}: {{ person.absences }} + ({{ person.unexcused }} {% trans "unexcused" %}) + </p> + <p class="card-text"> + {% trans "Summed up tardiness" %}: {{ person.tardiness }} + </p> + {% for note in person.personal_notes %} + {% if note.remarks %} + <p class="card-text"> + {{ note.remarks }} + </p> + {% endif %} + {% endfor %} + </div> + {% endfor %} </div> </div> </div> diff --git a/biscuit/apps/alsijil/views.py b/biscuit/apps/alsijil/views.py index cdf9f6b0c..3c4060f10 100644 --- a/biscuit/apps/alsijil/views.py +++ b/biscuit/apps/alsijil/views.py @@ -2,7 +2,7 @@ from collections import OrderedDict from typing import Optional from django.contrib.auth.decorators import login_required -from django.db.models import Exists, OuterRef, Q +from django.db.models import Count, Exists, OuterRef, Q, Sum from django.http import Http404, HttpRequest, HttpResponse from django.shortcuts import render from django.utils.translation import ugettext as _ @@ -101,6 +101,7 @@ def group_week(request: HttpRequest, week: Optional[int] = None) -> HttpResponse if not group: raise Http404(_('You must select a group to see the week summary.')) + # Get all lesson periods for the selected group lesson_periods = LessonPeriod.objects.filter( lesson__date_start__lte=week_start, lesson__date_end__gte=week_end @@ -114,12 +115,26 @@ def group_week(request: HttpRequest, week: Optional[int] = None) -> HttpResponse Q(lesson__groups__pk=int(request.GET['group'])) | Q(lesson__groups__parent_groups__pk=int(request.GET['group'])) ) + # 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) + ).prefetch_related( + 'personal_notes' + ).annotate( + absences=Count('personal_notes__absent', filter=Q(week=wanted_week, absent=True)), + unexcused=Count('personal_notes__absent', filter=Q(week=wanted_week, absent=True, excused=False)), + tardiness=Sum('personal_notes__tardiness', filter=Q(week=wanted_week)) + ) + # Add a form to filter the view select_form = SelectForm(request.GET or None) context['week'] = wanted_week context['group'] = group context['lesson_periods'] = lesson_periods + context['persons'] = persons context['select_form'] = select_form return render(request, 'alsijil/group_week.html', context) -- GitLab