diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 342321d693656c7d0ee0e316de3a0bd54a5b7e25..a5a7900980a2666880932a7a02971765a3444627 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,7 @@ Changed ~~~~~~~ * Wrap all imports in complete revisions to make it possible to undo them completely and to track changes correctly. +* Group names are now optionally disambiguated on collisions in Untis Fixed ~~~~~ diff --git a/aleksis/apps/untis/preferences.py b/aleksis/apps/untis/preferences.py index 9b78b2333e0b4b93cde73fe420ea9b4d34bf5776..56dbd3f55a8251535adfe9c418d91700b7738f3e 100644 --- a/aleksis/apps/untis/preferences.py +++ b/aleksis/apps/untis/preferences.py @@ -48,6 +48,14 @@ class UpdateGroupsName(BooleanPreference): verbose_name = _("Update name of existing groups") +@site_preferences_registry.register +class DisambiguateGroupsName(BooleanPreference): + section = untis_mysql + name = "disambiguate_groups_name" + default = True + verbose_name = _("Disambiguate name of new groups") + + @site_preferences_registry.register class OverwriteGroupOwners(BooleanPreference): section = untis_mysql diff --git a/aleksis/apps/untis/util/mysql/importers/common_data.py b/aleksis/apps/untis/util/mysql/importers/common_data.py index b8d37a0d178070d5a96cc5c1b6cf0a159c9dcc87..f0af41807c1817a877786870580f9d7cbf359208 100644 --- a/aleksis/apps/untis/util/mysql/importers/common_data.py +++ b/aleksis/apps/untis/util/mysql/importers/common_data.py @@ -1,4 +1,5 @@ import logging +import re from datetime import time from enum import Enum from typing import Dict @@ -191,6 +192,30 @@ def import_classes( school_term__in=[None, validity_range.school_term], ) except core_models.Group.DoesNotExist: + # Determine collisions of long name + while core_models.Group.objects.filter( + name=name, school_term=validity_range.school_term + ).exists(): + if not get_site_preferences()["untis_mysql__disambiguate_groups_name"]: + # Do not try to disambiguate it not enabled + break + + suffix = f" ({short_name})" + if name.endswith(suffix): + # First try, add a counter + name = f"{name} (2)" + else: + # Second or more tries, determine last counter, if any + match = re.match(r"^(.*)(\(\d+\))$", name) + if match: + # Counter found, increase + prefix = match.group(1) + counter = int(match.group(2)) + 1 + name = f"{prefix}({counter})" + else: + # Counter not found, add one + name = f"{name} (2)" + new_group = core_models.Group.objects.create( short_name=short_name, name=name,