43 lines
1.4 KiB
Python
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")
|
|
]
|