from django.db import models from apps.core.models import TimeStampedModel, UUIDModel class Permission(UUIDModel): code = models.CharField(max_length=120, unique=True) description = models.CharField(max_length=255, blank=True) def __str__(self) -> str: return self.code class Role(UUIDModel, TimeStampedModel): name = models.CharField(max_length=120) slug = models.SlugField(max_length=120, unique=True) description = models.CharField(max_length=255, blank=True) permissions = models.ManyToManyField(Permission, through="RolePermission", related_name="roles", blank=True) def __str__(self) -> str: return self.name class RolePermission(UUIDModel): role = models.ForeignKey(Role, on_delete=models.CASCADE) permission = models.ForeignKey(Permission, on_delete=models.CASCADE) class Meta: constraints = [ models.UniqueConstraint(fields=["role", "permission"], name="uniq_role_permission") ] class UserRole(UUIDModel, TimeStampedModel): user = models.ForeignKey("accounts.User", on_delete=models.CASCADE, related_name="user_roles") role = models.ForeignKey(Role, on_delete=models.CASCADE, related_name="user_roles") scope = models.JSONField(default=dict, blank=True) class Meta: constraints = [ models.UniqueConstraint(fields=["user", "role"], name="uniq_user_role") ]