From 219eff23826062310290f4b5db3bed51bed564e1 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Mon, 13 Apr 2020 15:51:46 +0200
Subject: [PATCH] Add importer for absence reasons

---
 aleksis/apps/untis/model_extensions.py        |  6 ++-
 .../untis/util/mysql/importers/common_data.py | 48 +++++++++++++++++++
 aleksis/apps/untis/util/mysql/main.py         |  5 +-
 3 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/aleksis/apps/untis/model_extensions.py b/aleksis/apps/untis/model_extensions.py
index 10823bf..22b4f21 100644
--- a/aleksis/apps/untis/model_extensions.py
+++ b/aleksis/apps/untis/model_extensions.py
@@ -72,4 +72,8 @@ chronos_models.SupervisionSubstitution.field(
         verbose_name=_("UNTIS import reference"), null=True, blank=True
     )
 )
-
+chronos_models.AbsenceReason.field(
+    import_ref_untis=IntegerField(
+        verbose_name=_("UNTIS import reference"), null=True, blank=True
+    )
+)
diff --git a/aleksis/apps/untis/util/mysql/importers/common_data.py b/aleksis/apps/untis/util/mysql/importers/common_data.py
index a708b56..d867f2c 100644
--- a/aleksis/apps/untis/util/mysql/importers/common_data.py
+++ b/aleksis/apps/untis/util/mysql/importers/common_data.py
@@ -495,3 +495,51 @@ def import_breaks(
             breaks_ref[weekday][next_period] = new_break
 
     return breaks_ref
+
+
+def import_absence_reasons() -> Dict[int, chronos_models.AbsenceReason]:
+    """ Import absence reasons """
+
+    ref = {}
+
+    # Get reasons
+    reasons = run_default_filter(mysql_models.Absencereason.objects, filter_term=False)
+
+    for reason in reasons:
+        if not reason.name:
+            logger.error(
+                "Absence reason ID {}: Cannot import absence reason without short name.".format(
+                    reason.absence_reason_id
+                )
+            )
+            continue
+
+        # Build values
+        short_name = reason.name
+        name = reason.longname if reason.longname else short_name
+        import_ref = reason.absence_reason_id
+
+        logger.info("Import absence reason {} …".format(short_name))
+
+        new_reason, created = chronos_models.AbsenceReason.objects.get_or_create(
+            import_ref_untis=import_ref,
+            defaults={"short_name": short_name, "name": name}
+        )
+
+        if created:
+            logger.info("  New absence reason created")
+
+        changed = False
+
+        if new_reason.short_name != short_name or new_reason.name != name:
+            new_reason.short_name = short_name
+            new_reason.name = name
+            changed = True
+            logger.info("  Short name and name updated")
+
+        if changed:
+            new_reason.save()
+
+        ref[import_ref] = new_reason
+
+    return ref
diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py
index 8f2ad26..c175a60 100644
--- a/aleksis/apps/untis/util/mysql/main.py
+++ b/aleksis/apps/untis/util/mysql/main.py
@@ -5,7 +5,9 @@ from .importers.common_data import (
     import_supervision_areas,
     import_teachers,
     import_time_periods,
-    import_breaks)
+    import_breaks,
+    import_absence_reasons,
+)
 from .importers.lessons import import_lessons
 from .importers.substitutions import import_substitutions
 
@@ -14,6 +16,7 @@ def untis_import_mysql():
     # Coomon data for Chronos
     subjects_ref = import_subjects()
     rooms_ref = import_rooms()
+    absence_reasons_ref = import_absence_reasons()
 
     # Common data for core
     teachers_ref = import_teachers()
-- 
GitLab