diff --git a/allianceauth/groupmanagement/admin.py b/allianceauth/groupmanagement/admin.py index d4d3d659..2fc69ca7 100644 --- a/allianceauth/groupmanagement/admin.py +++ b/allianceauth/groupmanagement/admin.py @@ -4,7 +4,7 @@ from django.db.models.signals import pre_save, post_save, pre_delete, post_delet from django.dispatch import receiver from .models import AuthGroup from .models import GroupRequest - +from . import signals class AuthGroupInlineAdmin(admin.StackedInline): model = AuthGroup @@ -65,4 +65,4 @@ def redirect_post_delete(sender, signal=None, *args, **kwargs): @receiver(m2m_changed, sender=Group.permissions.through) def redirect_m2m_changed_permissions(sender, signal=None, *args, **kwargs): - m2m_changed.send(BaseGroup, *args, **kwargs) \ No newline at end of file + m2m_changed.send(BaseGroup, *args, **kwargs) diff --git a/allianceauth/groupmanagement/signals.py b/allianceauth/groupmanagement/signals.py new file mode 100644 index 00000000..57e3766b --- /dev/null +++ b/allianceauth/groupmanagement/signals.py @@ -0,0 +1,16 @@ +from allianceauth.authentication.signals import state_changed +from .managers import GroupManager +from .models import Group +from django.dispatch import receiver +import logging +logger = logging.getLogger(__name__) + +@receiver(state_changed) +def check_groups_on_state_change(sender, user, state, **kwargs): + logger.debug("Updating auth groups for {}".format(user)) + visible_groups = GroupManager.get_joinable_groups(state) + visible_groups = visible_groups | Group.objects.select_related('authgroup').filter(authgroup__internal=True) + groups = user.groups.all() + for g in groups: + if g not in visible_groups: + user.groups.remove(g) diff --git a/allianceauth/groupmanagement/tests.py b/allianceauth/groupmanagement/tests.py index 42e08a8c..c5344498 100644 --- a/allianceauth/groupmanagement/tests.py +++ b/allianceauth/groupmanagement/tests.py @@ -5,6 +5,7 @@ from allianceauth.tests.auth_utils import AuthUtils from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo, EveCharacter from django.contrib.auth.models import User, Group from allianceauth.groupmanagement.managers import GroupManager +from allianceauth.groupmanagement.signals import check_groups_on_state_change class GroupManagementVisibilityTestCase(TestCase): @classmethod @@ -44,3 +45,48 @@ class GroupManagementVisibilityTestCase(TestCase): self.assertIn(self.group1, groups) #avail due to user self.assertIn(self.group2, groups) #avail due to group1 self.assertNotIn(self.group3, groups) #not avail at all + +class GroupManagementStateTestCase(TestCase): + @classmethod + def setUpTestData(cls): + cls.user = AuthUtils.create_user('test') + AuthUtils.add_main_character(cls.user, 'test character', '1', corp_id='2', corp_name='test_corp', corp_ticker='TEST', alliance_id='3', alliance_name='TEST') + cls.user.profile.refresh_from_db() + cls.alliance = EveAllianceInfo.objects.create(alliance_id='3', alliance_name='test alliance', alliance_ticker='TEST', executor_corp_id='2') + cls.corp = EveCorporationInfo.objects.create(corporation_id='2', corporation_name='test corp', corporation_ticker='TEST', alliance=cls.alliance, member_count=1) + cls.state_group = Group.objects.create(name='state_group') + cls.open_group = Group.objects.create(name='open_group') + cls.state = AuthUtils.create_state('test state', 500) + cls.state_group.authgroup.states.add(cls.state) + cls.state_group.authgroup.internal = False + cls.state_group.save() + + def setUp(self): + self.user.refresh_from_db() + self.state.refresh_from_db() + + def _refresh_user(self): + self.user = User.objects.get(pk=self.user.pk) + + def _refresh_test_group(self): + self.state_group = Group.objects.get(pk=self.state_group.pk) + + def test_drop_state_group(self): + + self.user.groups.add(self.open_group) + self.user.groups.add(self.state_group) + self.assertEqual(self.user.profile.state.name, "Guest") + + self.state.member_corporations.add(self.corp) + self._refresh_user() + self.assertEqual(self.user.profile.state, self.state) + groups = self.user.groups.all() + self.assertIn(self.state_group, groups) #keeps group + self.assertIn(self.open_group, groups) #public group unafected + + self.state.member_corporations.clear() + self._refresh_user() + self.assertEqual(self.user.profile.state.name, "Guest") + groups = self.user.groups.all() + self.assertNotIn(self.state_group, groups) #looses group + self.assertIn(self.open_group, groups) #public group unafected