From 91b88c4fac2a0fd06c076cb25c800c6864d950d4 Mon Sep 17 00:00:00 2001
From: Michael Bauer <michael-bauer@posteo.de>
Date: Fri, 25 Oct 2024 20:48:53 +0200
Subject: [PATCH] Adapt the person_overview to the new datamodel

---
 aleksis/apps/alsijil/tasks.py                 |  36 +++++-
 .../alsijil/partials/person_overview.html     | 109 +++++++-----------
 .../alsijil/print/register_for_group.html     |   2 +-
 3 files changed, 77 insertions(+), 70 deletions(-)

diff --git a/aleksis/apps/alsijil/tasks.py b/aleksis/apps/alsijil/tasks.py
index c7a9ae2b8..4660a45ee 100644
--- a/aleksis/apps/alsijil/tasks.py
+++ b/aleksis/apps/alsijil/tasks.py
@@ -17,7 +17,7 @@ from aleksis.core.util.pdf import generate_pdf_from_template
 from aleksis.apps.cursus.models import Course
 from aleksis.apps.kolego.models.absence import AbsenceReason
 
-from .models import ExtraMark
+from .models import ExtraMark, NewPersonalNote, Documentation, ParticipationStatus
 from .model_extensions import annotate_person_statistics_for_school_term
 
 
@@ -170,9 +170,39 @@ def generate_full_register_printout(
         context["absence_reasons_not_counted"] = AbsenceReason.objects.filter(count_as_absent=False)
         context["extra_marks"] = ExtraMark.objects.all()
 
-    if include_members_table:
+    if include_members_table or include_person_overviews:
         group = group.prefetch_related("members")
 
+    if include_person_overviews:
+        group = group.prefetch_related(
+            Prefetch(
+                "members__participations",
+                queryset=ParticipationStatus.objects
+                .filter(
+                    # TODO: Not shure this filter works here as intended = test
+                    Q(absence_reason__isnull=False)
+                    | Q(tardiness__isnull=False)
+                )
+                .select_related("absence_reason")
+                .prefetch_related(
+                    Prefetch(
+                        "related_documentation",
+                        queryset=Documentation.objects.select_related("subject").prefetch_related("teachers"),
+                    ),
+                )
+            ),
+            Prefetch(
+                "members__new_personal_notes",
+                queryset=NewPersonalNote.objects.prefetch_related(
+                    Prefetch(
+                        "documentation",
+                        queryset=Documentation.objects.select_related("subject").prefetch_related("teachers"),
+                    ),
+                    "extra_mark",
+                )
+            ),
+        )
+
     if include_teachers_and_subjects_table:
         group = group.prefetch_related(
             Prefetch("courses", queryset=Course.objects.select_related("subject")),
@@ -185,7 +215,7 @@ def generate_full_register_printout(
     group = group[0]
     context["group"] = group
 
-    if include_members_table:
+    if include_members_table or include_person_overviews:
         context["members"] = annotate_person_statistics_for_school_term(group.members.all(), group.school_term, group)
 
     # OLD
diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/person_overview.html b/aleksis/apps/alsijil/templates/alsijil/partials/person_overview.html
index f9f533c84..4aa503d44 100644
--- a/aleksis/apps/alsijil/templates/alsijil/partials/person_overview.html
+++ b/aleksis/apps/alsijil/templates/alsijil/partials/person_overview.html
@@ -43,39 +43,23 @@
     <table>
       <tr>
         <th colspan="3">{% trans 'Absences' %}</th>
-        <td>{{ person.absences_count }}</td>
+        <td>{{ person.absence_count }}</td>
       </tr>
-      <tr>
-        <td rowspan="{{ excuse_types.count|add:3 }}" style="width: 16mm;"
-            class="rotate small-print">{% trans "thereof" %}</td>
-        <th colspan="2">{% trans 'Excused' %}</th>
-        <td>{{ person.excused }}</td>
-      </tr>
-      <tr>
-        <td rowspan="{{ excuse_types.count|add:1 }}" style="width: 16mm;"
-            class="rotate small-print">{% trans "thereof" %}</td>
-        <th>{% trans "Without excuse type" %}</th>
-        <td>{{ person.excused_without_excuse_type }}</td>
-      </tr>
-      {% for excuse_type in excuse_types %}
+      {% for for absence_reason in absence_reasons %}
         <tr>
-          <th>{{ excuse_type.name }}</th>
-          <td>{{ person|get_dict:excuse_type.count_label }}</td>
+          <th>{{ absence_reason.name }}</th>
+          <td>{{ person|get_dict:absence_reason.count_label }}</td>
         </tr>
       {% endfor %}
-      <tr>
-        <th colspan="2">{% trans 'Unexcused' %}</th>
-        <td>{{ person.unexcused }}</td>
-      </tr>
-      {% for excuse_type in excuse_types_not_absent %}
+      {% for for absence_reason in absence_reasons_not_counted %}
         <tr>
-          <th colspan="3">{{ excuse_type.name }}</th>
-          <td>{{ person|get_dict:excuse_type.count_label }}</td>
+          <th colspan="3">{{ absence_reason.name }}</th>
+          <td>{{ person|get_dict:absence_reason.count_label }}</td>
         </tr>
       {% endfor %}
       <tr>
         <th colspan="3">{% trans 'Tardiness' %}</th>
-        <td>{{ person.tardiness }}'/{{ person.tardiness_count }}&times;</td>
+        <td>{{ person.tardiness_sum }}'/{{ person.tardiness_count }}&times;</td>
       </tr>
     </table>
   </div>
@@ -95,64 +79,57 @@
   </div>
 </div>
 
-<h5>{% trans 'Relevant personal notes' %}</h5>
+<h5>{% trans 'Relevant participation statuses' %}</h5>
 <table class="small-print">
   <thead>
   <tr>
     <th>{% trans 'Date' %}</th>
-    <th>{% trans 'Pe.' %}</th>
     <th>{% trans 'Subj.' %}</th>
     <th>{% trans 'Te.' %}</th>
     <th>{% trans 'Absent' %}</th>
     <th>{% trans 'Tard.' %}</th>
+  </tr>
+  </thead>
+
+  <tbody>
+  {% for participation in person.participations %}
+    <tr>
+      <td>{{ participation.documentation.datetime_start.date }}</td>
+      <td>
+        {{ participation.documentation.subject.short_name }}
+      </td>
+      <!-- TODO: Should probably use short_names -->
+      <td>{{ participation.note.documentation.teachers.all|join:', ' }}</td>
+      <td>{{ participation.absence_reason.short_name }}</td>
+      <td>{{ participation.tardiness }}</td>
+    </tr>
+  {% endfor %}
+  </tbody>
+</table>
+
+<h5>{% trans 'Relevant personal notes' %}</h5>
+<table class="small-print">
+  <thead>
+  <tr>
+    <th>{% trans 'Date' %}</th>
+    <th>{% trans 'Subj.' %}</th>
+    <th>{% trans 'Te.' %}</th>
     <th colspan="2">{% trans 'Remarks' %}</th>
   </tr>
   </thead>
 
   <tbody>
-  {% for note in person.filtered_notes %}
-    {% if note.absent or note.tardiness or note.remarks or note.extra_marks.all %}
+  {% for note in person.new_personal_notes %}
+    {% if note.note or note.extra_marks.all %}
       <tr>
-        {% if note.date %}
-          <td>{{ note.date }}</td>
-          <td>{{ note.register_object.period.period }}</td>
-        {% else %}
-          <td colspan="2">
-            {{ note.register_object.date_start }} {{ note.register_object.period_from.period }}.–{{ note.register_object.date_end }}
-            {{ note.register_object.period_to.period }}.
-          </td>
-        {% endif %}
-        <td>
-          {% if note.register_object.label_ != "event" %}
-            {{ note.register_object.get_subject.short_name }}
-          {% else %}
-            {% trans "Event" %}
-          {% endif %}
-        </td>
-        <td>{{ note.register_object.teacher_short_names }}</td>
-        <td>
-          {% if note.absent %}
-            {% trans 'Yes' %}
-            {% if note.excused %}
-              {% if note.excuse_type %}
-                ({{ note.excuse_type.short_name }})
-              {% else %}
-                ({% trans 'e' %})
-              {% endif %}
-            {% endif %}
-          {% endif %}
-        </td>
-        <td>
-          {% if note.tardiness %}
-            {{ note.tardiness }}'
-          {% endif %}
-        </td>
+        <td>{{ note.documentation.datetime_start.date }}</td>
         <td>
-          {% for extra_mark in note.extra_marks.all %}
-            {{ extra_mark.short_name }}{% if not forloop.last %},{% endif %}
-          {% endfor %}
+          {{ note.documentation.subject.short_name }}
         </td>
-        <td>{{ note.remarks }}</td>
+        <!-- TODO: Should probably use short_names -->
+        <td>{{ note.documentation.teachers.all|join:', ' }}</td>
+        <td>{{ note.extra_mark.short_name }}</td>
+        <td>{{ note.note }}</td>
       </tr>
     {% endif %}
   {% endfor %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/print/register_for_group.html b/aleksis/apps/alsijil/templates/alsijil/print/register_for_group.html
index d42aecfa0..0faca8dd6 100644
--- a/aleksis/apps/alsijil/templates/alsijil/print/register_for_group.html
+++ b/aleksis/apps/alsijil/templates/alsijil/print/register_for_group.html
@@ -43,7 +43,7 @@
   {% endif %}
 
   {% if include_person_overviews %}
-    {% for person in persons %}
+    {% for person in members %}
       {% include "alsijil/partials/person_overview.html with person=person only %}  
       <div class="page-break">&nbsp;</div>
     {% endfor %}
-- 
GitLab