From 8c33349dcb23377d675e7f1a16c3efdc9c4a4b68 Mon Sep 17 00:00:00 2001 From: Aaron Kable Date: Tue, 7 Jan 2020 02:41:18 +0000 Subject: [PATCH] Purge groups not available to member on state change --- allianceauth/groupmanagement/admin.py | 4 ++-- allianceauth/groupmanagement/signals.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 allianceauth/groupmanagement/signals.py diff --git a/allianceauth/groupmanagement/admin.py b/allianceauth/groupmanagement/admin.py index 09d2aaa1..b122980b 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)