From d11832913d1563c62cc285e4ac1ad4d105265963 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Tue, 30 Nov 2021 23:41:26 -0500 Subject: [PATCH] Implement reserved group names in Teamspeak3 service module. Closes #1302 --- .../services/modules/teamspeak3/manager.py | 4 +- .../services/modules/teamspeak3/tests.py | 49 +++++++++++++++++++ docs/features/core/groups.md | 2 +- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/allianceauth/services/modules/teamspeak3/manager.py b/allianceauth/services/modules/teamspeak3/manager.py index d05f910d..9f7eea6c 100755 --- a/allianceauth/services/modules/teamspeak3/manager.py +++ b/allianceauth/services/modules/teamspeak3/manager.py @@ -4,6 +4,7 @@ from django.conf import settings from .util.ts3 import TS3Server, TeamspeakError from .models import TSgroup +from allianceauth.groupmanagement.models import ReservedGroupName logger = logging.getLogger(__name__) @@ -270,7 +271,8 @@ class Teamspeak3Manager: addgroups.append(ts_groups[ts_group_key]) for user_ts_group_key in user_ts_groups: if user_ts_groups[user_ts_group_key] not in ts_groups.values(): - remgroups.append(user_ts_groups[user_ts_group_key]) + if not ReservedGroupName.objects.filter(name=user_ts_group_key).exists(): + remgroups.append(user_ts_groups[user_ts_group_key]) for g in addgroups: logger.info(f"Adding Teamspeak user {userid} into group {g}") diff --git a/allianceauth/services/modules/teamspeak3/tests.py b/allianceauth/services/modules/teamspeak3/tests.py index 1cb923ed..4abc68e4 100644 --- a/allianceauth/services/modules/teamspeak3/tests.py +++ b/allianceauth/services/modules/teamspeak3/tests.py @@ -15,6 +15,7 @@ from .signals import m2m_changed_authts_group, post_save_authts, post_delete_aut from .manager import Teamspeak3Manager from .util.ts3 import TeamspeakError from allianceauth.authentication.models import State +from allianceauth.groupmanagement.models import ReservedGroupName MODULE_PATH = 'allianceauth.services.modules.teamspeak3' DEFAULT_AUTH_GROUP = 'Member' @@ -316,6 +317,9 @@ class Teamspeak3SignalsTestCase(TestCase): class Teamspeak3ManagerTestCase(TestCase): + def setUp(self): + self.reserved = ReservedGroupName.objects.create(name='reserved', reason='tests', created_by='Bob, praise be!') + @staticmethod def my_side_effect(*args, **kwargs): raise TeamspeakError(1) @@ -339,3 +343,48 @@ class Teamspeak3ManagerTestCase(TestCase): # perform test manager.add_user(user, "Dummy User") + + @mock.patch.object(Teamspeak3Manager, '_get_userid') + @mock.patch.object(Teamspeak3Manager, '_user_group_list') + @mock.patch.object(Teamspeak3Manager, '_add_user_to_group') + @mock.patch.object(Teamspeak3Manager, '_remove_user_from_group') + @mock.patch.object(Teamspeak3Manager, 'server') + def test_update_groups_add(self, server, remove, add, groups, userid): + """Add to one group""" + userid.return_value = 1 + groups.return_value = {'test': 1} + + Teamspeak3Manager().update_groups(1, {'test': 1, 'dummy': 2}) + self.assertEqual(add.call_count, 1) + self.assertEqual(remove.call_count, 0) + self.assertEqual(add.call_args[0][1], 2) + + @mock.patch.object(Teamspeak3Manager, '_get_userid') + @mock.patch.object(Teamspeak3Manager, '_user_group_list') + @mock.patch.object(Teamspeak3Manager, '_add_user_to_group') + @mock.patch.object(Teamspeak3Manager, '_remove_user_from_group') + @mock.patch.object(Teamspeak3Manager, 'server') + def test_update_groups_remove(self, server, remove, add, groups, userid): + """Remove from one group""" + userid.return_value = 1 + groups.return_value = {'test': 1, 'dummy': 2} + + Teamspeak3Manager().update_groups(1, {'test': 1}) + self.assertEqual(add.call_count, 0) + self.assertEqual(remove.call_count, 1) + self.assertEqual(remove.call_args[0][1], 2) + + @mock.patch.object(Teamspeak3Manager, '_get_userid') + @mock.patch.object(Teamspeak3Manager, '_user_group_list') + @mock.patch.object(Teamspeak3Manager, '_add_user_to_group') + @mock.patch.object(Teamspeak3Manager, '_remove_user_from_group') + @mock.patch.object(Teamspeak3Manager, 'server') + def test_update_groups_remove_reserved(self, server, remove, add, groups, userid): + """Remove from one group, but do not touch reserved group""" + userid.return_value = 1 + groups.return_value = {'test': 1, 'dummy': 2, self.reserved.name: 3} + + Teamspeak3Manager().update_groups(1, {'test': 1}) + self.assertEqual(add.call_count, 0) + self.assertEqual(remove.call_count, 1) + self.assertEqual(remove.call_args[0][1], 2) diff --git a/docs/features/core/groups.md b/docs/features/core/groups.md index 25fd16c2..8530a62a 100644 --- a/docs/features/core/groups.md +++ b/docs/features/core/groups.md @@ -48,7 +48,7 @@ When using Alliance Auth to manage external services like Discord, Auth will aut ```eval_rst .. note:: - While this feature can help to avoid naming conflicts with groups on external services, the respective service component in Alliance Auth also needs to be build in such a way that it knows how to prevent these conflicts. Currently only the Discord service has this ability. + While this feature can help to avoid naming conflicts with groups on external services, the respective service component in Alliance Auth also needs to be build in such a way that it knows how to prevent these conflicts. Currently only the Discord and Teamspeak3 services have this ability. ``` ## Managing groups