mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-15 15:30:16 +02:00
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
import logging
|
|
from django.contrib.auth.models import Group
|
|
from django.db.models.signals import pre_save, post_save
|
|
from django.dispatch import receiver
|
|
|
|
from allianceauth.authentication.signals import state_changed
|
|
|
|
from .models import AuthGroup, ReservedGroupName
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@receiver(pre_save, sender=Group)
|
|
def find_new_name_for_conflicting_groups(sender, instance, **kwargs):
|
|
"""Find new name for a group which name is already reserved."""
|
|
new_name = instance.name
|
|
num = 0
|
|
while ReservedGroupName.objects.filter(name__iexact=new_name).exists():
|
|
num += 1
|
|
new_name = f"{instance.name}_{num}"
|
|
instance.name = new_name
|
|
|
|
|
|
@receiver(post_save, sender=Group)
|
|
def create_auth_group(sender, instance, created, **kwargs):
|
|
"""Create the AuthGroup model when a group is created."""
|
|
if created:
|
|
AuthGroup.objects.create(group=instance)
|
|
|
|
|
|
@receiver(state_changed)
|
|
def check_groups_on_state_change(sender, user, state, **kwargs):
|
|
logger.debug(
|
|
f"Checking group memberships for {user} based on new state {state}"
|
|
)
|
|
state_groups = (
|
|
user.groups.select_related("authgroup").exclude(authgroup__states=None)
|
|
)
|
|
for group in state_groups:
|
|
if not group.authgroup.states.filter(id=state.id).exists():
|
|
logger.info(
|
|
f"Removing user {user} from group {group} due to missing state"
|
|
)
|
|
user.groups.remove(group)
|