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

Cancel all lessons if a class is absent

parent 0741cf32
No related branches found
No related tags found
No related merge requests found
......@@ -20,6 +20,7 @@ Fixed
* Matching for groups while importing lessons was broken in some cases.
* Import commands `current_next` and `current_future` imported all terms.
* Untis objects with special characters like commas in their names broke the import.
* Lessons weren't cancelled if a class is absent.
`2.2`_ - 2022-04-10
-------------------
......
......@@ -53,6 +53,9 @@ chronos_models.LessonPeriod.field(
chronos_models.LessonSubstitution.field(
import_ref_untis=IntegerField(verbose_name=_("Untis import reference"), null=True, blank=True)
)
chronos_models.LessonSubstitution.field(
absence_ref_untis=IntegerField(verbose_name=_("Untis absence reference"), null=True, blank=True)
)
chronos_models.SupervisionSubstitution.field(
import_ref_untis=IntegerField(verbose_name=_("Untis import reference"), null=True, blank=True)
)
......
import logging
from datetime import timedelta
from enum import Enum
from calendarweek import CalendarWeek
from tqdm import tqdm
from aleksis.apps.chronos import models as chronos_models
from aleksis.apps.chronos.models import ValidityRange
from aleksis.apps.chronos.models import TimePeriod, ValidityRange
from .... import models as mysql_models
from ..util import (
......@@ -40,6 +42,8 @@ def import_absences(
untis_term_start = date_to_untis_date(validity_range.date_start)
untis_term_end = date_to_untis_date(validity_range.date_end)
created_substitutions = []
# Get absences
absences = (
run_default_filter(validity_range, mysql_models.Absence.objects, filter_term=False)
......@@ -142,6 +146,36 @@ def import_absences(
existing_absences.append(import_ref)
ref[import_ref] = new_absence
if group:
# If a group is absent, all lessons of this group are cancelled.
current_date = date_from
while current_date <= date_to:
current_period_from = (
period_from if current_date == date_from else TimePeriod.period_min
)
current_period_to = period_to if current_date == date_to else TimePeriod.period_max
lesson_periods = (
chronos_models.LessonPeriod.objects.filter_group(group)
.on_day(current_date)
.filter(
period__period__gte=current_period_from,
period__period__lte=current_period_to,
)
)
for lesson_period in lesson_periods:
week = CalendarWeek.from_date(current_date)
sub, __ = chronos_models.LessonSubstitution.objects.get_or_create(
lesson_period=lesson_period,
week=week.week,
year=week.year,
defaults=dict(cancelled=True, absence_ref_untis=import_ref),
)
created_substitutions.append(sub)
current_date += timedelta(days=1)
# Delete all no longer existing absences
for a in chronos_models.Absence.objects.filter(
date_start__lte=validity_range.date_end, date_end__gte=validity_range.date_start
......@@ -150,4 +184,4 @@ def import_absences(
logger.info("Absence {} deleted".format(a.id))
a.delete()
return ref
return ref, created_substitutions
......@@ -35,8 +35,13 @@ def import_substitutions(
classes_ref,
supervision_areas_ref,
time_periods_ref,
absence_substitutions=None,
):
"""Import substitutions."""
if not absence_substitutions:
absence_substitutions = []
absence_substitutions = [sub.absence_ref_untis for sub in absence_substitutions]
subs = (
run_default_filter(validity_range, mysql_models.Substitution.objects, filter_term=False)
.filter(
......@@ -259,7 +264,9 @@ def import_substitutions(
validity_range.date_start, validity_range.date_end
)
for s in lesson_substitutions_in_range:
if s.import_ref_untis and s.import_ref_untis not in existing_subs:
if (s.import_ref_untis and s.import_ref_untis not in existing_subs) or (
s.absence_ref_untis and s.absence_ref_untis not in absence_substitutions
):
logger.info("Substitution {} deleted".format(s.id))
s.delete()
......
......@@ -72,7 +72,7 @@ def untis_import_mysql(
)
# Substitutions
import_absences(
__, created_substitutions = import_absences(
validity_range,
absence_reasons_ref,
time_periods_ref,
......@@ -88,6 +88,7 @@ def untis_import_mysql(
classes_ref,
supervision_areas_ref,
time_periods_ref,
created_substitutions,
)
# Events
......
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