From 409fbc99b67f4048d3a4c78356e8dbc3be77600c Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Wed, 15 Apr 2020 22:11:33 +0200
Subject: [PATCH] Add import code for holidays

---
 aleksis/apps/untis/model_extensions.py        |  5 ++
 .../untis/util/mysql/importers/holidays.py    | 69 +++++++++++++++++++
 aleksis/apps/untis/util/mysql/main.py         |  4 ++
 3 files changed, 78 insertions(+)
 create mode 100644 aleksis/apps/untis/util/mysql/importers/holidays.py

diff --git a/aleksis/apps/untis/model_extensions.py b/aleksis/apps/untis/model_extensions.py
index bf639c3..6ab37e5 100644
--- a/aleksis/apps/untis/model_extensions.py
+++ b/aleksis/apps/untis/model_extensions.py
@@ -87,3 +87,8 @@ chronos_models.Event.field(
         verbose_name=_("UNTIS import reference"), null=True, blank=True
     )
 )
+chronos_models.Holiday.field(
+    import_ref_untis=IntegerField(
+        verbose_name=_("UNTIS import reference"), null=True, blank=True
+    )
+)
diff --git a/aleksis/apps/untis/util/mysql/importers/holidays.py b/aleksis/apps/untis/util/mysql/importers/holidays.py
new file mode 100644
index 0000000..fe85b74
--- /dev/null
+++ b/aleksis/apps/untis/util/mysql/importers/holidays.py
@@ -0,0 +1,69 @@
+import logging
+from typing import Dict
+
+
+from aleksis.apps.chronos import models as chronos_models
+
+from .... import models as mysql_models
+from ..util import run_default_filter, untis_date_to_date
+
+logger = logging.getLogger(__name__)
+
+
+def import_holidays() -> Dict[int, chronos_models.Holiday]:
+    """ Import holidays """
+    ref = {}
+
+    # Get holidays
+    holidays = run_default_filter(mysql_models.Holiday.objects, filter_term=False)
+
+    for holiday in holidays:
+        import_ref = holiday.holiday_id
+
+        # Check if needed data are provided
+        if not holiday.name:
+            logger.error(
+                "Holiday ID {}: Cannot import holiday without short name.".format(
+                    import_ref
+                )
+            )
+            continue
+
+        title = holiday.name[:50]
+        comments = holiday.longname
+
+        date_start = untis_date_to_date(holiday.datefrom)
+        date_end = untis_date_to_date(holiday.dateto)
+
+        logger.info("Import holiday {} …".format(title))
+
+        # Get or create holiday
+        new_holiday, created = chronos_models.Holiday.objects.get_or_create(
+            import_ref_untis=import_ref,
+            defaults={
+                "title": title,
+                "comments": comments,
+                "date_start": date_start,
+                "date_end": date_end
+            }
+        )
+
+        if created:
+            logger.info("  New holiday created")
+
+        if (
+            new_holiday.title != title
+            or new_holiday.comments != comments
+            or new_holiday.date_start != date_start
+            or new_holiday.date_end != date_end
+        ):
+            new_holiday.title = title
+            new_holiday.comments = comments
+            new_holiday.date_start = date_start
+            new_holiday.date_end = date_end
+            new_holiday.save()
+            logger.info("  Holiday updated")
+
+        ref[import_ref] = new_holiday
+
+    return ref
diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py
index 15f7230..ac4e73e 100644
--- a/aleksis/apps/untis/util/mysql/main.py
+++ b/aleksis/apps/untis/util/mysql/main.py
@@ -10,6 +10,7 @@ from .importers.common_data import (
     import_absence_reasons,
 )
 from .importers.events import import_events
+from .importers.holidays import import_holidays
 from .importers.lessons import import_lessons
 from .importers.substitutions import import_substitutions
 
@@ -28,6 +29,9 @@ def untis_import_mysql():
     time_periods_ref = import_time_periods()
     breaks_ref = import_breaks(time_periods_ref)
 
+    # Holidays
+    holidays_ref = import_holidays()
+
     # Supervisions
     supervision_areas_ref = import_supervision_areas(breaks_ref, teachers_ref)
 
-- 
GitLab