From 393f8a7424a39d8b88a1c0f18130ef3178aeb6b3 Mon Sep 17 00:00:00 2001
From: Dominik George <nik@naturalnet.de>
Date: Sat, 14 Sep 2019 22:29:43 +0200
Subject: [PATCH] Add view for register printing. Advances #26.

---
 biscuit/apps/alsijil/urls.py  |  2 ++
 biscuit/apps/alsijil/views.py | 51 ++++++++++++++++++++++++++++++++++-
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/biscuit/apps/alsijil/urls.py b/biscuit/apps/alsijil/urls.py
index be2a34da2..a87e088bc 100644
--- a/biscuit/apps/alsijil/urls.py
+++ b/biscuit/apps/alsijil/urls.py
@@ -10,4 +10,6 @@ urlpatterns = [
     path('group/week', views.group_week, name='group_week'),
     path('group/week/<int:year>/<int:week>', views.group_week,
          name='group_week_by_week'),
+    path('print/group/<int:id_>', views.full_register_group,
+        name='full_register_group')
 ]
diff --git a/biscuit/apps/alsijil/views.py b/biscuit/apps/alsijil/views.py
index 733b34805..a8863f081 100644
--- a/biscuit/apps/alsijil/views.py
+++ b/biscuit/apps/alsijil/views.py
@@ -5,7 +5,7 @@ from typing import Optional
 from django.contrib.auth.decorators import login_required
 from django.db.models import Count, Exists, F, OuterRef, Q, Sum
 from django.http import Http404, HttpRequest, HttpResponse
-from django.shortcuts import render
+from django.shortcuts import get_object_or_404, render
 from django.urls import reverse
 from django.utils.translation import ugettext as _
 from django.views.decorators.cache import cache_page
@@ -169,3 +169,52 @@ def group_week(request: HttpRequest, year: Optional[int] = None, week: Optional[
 
 
     return render(request, 'alsijil/group_week.html', context)
+
+
+@login_required
+def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
+    context = {}
+
+    group = get_object_or_404(Group, pk=id_)
+
+    # Get all lesson periods for the selected group
+    lesson_periods = LessonPeriod.objects.annotate(
+        has_documentation=Exists(LessonDocumentation.objects.filter(
+            ~Q(topic__exact=''),
+            lesson_period=OuterRef('pk'),
+        ))
+    ).select_related(
+        'lesson', 'lesson__subject', 'period', 'room'
+    ).prefetch_related(
+        'lesson__groups', 'lesson__teachers', 'substitutions'
+    ).filter(
+        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
+    ).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__absent=True
+        )),
+        unexcused=Count('personal_notes__absent', filter=Q(
+            personal_notes__lesson_period__in=lesson_periods,
+            personal_notes__absent=True,
+            personal_notes__excused=False
+        )),
+        tardiness=Sum('personal_notes__late', filter=Q(
+            personal_notes__lesson_period__in=lesson_periods,
+        ))
+    )
+
+    context['group'] = group
+    context['lesson_periods'] = lesson_periods
+    context['persons'] = persons
+
+    return render(request, 'alsijil/print/full_register.html', context)
-- 
GitLab