Реализовал систему разрешений

This commit is contained in:
2025-12-15 11:45:25 +03:00
parent ca7709ebff
commit 46dc79b93f
33 changed files with 1340 additions and 124 deletions

View File

@@ -24,6 +24,37 @@ def get_default_standard():
return obj.id
def get_permission_choices():
"""Ленивая загрузка choices для избежания циклического импорта."""
from .permissions import PERMISSION_CHOICES
return PERMISSION_CHOICES
class UserPermission(models.Model):
"""
Модель разрешения пользователя.
Хранит гранулярные разрешения для конкретных действий в системе.
"""
code = models.CharField(
max_length=50,
verbose_name="Код разрешения",
db_index=True,
help_text="Уникальный код разрешения",
)
def __str__(self):
from .permissions import PERMISSION_CHOICES
choices_dict = dict(PERMISSION_CHOICES)
return choices_dict.get(self.code, self.code)
class Meta:
verbose_name = "Разрешение"
verbose_name_plural = "Разрешения"
ordering = ["code"]
class CustomUser(models.Model):
"""
Расширенная модель пользователя с ролями.
@@ -54,6 +85,22 @@ class CustomUser(models.Model):
db_index=True,
help_text="Роль пользователя в системе",
)
# Индивидуальные разрешения (если пусто - используются права роли по умолчанию)
user_permissions = models.ManyToManyField(
UserPermission,
related_name="users",
verbose_name="Индивидуальные разрешения",
blank=True,
help_text="Если указаны - используются вместо прав роли по умолчанию",
)
# Флаг использования индивидуальных разрешений
use_custom_permissions = models.BooleanField(
default=False,
verbose_name="Использовать индивидуальные разрешения",
help_text="Если включено - используются индивидуальные разрешения вместо прав роли",
)
def __str__(self):
return (
@@ -61,6 +108,19 @@ class CustomUser(models.Model):
if self.user.first_name and self.user.last_name
else self.user.username
)
def has_perm(self, permission_code):
"""
Проверяет наличие разрешения у пользователя.
Args:
permission_code: Код разрешения
Returns:
bool: True если пользователь имеет разрешение
"""
from .permissions import has_permission
return has_permission(self.user, permission_code)
class Meta:
verbose_name = "Пользователь"