Tweaked indent, added 2 user methods and 2 receivers for organization

This commit is contained in:
Viswamedha Nalabotu 2026-03-08 12:19:36 +00:00
parent af104f51f3
commit 31332c518b

View file

@ -1,11 +1,11 @@
from typing import ClassVar from typing import ClassVar
from uuid import uuid4
from datetime import timedelta from datetime import timedelta
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.core.exceptions import ValidationError
from django.db import transaction from django.db import transaction
from django.db.models import BooleanField, CASCADE, CharField, DateField, DateTimeField, EmailField, ForeignKey, IntegerField, ManyToManyField, Model, TextField, UUIDField from django.db.models import BooleanField, CASCADE, CharField, DateField, DateTimeField, EmailField, ForeignKey, IntegerField, ManyToManyField, Model, TextField
from django.db.models.signals import post_delete, post_save from django.db.models.signals import m2m_changed, post_delete, post_save
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils import timezone from django.utils import timezone
@ -44,6 +44,12 @@ class User(AbstractBaseUser, IdentifierMixin, TimeStampMixin, PermissionsMixin):
def full_name(self) -> str: def full_name(self) -> str:
return f"{self.first_name} {self.last_name}" return f"{self.first_name} {self.last_name}"
def is_owner_of(self, organization: 'Organization') -> bool:
return organization.owner.id == self.id
def is_member_of(self, organization: 'Organization') -> bool:
return organization.members.filter(id=self.id).exists()
def __str__(self) -> str: def __str__(self) -> str:
return self.full_name return self.full_name
@ -165,3 +171,18 @@ def create_default_agents_for_role(sender, instance: Role, created: bool, **kwar
def delete_role_agents_on_role_delete(sender, instance: Role, **kwargs): def delete_role_agents_on_role_delete(sender, instance: Role, **kwargs):
from apps.onboarding.models import AgentConfig from apps.onboarding.models import AgentConfig
AgentConfig.objects.filter(role=instance).delete() AgentConfig.objects.filter(role=instance).delete()
@receiver(post_save, sender=Organization)
def ensure_owner_is_member(sender, instance: Organization, **kwargs):
if instance.owner.id and not instance.members.filter(id=instance.owner.id).exists():
instance.members.add(instance.owner)
@receiver(m2m_changed, sender=Organization.members.through)
def prevent_owner_from_being_removed(sender, instance: Organization, action: str, pk_set, **kwargs):
if action == 'pre_remove' and instance.owner.id in (pk_set or set()):
raise ValidationError(_('Organization owner must remain a member.'))
if action in ['post_add', 'post_remove', 'post_clear']:
if instance.owner.id and not instance.members.filter(id=instance.owner.id).exists():
instance.members.add(instance.owner)