From 3207b91dfca99c2ff5b71c9262fd62105b022e8e Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Tue, 31 Mar 2020 15:26:35 +0200
Subject: [PATCH] Improve import process for groups

---
 aleksis/apps/untis/settings.py                | 18 +++++++
 .../untis/util/mysql/importers/common_data.py | 49 +++++++++++++++++--
 2 files changed, 62 insertions(+), 5 deletions(-)

diff --git a/aleksis/apps/untis/settings.py b/aleksis/apps/untis/settings.py
index 7dd006d..abaa6e4 100644
--- a/aleksis/apps/untis/settings.py
+++ b/aleksis/apps/untis/settings.py
@@ -33,6 +33,21 @@ CONSTANCE_CONFIG = {
         _("Update first and last name of existing persons?"),
         bool,
     ),
+    "UNTIS_IMPORT_MYSQL_UPDATE_GROUPS_SHORT_NAME": (
+        False,
+        _("Update short name of existing groups?"),
+        bool,
+    ),
+    "UNTIS_IMPORT_MYSQL_UPDATE_GROUPS_NAME": (
+        False,
+        _("Update name of existing groups?"),
+        bool,
+    ),
+    "UNTIS_IMPORT_MYSQL_UPDATE_GROUPS_OVERWRITE_OWNERS": (
+        False,
+        _("Overwrite existing owners?"),
+        bool,
+    ),
 }
 
 CONSTANCE_CONFIG_FIELDSETS = {
@@ -47,5 +62,8 @@ CONSTANCE_CONFIG_FIELDSETS = {
         "UNTIS_IMPORT_MYSQL_UPDATE_SUBJECTS",
         "UNTIS_IMPORT_MYSQL_UPDATE_PERSONS_SHORT_NAME",
         "UNTIS_IMPORT_MYSQL_UPDATE_PERSONS_NAME",
+        "UNTIS_IMPORT_MYSQL_UPDATE_GROUPS_SHORT_NAME",
+        "UNTIS_IMPORT_MYSQL_UPDATE_GROUPS_NAME",
+        "UNTIS_IMPORT_MYSQL_UPDATE_GROUPS_OVERWRITE_OWNERS",
     ),
 }
diff --git a/aleksis/apps/untis/util/mysql/importers/common_data.py b/aleksis/apps/untis/util/mysql/importers/common_data.py
index dd59688..9679222 100644
--- a/aleksis/apps/untis/util/mysql/importers/common_data.py
+++ b/aleksis/apps/untis/util/mysql/importers/common_data.py
@@ -154,27 +154,66 @@ def import_classes(
     """ Import classes """
 
     classes_ref = {}
+
+    # Get classes
     course_classes = run_default_filter(mysql_models.Class.objects, filter_term=True)
 
     for class_ in course_classes:
+        # Check if needed data are provided
         if not class_.name:
-            raise Exception("Short name needed.")
+            logger.error(
+                "Class ID {}: Cannot import class without short name.".format(
+                    class_.teacher_id
+                )
+            )
+            continue
 
+        # Build values
         short_name = class_.name[:16]
         name = class_.longname if class_.longname else short_name
         teacher_ids = untis_split_first(class_.teacherids, int)
         owners = [teachers_ref[t_id] for t_id in teacher_ids]
+        import_ref = class_.class_id
+
+        logger.info("Import class {} (as group) …".format(short_name))
 
         new_group, created = core_models.Group.objects.get_or_create(
             short_name__iexact=short_name,
-            defaults={"name": name, "import_ref": class_.class_id},
+            defaults={"name": name, "import_ref_untis": import_ref},
         )
 
-        new_group.name = name
-        new_group.save()
+        if created:
+            logger.info("  New person created")
+
+        changed = False
+
+        if (
+            config.UNTIS_IMPORT_MYSQL_UPDATE_GROUPS_SHORT_NAME
+            and new_group.short_name != short_name
+        ):
+            new_group.short_name = short_name
+            changed = True
+            logger.info("  Short name updated")
+
+        if config.UNTIS_IMPORT_MYSQL_UPDATE_GROUPS_NAME and new_group.name != name:
+            new_group.name = name
+            changed = True
+            logger.info("  Name updated")
+
+        if new_group.import_ref_untis != import_ref:
+            new_group.import_ref_untis = import_ref
+            changed = True
+            logger.info("  Import reference updated")
+
+        if changed:
+            new_group.save()
+
+        if config.UNTIS_IMPORT_MYSQL_UPDATE_GROUPS_OVERWRITE_OWNERS:
+            new_group.owners.clear()
+            logger.info("  Group owners cleared")
 
-        new_group.owners.clear()  # configurable
         new_group.owners.add(*owners)
+        logger.info("  Group owners updated")
 
         classes_ref[class_.class_id] = new_group
 
-- 
GitLab