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..cb87a30929e70819e098f7d430d796795b189cc7 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_termn=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,