| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- from __future__ import annotations
- from django.db.models.signals import post_save
- from django.dispatch import receiver
- from django.contrib.auth.models import Group
- from .models import UserProfile
- ROLE_GROUP_MAP = {
- UserProfile.ROLE_OWNER: "owner",
- UserProfile.ROLE_MANAGER: "manager",
- UserProfile.ROLE_DRIVER: "driver",
- UserProfile.ROLE_CUSTOMER: "customer",
- UserProfile.ROLE_AUDITOR: "auditor",
- }
- MANAGED_GROUPS = set(ROLE_GROUP_MAP.values())
- @receiver(post_save, sender=UserProfile)
- def sync_profile_role_to_groups(sender, instance: UserProfile, created: bool, **kwargs):
- """Keep Django Group membership in sync with the profile role.
- - Removes the user from managed role groups (owner/manager/driver/customer/auditor)
- - Adds the user to the group mapped from the current role
- - Lazily creates the Group if missing
- """
- user = instance.user
- if user is None or not getattr(user, "pk", None):
- return
- # Remove from managed groups first (do not touch other unrelated groups)
- current_managed = user.groups.filter(name__in=MANAGED_GROUPS)
- if current_managed.exists():
- user.groups.remove(*current_managed)
- # Add target group for role
- group_name = ROLE_GROUP_MAP.get(instance.role)
- if not group_name:
- return
- group, _ = Group.objects.get_or_create(name=group_name)
- user.groups.add(group)
|