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