From 919eb5a53ebc7f000481b8ed5d5742713b0a95ce Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Wed, 24 Jun 2020 15:10:09 +0200 Subject: [PATCH] [Lesson view] Show summary of previous lesson (topic, homework, absences and tardinesses) - Add extra templates for absences and tardinesses - Add model extensions for lesson documentation and personal notes to LessonPeriod --- aleksis/apps/alsijil/forms.py | 5 ++ aleksis/apps/alsijil/model_extensions.py | 63 ++++++++++++++++++- .../alsijil/class_register/lesson.html | 48 ++++++++++++++ .../templates/alsijil/partials/absences.html | 6 ++ .../alsijil/partials/tardinesses.html | 3 + aleksis/apps/alsijil/views.py | 4 +- 6 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 aleksis/apps/alsijil/templates/alsijil/partials/absences.html create mode 100644 aleksis/apps/alsijil/templates/alsijil/partials/tardinesses.html diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 92a48aa48..18c3ba48f 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -19,6 +19,11 @@ class LessonDocumentationForm(forms.ModelForm): model = LessonDocumentation fields = ["topic", "homework"] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.fields["homework"].label = _("Homework for the next lesson") + class PersonalNoteForm(forms.ModelForm): class Meta: diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py index 69dfc7c00..57768babb 100644 --- a/aleksis/apps/alsijil/model_extensions.py +++ b/aleksis/apps/alsijil/model_extensions.py @@ -1,13 +1,14 @@ from datetime import date +from typing import Optional, Union -from django.db.models import Exists, OuterRef +from django.db.models import Exists, OuterRef, QuerySet from calendarweek import CalendarWeek from aleksis.apps.chronos.models import LessonPeriod from aleksis.core.models import Group, Person -from .models import PersonalNote +from .models import LessonDocumentation, PersonalNote @Person.method @@ -91,3 +92,61 @@ def get_personal_notes(self, wanted_week: CalendarWeek): return PersonalNote.objects.select_related("person").filter( lesson_period=self, week=wanted_week.week ) + + +@LessonPeriod.method +def get_lesson_documentation( + self, week: Optional[CalendarWeek] = None +) -> Union[LessonDocumentation, None]: + """Get lesson documentation object for this lesson.""" + if not week: + week = self.week + try: + return LessonDocumentation.objects.get(lesson_period=self, week=week.week) + except LessonDocumentation.DoesNotExist: + return None + + +@LessonPeriod.method +def get_or_create_lesson_documentation( + self, week: Optional[CalendarWeek] = None +) -> LessonDocumentation: + """Get or create lesson documentation object for this lesson.""" + if not week: + week = self.week + lesson_documentation, created = LessonDocumentation.objects.get_or_create( + lesson_period=self, week=week.week + ) + return lesson_documentation + + +@LessonPeriod.method +def get_absences(self, week: Optional[CalendarWeek] = None) -> QuerySet: + """Get all personal notes of absent persons for this lesson.""" + if not week: + week = self.week + return self.personal_notes.filter(week=week.week, absent=True) + + +@LessonPeriod.method +def get_excused_absences(self, week: Optional[CalendarWeek] = None) -> QuerySet: + """Get all personal notes of excused absent persons for this lesson.""" + if not week: + week = self.week + return self.personal_notes.filter(week=week.week, absent=True, excused=True) + + +@LessonPeriod.method +def get_unexcused_absences(self, week: Optional[CalendarWeek] = None) -> QuerySet: + """Get all personal notes of unexcused absent persons for this lesson.""" + if not week: + week = self.week + return self.personal_notes.filter(week=week.week, absent=True, excused=False) + + +@LessonPeriod.method +def get_tardinesses(self, week: Optional[CalendarWeek] = None) -> QuerySet: + """Get all personal notes of late persons for this lesson.""" + if not week: + week = self.week + return self.personal_notes.filter(week=week.week, late__gt=0) diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html index b9e72783f..5748e84a6 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html +++ b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html @@ -1,5 +1,6 @@ {# -*- engine:django -*- #} {% extends "core/base.html" %} +{% load week_helpers %} {% load material_form i18n static %} {% block browser_title %}{% blocktrans %}Lesson{% endblocktrans %}{% endblock %} @@ -58,6 +59,53 @@ <div class="row"> <div class="col s12 m12 l6 xl8"> + {% with prev_lesson=lesson_period.prev prev_doc=prev_lesson.get_lesson_documentation %} + {% with prev_doc=prev_lesson.get_lesson_documentation absences=prev_lesson.get_absences tardinesses=prev_lesson.get_tardinesses %} + {% if prev_doc %} + {% weekday_to_date prev_lesson.week prev_lesson.period.weekday as prev_date %} + + <div class="card"> + <div class="card-content"> + <span class="card-title"> + {% blocktrans %}Overview: Previous lesson{% endblocktrans %} ({{ prev_date }}, + {% blocktrans with period=prev_lesson.period.period %}{{ period }}. period{% endblocktrans %}) + </span> + + <table> + {% if prev_doc.topic %} + <tr> + <th class="collection-item">{% trans "Lesson topic of previous lesson:" %}</th> + <td>{{ prev_doc.topic }}</td> + </tr> + {% endif %} + + {% if prev_doc.homework %} + <tr> + <th class="collection-item">{% trans "Homework for this lesson:" %}</th> + <td>{{ prev_doc.homework }}</td> + </tr> + {% endif %} + + {% if absences %} + <tr> + <th>{% trans "Absent persons:" %}</th> + <td>{% include "alsijil/partials/absences.html" with notes=absences %}</td> + </tr> + {% endif %} + + {% if tardinesses %} + <tr> + <th>{% trans "Late persons:" %}</th> + <td>{% include "alsijil/partials/tardinesses.html" with notes=tardinesses %}</td> + </tr> + {% endif %} + </table> + </div> + </div> + {% endif %} + {% endwith %} + {% endwith %} + <div class="card"> <div class="card-content"> <span class="card-title"> diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/absences.html b/aleksis/apps/alsijil/templates/alsijil/partials/absences.html new file mode 100644 index 000000000..6584142bf --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/partials/absences.html @@ -0,0 +1,6 @@ +{% load i18n %} +{% for note in notes %} + <span class="{% if note.excused %}green-text{% else %}red-text{% endif %}">{{ note.person }} + {% if note.excused %}{% trans "(e)" %}{% else %}{% trans "(u)" %}{% endif %}{% if not forloop.last %},{% endif %} + </span> +{% endfor %} diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/tardinesses.html b/aleksis/apps/alsijil/templates/alsijil/partials/tardinesses.html new file mode 100644 index 000000000..b3639ea88 --- /dev/null +++ b/aleksis/apps/alsijil/templates/alsijil/partials/tardinesses.html @@ -0,0 +1,3 @@ +{% for note in notes %} + <span>{{ note.person }} ({{ note.late }}'){% if not forloop.last %},{% endif %}</span> +{% endfor %} diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index 776037bd0..7779ca4e1 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -81,9 +81,7 @@ def lesson( context["day"] = wanted_week[lesson_period.period.weekday - 1] # Create or get lesson documentation object; can be empty when first opening lesson - lesson_documentation, created = LessonDocumentation.objects.get_or_create( - lesson_period=lesson_period, week=wanted_week.week - ) + lesson_documentation = lesson_period.get_or_create_lesson_documentation(wanted_week) lesson_documentation_form = LessonDocumentationForm( request.POST or None, instance=lesson_documentation, -- GitLab