Files
cetana-backend/apps/rbac/models.py
T
2026-09-24 12:32:59 +03:30

43 lines
1.4 KiB
Python

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")
]