Allow mapping of states to Teamspeak3 groups.

Addresses #950

Happy now, @colcrunch ?
This commit is contained in:
Adarnof 2018-02-23 01:22:51 -05:00
parent 8dd3a25b52
commit f5abf82b95
6 changed files with 53 additions and 9 deletions

View File

@ -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)

View File

@ -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')),
],
),
]

View File

@ -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)

View File

@ -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)

View File

@ -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:

View File

@ -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