diff --git a/allianceauth/services/modules/teamspeak3/admin.py b/allianceauth/services/modules/teamspeak3/admin.py index 446ff91b..ffde6642 100644 --- a/allianceauth/services/modules/teamspeak3/admin.py +++ b/allianceauth/services/modules/teamspeak3/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import AuthTS, Teamspeak3User +from .models import AuthTS, Teamspeak3User, StateGroup class Teamspeak3UserAdmin(admin.ModelAdmin): @@ -12,5 +12,11 @@ class AuthTSgroupAdmin(admin.ModelAdmin): filter_horizontal = ('ts_group',) +@admin.register(StateGroup) +class StateGroupAdmin(admin.ModelAdmin): + list_display = ('state', 'ts_group') + search_fields = ('state__name', 'ts_group__ts_group_name') + + admin.site.register(AuthTS, AuthTSgroupAdmin) admin.site.register(Teamspeak3User, Teamspeak3UserAdmin) diff --git a/allianceauth/services/modules/teamspeak3/migrations/0005_stategroup.py b/allianceauth/services/modules/teamspeak3/migrations/0005_stategroup.py new file mode 100644 index 00000000..e88a217a --- /dev/null +++ b/allianceauth/services/modules/teamspeak3/migrations/0005_stategroup.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-02-23 06:13 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0016_auto_20180223_0613'), + ('teamspeak3', '0004_service_permissions'), + ] + + operations = [ + migrations.CreateModel( + name='StateGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('state', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='authentication.State')), + ('ts_group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='teamspeak3.TSgroup')), + ], + ), + ] diff --git a/allianceauth/services/modules/teamspeak3/models.py b/allianceauth/services/modules/teamspeak3/models.py index 97e66cfd..86f60f0f 100644 --- a/allianceauth/services/modules/teamspeak3/models.py +++ b/allianceauth/services/modules/teamspeak3/models.py @@ -1,5 +1,6 @@ from django.db import models from django.contrib.auth.models import User, Group +from allianceauth.authentication.models import State class Teamspeak3User(models.Model): @@ -50,3 +51,8 @@ class UserTSgroup(models.Model): def __str__(self): return self.user.name + + +class StateGroup(models.Model): + state = models.ForeignKey(State, on_delete=models.CASCADE) + ts_group = models.ForeignKey(TSgroup, on_delete=models.CASCADE) diff --git a/allianceauth/services/modules/teamspeak3/signals.py b/allianceauth/services/modules/teamspeak3/signals.py index afe86e2d..f7befb1e 100644 --- a/allianceauth/services/modules/teamspeak3/signals.py +++ b/allianceauth/services/modules/teamspeak3/signals.py @@ -7,7 +7,7 @@ from django.db.models.signals import post_save from django.dispatch import receiver from .tasks import Teamspeak3Tasks -from .models import AuthTS +from .models import AuthTS, StateGroup logger = logging.getLogger(__name__) @@ -34,3 +34,8 @@ def post_save_authts(sender, instance, *args, **kwargs): def post_delete_authts(sender, instance, *args, **kwargs): logger.debug("Received post_delete signal from %s" % instance) transaction.on_commit(trigger_all_ts_update) + + +# it's literally the same logic so just recycle the receiver +post_save.connect(post_save_authts, sender=StateGroup) +post_delete.connect(post_delete_authts, sender=StateGroup) diff --git a/allianceauth/services/modules/teamspeak3/tasks.py b/allianceauth/services/modules/teamspeak3/tasks.py index b7e811b5..0d2fa98d 100644 --- a/allianceauth/services/modules/teamspeak3/tasks.py +++ b/allianceauth/services/modules/teamspeak3/tasks.py @@ -69,6 +69,8 @@ class Teamspeak3Tasks: for filtered_group in filtered_groups: for ts_group in filtered_group.ts_group.all(): groups[ts_group.ts_group_name] = ts_group.ts_group_id + for stategroup in user.profile.state.stategroup_set.all(): + groups[stategroup.ts_group.ts_group_name] = stategroup.ts_group.ts_group_id logger.debug("Updating user %s teamspeak3 groups to %s" % (user, groups)) try: with Teamspeak3Manager() as ts3man: diff --git a/allianceauth/services/modules/teamspeak3/tests.py b/allianceauth/services/modules/teamspeak3/tests.py index 62ac4d88..114efb86 100644 --- a/allianceauth/services/modules/teamspeak3/tests.py +++ b/allianceauth/services/modules/teamspeak3/tests.py @@ -7,9 +7,8 @@ from django.core.exceptions import ObjectDoesNotExist from django.db.models import signals from allianceauth.tests.auth_utils import AuthUtils - from .auth_hooks import Teamspeak3Service -from .models import Teamspeak3User, AuthTS, TSgroup +from .models import Teamspeak3User, AuthTS, TSgroup, StateGroup from .tasks import Teamspeak3Tasks from .signals import m2m_changed_authts_group, post_save_authts, post_delete_authts @@ -31,13 +30,14 @@ class Teamspeak3HooksTestCase(TestCase): member = AuthUtils.create_member(self.member) Teamspeak3User.objects.create(user=member, uid=self.member, perm_key='123ABC') self.none_user = 'none_user' - none_user = AuthUtils.create_user(self.none_user) - + AuthUtils.create_user(self.none_user) + state = member.profile.state ts_member_group = TSgroup.objects.create(ts_group_id=1, ts_group_name='Member') - ts_blue_group = TSgroup.objects.create(ts_group_id=2, ts_group_name='Blue') + ts_state_group = TSgroup.objects.create(ts_group_id=2, ts_group_name='State') m2m_member_group = AuthTS.objects.create(auth_group=member.groups.all()[0]) m2m_member_group.ts_group.add(ts_member_group) m2m_member_group.save() + StateGroup.objects.create(state=state, ts_group=ts_state_group) self.service = Teamspeak3Service add_permissions() @@ -60,7 +60,7 @@ class Teamspeak3HooksTestCase(TestCase): instance = manager.return_value.__enter__.return_value service = self.service() service.update_all_groups() - # Check member and blue user have groups updated + # Check user has groups updated self.assertTrue(instance.update_groups.called) self.assertEqual(instance.update_groups.call_count, 1) @@ -74,7 +74,7 @@ class Teamspeak3HooksTestCase(TestCase): self.assertTrue(instance.update_groups.called) args, kwargs = instance.update_groups.call_args # update_groups(user.teamspeak3.uid, groups) - self.assertEqual({'Member': 1}, args[1]) # Check groups + self.assertEqual({'Member': 1, 'State': 2}, args[1]) # Check groups self.assertEqual(self.member, args[0]) # Check uid # Check none user does not have groups updated