From 60e79dc38586630a5cc460930a81b4e2b8711b10 Mon Sep 17 00:00:00 2001 From: Dominik George <dominik.george@teckids.org> Date: Mon, 20 Dec 2021 21:08:18 +0100 Subject: [PATCH] Disambiguate long group names on collision --- aleksis/apps/untis/preferences.py | 8 ++++++ .../untis/util/mysql/importers/common_data.py | 25 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/aleksis/apps/untis/preferences.py b/aleksis/apps/untis/preferences.py index 9b78b23..56dbd3f 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 b8d37a0..cb87a30 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, -- GitLab