From e2b081dd7091f1d35d60d4c595e2f8cc9687d56e Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Wed, 1 Jul 2020 16:57:10 +0200
Subject: [PATCH] Import absences and substitutions related to school term and
 validity range

---
 .../untis/util/mysql/importers/absences.py    | 34 +++++++++++--------
 .../util/mysql/importers/substitutions.py     | 19 +++++------
 aleksis/apps/untis/util/mysql/main.py         | 10 +++---
 3 files changed, 33 insertions(+), 30 deletions(-)

diff --git a/aleksis/apps/untis/util/mysql/importers/absences.py b/aleksis/apps/untis/util/mysql/importers/absences.py
index 9527e00..d3af5d8 100644
--- a/aleksis/apps/untis/util/mysql/importers/absences.py
+++ b/aleksis/apps/untis/util/mysql/importers/absences.py
@@ -1,6 +1,7 @@
 import logging
 from enum import Enum
 
+from aleksis.apps.chronos.models import ValidityRange
 from tqdm import tqdm
 
 from aleksis.apps.chronos import models as chronos_models
@@ -10,10 +11,10 @@ from ..util import (
     TQDM_DEFAULTS,
     get_first_period,
     get_last_period,
-    get_term,
     move_weekday_to_range,
     run_default_filter,
     untis_date_to_date,
+    date_to_untis_date,
 )
 
 logger = logging.getLogger(__name__)
@@ -26,18 +27,16 @@ class AbsenceType(Enum):
     ROOM = 102
 
 
-def import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes_ref, rooms_ref):
+def import_absences(validity_range: ValidityRange, absence_reasons_ref, time_periods_ref, teachers_ref, classes_ref, rooms_ref):
     ref = {}
 
-    # Get term
-    term = get_term()
-    term_date_start = untis_date_to_date(term.datefrom)
-    term_date_end = untis_date_to_date(term.dateto)
+    untis_term_start = date_to_untis_date(validity_range.date_start)
+    untis_term_end = date_to_untis_date(validity_range.date_end)
 
     # Get absences
     absences = (
-        run_default_filter(mysql_models.Absence.objects, filter_term=False)
-        .filter(datefrom__lte=term.dateto, dateto__gte=term.datefrom)
+        run_default_filter(validity_range, mysql_models.Absence.objects, filter_term=False)
+        .filter(datefrom__lte=untis_term_end, dateto__gte=untis_term_start)
         .order_by("absence_id")
     )
 
@@ -101,6 +100,7 @@ def import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes
                 "period_from": time_period_from,
                 "period_to": time_period_to,
                 "comment": absence.text,
+                "school_term": validity_range.school_term,
             },
         )
 
@@ -117,6 +117,7 @@ def import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes
             or new_absence.period_from != time_period_from
             or new_absence.period_to != time_period_to
             or new_absence.comment != comment
+            or new_absence.school_term != validity_range.school_term
         ):
             new_absence.reason = reason
             new_absence.group = group
@@ -127,16 +128,19 @@ def import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes
             new_absence.period_from = time_period_from
             new_absence.period_to = time_period_to
             new_absence.comment = comment
+            new_absence.school_term = validity_range.school_term
             new_absence.save()
             logger.info("  Absence updated")
 
         existing_absences.append(import_ref)
         ref[import_ref] = new_absence
 
-        # Delete all no longer existing absences
-        for a in chronos_models.Absence.objects.filter(
-            date_start__lte=term_date_start, date_end__gte=term_date_end
-        ):
-            if a.import_ref_untis and a.import_ref_untis not in existing_absences:
-                logger.info("Absence {} deleted".format(a.id))
-                a.delete()
+    # 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
+    ):
+        if a.import_ref_untis and a.import_ref_untis not in existing_absences:
+            logger.info("Absence {} deleted".format(a.id))
+            a.delete()
+
+    return ref
diff --git a/aleksis/apps/untis/util/mysql/importers/substitutions.py b/aleksis/apps/untis/util/mysql/importers/substitutions.py
index df57a9d..78a85d3 100644
--- a/aleksis/apps/untis/util/mysql/importers/substitutions.py
+++ b/aleksis/apps/untis/util/mysql/importers/substitutions.py
@@ -1,6 +1,7 @@
 import logging
 from enum import Enum
 
+from aleksis.apps.chronos.models import ValidityRange
 from django.db.models import Q
 
 from calendarweek import CalendarWeek
@@ -11,10 +12,10 @@ from aleksis.apps.chronos import models as chronos_models
 from .... import models as mysql_models
 from ..util import (
     TQDM_DEFAULTS,
-    get_term,
     run_default_filter,
     untis_date_to_date,
     untis_split_first,
+    date_to_untis_date,
 )
 
 logger = logging.getLogger(__name__)
@@ -26,16 +27,13 @@ class SubstitutionFlag(Enum):
 
 
 def import_substitutions(
-    teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref, time_periods_ref,
+    validity_range: ValidityRange, teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref, time_periods_ref,
 ):
     """Import substitutions."""
-    term = get_term()
-    date_start = untis_date_to_date(term.datefrom)
-    date_end = untis_date_to_date(term.dateto)
 
     subs = (
-        run_default_filter(mysql_models.Substitution.objects, filter_term=False)
-        .filter(date__gte=term.datefrom, date__lte=term.dateto)
+        run_default_filter(validity_range, mysql_models.Substitution.objects, filter_term=False)
+        .filter(date__gte=date_to_untis_date(validity_range.date_start), date__lte=date_to_untis_date(validity_range.date_end))
         .exclude(
             Q(flags__contains="N")
             | Q(flags__contains="b")
@@ -91,6 +89,7 @@ def import_substitutions(
 
         if not is_supervision_substitution:
             lesson_periods = chronos_models.LessonPeriod.objects.filter(
+                lesson__validity=validity_range,
                 lesson__lesson_id_untis=lesson_id,
                 lesson__teachers=teacher_old,
                 period__period=period,
@@ -221,20 +220,20 @@ def import_substitutions(
                         logger.info("  Supervision substitution updated")
 
     # Delete all no longer existing substitutions
-    for s in chronos_models.LessonSubstitution.objects.within_dates(date_start, date_end):
+    for s in chronos_models.LessonSubstitution.objects.within_dates(validity_range.date_start, validity_range.date_end):
         if s.import_ref_untis and s.import_ref_untis not in existing_subs:
             logger.info("Substitution {} deleted".format(s.id))
             s.delete()
 
     # Delete all no longer existing extra lessons
-    for s in chronos_models.ExtraLesson.objects.within_dates(date_start, date_end):
+    for s in chronos_models.ExtraLesson.objects.within_dates(validity_range.date_start, validity_range.date_end):
         if s.import_ref_untis and s.import_ref_untis not in existing_subs:
             logger.info("Extra lesson {} deleted".format(s.id))
             s.delete()
 
     # Delete all no longer existing supervision substitutions
     for s in chronos_models.SupervisionSubstitution.objects.filter(
-        date__gte=date_start, date__lte=date_end
+        date__gte=validity_range.date_start, date__lte=validity_range.date_end
     ):
         if s.import_ref_untis and s.import_ref_untis not in existing_subs:
             logger.info("Supervision substitution {} deleted".format(s.id))
diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py
index 7d11bcd..f6276ea 100644
--- a/aleksis/apps/untis/util/mysql/main.py
+++ b/aleksis/apps/untis/util/mysql/main.py
@@ -49,11 +49,11 @@ def untis_import_mysql():
         # Lessons
         import_lessons(validity_range, time_periods_ref, rooms_ref, subjects_ref, teachers_ref, classes_ref)
 
-    # Substitutions
-    import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes_ref, rooms_ref)
-    import_substitutions(
-        teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref, time_periods_ref,
-    )
+        # Substitutions
+        import_absences(validity_range, absence_reasons_ref, time_periods_ref, teachers_ref, classes_ref, rooms_ref)
+        import_substitutions(
+            validity_range, teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref, time_periods_ref,
+        )
 
     # Events
     import_events(time_periods_ref, teachers_ref, classes_ref, rooms_ref)
-- 
GitLab