Skip to content
Snippets Groups Projects
Verified Commit 8c6aa254 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Show only relevant days in substitutions print

parent 811abe64
No related branches found
No related tags found
1 merge request!315Resolve "Substitutions PDF for new data model"
...@@ -1209,12 +1209,19 @@ class AutomaticPlan(LiveDocument): ...@@ -1209,12 +1209,19 @@ class AutomaticPlan(LiveDocument):
@property @property
def current_start_day(self) -> date: def current_start_day(self) -> date:
"""Get first day which should be shown in the PDF.""" """Get first day which should be shown in the PDF."""
return timezone.now().date() from aleksis.apps.chronos.util.chronos_helpers import get_next_relevant_day
return get_next_relevant_day(timezone.now())
@property @property
def current_end_day(self) -> date: def current_end_day(self) -> date:
"""Get last day which should be shown in the PDF.""" """Get last day which should be shown in the PDF."""
return self.current_start_day + timedelta(days=self.number_of_days - 1) from aleksis.apps.chronos.util.chronos_helpers import get_next_relevant_day
day = self.current_start_day
for _i in range(self.number_of_days - 1):
day = get_next_relevant_day(day)
return day
def get_context_data(self) -> dict[str, Any]: def get_context_data(self) -> dict[str, Any]:
"""Get context data for generating the substitutions PDF.""" """Get context data for generating the substitutions PDF."""
......
from datetime import time from datetime import time
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from calendarweek.django import i18n_day_name_choices_lazy
from colorfield.widgets import ColorWidget from colorfield.widgets import ColorWidget
from dynamic_preferences.preferences import Section from dynamic_preferences.preferences import Section
from dynamic_preferences.types import ( from dynamic_preferences.types import (
BooleanPreference, BooleanPreference,
IntegerPreference, IntegerPreference,
ModelMultipleChoicePreference, ModelMultipleChoicePreference,
MultipleChoicePreference,
StringPreference, StringPreference,
TimePreference, TimePreference,
) )
...@@ -52,6 +55,34 @@ class ShortenGroupsLimit(IntegerPreference): ...@@ -52,6 +55,34 @@ class ShortenGroupsLimit(IntegerPreference):
) )
@site_preferences_registry.register
class SubstitutionsRelevantDays(MultipleChoicePreference):
"""Relevant days which have substitution plans."""
section = chronos
name = "substitutions_relevant_days"
default = [0, 1, 2, 3, 4]
verbose_name = _("Relevant days for substitution plans")
required = True
choices = i18n_day_name_choices_lazy()
def validate(self, value):
for v in value:
if int(v) not in self.get_choice_values():
raise ValidationError(f"{v} is not a valid choice")
@site_preferences_registry.register
class SubstitutionsDayChangeTime(TimePreference):
"""Time when substitution plans should switch to the next day."""
section = chronos
name = "substitutions_day_change_time"
default = time(18, 0)
verbose_name = _("Time when substitution plans switch to the next day")
required = True
@site_preferences_registry.register @site_preferences_registry.register
class SubstitutionsPrintNumberOfDays(IntegerPreference): class SubstitutionsPrintNumberOfDays(IntegerPreference):
section = chronos section = chronos
......
...@@ -410,7 +410,6 @@ def build_substitutions_list(wanted_day: date) -> tuple[list[dict], set[Person], ...@@ -410,7 +410,6 @@ def build_substitutions_list(wanted_day: date) -> tuple[list[dict], set[Person],
rows.sort(key=lambda row: row["sort_a"] + row["sort_b"]) rows.sort(key=lambda row: row["sort_a"] + row["sort_b"])
print(rows)
return rows, affected_teachers, affected_groups return rows, affected_teachers, affected_groups
......
...@@ -13,7 +13,6 @@ from aleksis.core.util.predicates import check_global_permission ...@@ -13,7 +13,6 @@ from aleksis.core.util.predicates import check_global_permission
from ..managers import TimetableType from ..managers import TimetableType
from ..models import ( from ..models import (
Absence,
LessonPeriod, LessonPeriod,
LessonSubstitution, LessonSubstitution,
Supervision, Supervision,
...@@ -173,7 +172,7 @@ def get_substitutions_context_data( ...@@ -173,7 +172,7 @@ def get_substitutions_context_data(
) )
day_contexts = {} day_contexts = {}
day = wanted_day day = get_next_relevant_day(wanted_day)
for _i in range(day_number): for _i in range(day_number):
day_contexts[day] = {"day": day} day_contexts[day] = {"day": day}
...@@ -183,16 +182,31 @@ def get_substitutions_context_data( ...@@ -183,16 +182,31 @@ def get_substitutions_context_data(
day_contexts[day]["announcements"] = Announcement.objects.on_date(day) day_contexts[day]["announcements"] = Announcement.objects.on_date(day)
if show_header_box: if show_header_box:
absences = Absence.objects.on_day(day)
day_contexts[day]["absent_teachers"] = absences.absent_teachers()
day_contexts[day]["absent_groups"] = absences.absent_groups()
day_contexts[day]["affected_teachers"] = sorted( day_contexts[day]["affected_teachers"] = sorted(
affected_teachers, key=lambda t: t.short_name or t.full_name affected_teachers, key=lambda t: t.short_name or t.full_name
) )
day_contexts[day]["affected_groups"] = affected_groups day_contexts[day]["affected_groups"] = affected_groups
day = day + timedelta(days=1) day = get_next_relevant_day(day + timedelta(days=1))
context["days"] = day_contexts context["days"] = day_contexts
return context return context
def get_next_relevant_day(current: datetime | date) -> date:
"""Get next relevant day for substitution plans."""
relevant_days = get_site_preferences()["chronos__substitutions_relevant_days"]
change_time = get_site_preferences()["chronos__substitutions_day_change_time"]
if isinstance(current, datetime):
current_day = current.date()
if current.time() > change_time:
current_day += timedelta(days=1)
else:
current_day = current
while str(current_day.weekday()) not in relevant_days:
current_day += timedelta(days=1)
return current_day
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment