From 8f42a2eb236d4d4fa13e24c2075dbeb57ff1c203 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Wed, 1 Jul 2020 16:41:31 +0200
Subject: [PATCH] Import lessons with validity range

---
 aleksis/apps/untis/model_extensions.py        |  3 --
 .../untis/util/mysql/importers/lessons.py     | 54 ++++++++-----------
 .../apps/untis/util/mysql/importers/terms.py  |  2 +
 aleksis/apps/untis/util/mysql/main.py         |  4 +-
 4 files changed, 25 insertions(+), 38 deletions(-)

diff --git a/aleksis/apps/untis/model_extensions.py b/aleksis/apps/untis/model_extensions.py
index fb8b747..48e67c2 100644
--- a/aleksis/apps/untis/model_extensions.py
+++ b/aleksis/apps/untis/model_extensions.py
@@ -43,9 +43,6 @@ chronos_models.Lesson.field(
         verbose_name=_("Number of lesson element in UNTIS"), null=True, blank=True
     )
 )
-chronos_models.Lesson.field(
-    term_untis=IntegerField(verbose_name=_("Term id in UNTIS"), null=True, blank=True)
-)
 chronos_models.LessonPeriod.field(
     element_id_untis=IntegerField(
         verbose_name=_("Number of lesson element in UNTIS"), null=True, blank=True
diff --git a/aleksis/apps/untis/util/mysql/importers/lessons.py b/aleksis/apps/untis/util/mysql/importers/lessons.py
index 193499c..6665564 100644
--- a/aleksis/apps/untis/util/mysql/importers/lessons.py
+++ b/aleksis/apps/untis/util/mysql/importers/lessons.py
@@ -1,7 +1,8 @@
 import logging
-from datetime import timedelta
 
 import reversion
+from aleksis.apps.chronos.models import ValidityRange
+from django.db.models import Q
 from django.utils.translation import gettext as _
 
 from tqdm import tqdm
@@ -15,34 +16,18 @@ from ..util import (
     TQDM_DEFAULTS,
     compare_m2m,
     connect_untis_fields,
-    get_term,
     run_default_filter,
-    untis_date_to_date,
     untis_split_third,
 )
 
 logger = logging.getLogger(__name__)
 
 
-def import_lessons(time_periods_ref, rooms_ref, subjects_ref, teachers_ref, classes_ref):
+def import_lessons(validity_range: ValidityRange, time_periods_ref, rooms_ref, subjects_ref, teachers_ref, classes_ref):
     """Import lessons."""
-    # Get current term
-    term = get_term()
-    date_start = untis_date_to_date(term.datefrom)
-    date_end = untis_date_to_date(term.dateto)
-
-    # Get all existing lessons for this term
-    lessons_in_term = chronos_models.Lesson.objects.filter(term_untis=term.term_id).values_list(
-        "id", flat=True
-    )
-
-    # Set end date of lessons from other terms ending in this term to the day before term starts
-    chronos_models.Lesson.objects.filter(date_end__gte=date_start).exclude(
-        id__in=lessons_in_term
-    ).update(date_end=date_start - timedelta(days=1))
 
     # Lessons
-    lessons = run_default_filter(mysql_models.Lesson.objects)
+    lessons = run_default_filter(validity_range, mysql_models.Lesson.objects)
 
     existing_lessons = []
     for lesson in tqdm(lessons, desc="Import lessons", **TQDM_DEFAULTS):
@@ -127,7 +112,7 @@ def import_lessons(time_periods_ref, rooms_ref, subjects_ref, teachers_ref, clas
                 qs = core_models.Group.objects.filter(
                     parent_groups__in=[c.id for c in course_classes],
                     subject_id=subject.id,
-                )
+                ).filter(Q(school_term__isnull=True) | Q(school_term=validity_range.school_term))
 
                 # Check if found groups match
                 match = False
@@ -162,7 +147,7 @@ def import_lessons(time_periods_ref, rooms_ref, subjects_ref, teachers_ref, clas
 
                     # Update parent groups
                     course_group.parent_groups.set(course_classes)
-                    logger.info("    Course groups set")
+                    logger.info("    Parent groups set")
 
                     # Update name
                     if course_group.name != group_name:
@@ -177,12 +162,21 @@ def import_lessons(time_periods_ref, rooms_ref, subjects_ref, teachers_ref, clas
                 # Update import ref
                 if (
                     course_group.import_ref_untis != group_import_ref
-                ):  # or course_group.untis_subject != subject_ref:
+                ):
                     course_group.import_ref_untis = group_import_ref
-                    # course_group.subject_ref = subject_ref
                     logger.info("    Import reference of course group updated")
                     changed = True
 
+                if course_group.subject != subject:
+                    course_group.subject = subject
+                    logger.info("    Subject reference of course group updated")
+                    changed = True
+
+                if course_group.school_term != validity_range.school_term:
+                    course_group.school_term = validity_range.school_term
+                    logger.info("    School term reference of course group updated")
+                    changed = True
+
                 if changed:
                     course_group.save()
 
@@ -192,7 +186,7 @@ def import_lessons(time_periods_ref, rooms_ref, subjects_ref, teachers_ref, clas
 
             # Get old lesson
             old_lesson_qs = chronos_models.Lesson.objects.filter(
-                lesson_id_untis=lesson_id, element_id_untis=i, term_untis=term.term_id
+                lesson_id_untis=lesson_id, element_id_untis=i, validity=validity_range
             )
 
             if old_lesson_qs.exists():
@@ -203,25 +197,19 @@ def import_lessons(time_periods_ref, rooms_ref, subjects_ref, teachers_ref, clas
 
                 if (
                     old_lesson.subject != subject
-                    or old_lesson.date_start != date_start
-                    or old_lesson.date_end != date_end
                 ):
                     old_lesson.subject = subject
-                    old_lesson.date_start = date_start
-                    old_lesson.date_end = date_end
                     old_lesson.save()
-                    logger.info("    Subject, start date and end date updated")
+                    logger.info("    Subject updated")
                 lesson = old_lesson
             else:
                 # Create new lesson
 
                 lesson = chronos_models.Lesson.objects.create(
                     subject=subject,
-                    date_start=date_start,
-                    date_end=date_end,
                     lesson_id_untis=lesson_id,
                     element_id_untis=i,
-                    term_untis=term.term_id,
+                    validity=validity_range,
                 )
                 logger.info("    New lesson created")
 
@@ -269,7 +257,7 @@ def import_lessons(time_periods_ref, rooms_ref, subjects_ref, teachers_ref, clas
                     )
                     logger.info("      New time period added")
 
-    for lesson in chronos_models.Lesson.objects.filter(term_untis=term.term_id):
+    for lesson in chronos_models.Lesson.objects.filter(validity=validity_range):
         if lesson.lesson_id_untis and lesson.lesson_id_untis not in existing_lessons:
             logger.info("Lesson {} deleted".format(lesson.id))
             with reversion.create_revision():
diff --git a/aleksis/apps/untis/util/mysql/importers/terms.py b/aleksis/apps/untis/util/mysql/importers/terms.py
index 2f4636b..7d6b4f2 100644
--- a/aleksis/apps/untis/util/mysql/importers/terms.py
+++ b/aleksis/apps/untis/util/mysql/importers/terms.py
@@ -98,6 +98,8 @@ def import_terms(qs: Optional[QuerySet] = None) -> Dict[int, chronos_models.Vali
         validity_range.date_end = date_end
         validity_range.name = name
         validity_range.school_term = school_term
+        validity_range.school_id_untis = term.school_id
+        validity_range.version_id_untis = term.version_id
 
         validity_range.save()
 
diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py
index 878b68d..7d11bcd 100644
--- a/aleksis/apps/untis/util/mysql/main.py
+++ b/aleksis/apps/untis/util/mysql/main.py
@@ -46,8 +46,8 @@ def untis_import_mysql():
         # Supervisions
         supervision_areas_ref = import_supervision_areas(validity_range, breaks_ref, teachers_ref)
 
-    # Lessons
-    import_lessons(time_periods_ref, rooms_ref, subjects_ref, teachers_ref, classes_ref)
+        # 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)
-- 
GitLab