""" Модели пользователей и разрешений. """ from django.contrib.auth.models import User from django.db import models 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): """ Расширенная модель пользователя с ролями. Добавляет систему ролей к стандартной модели User Django. """ ROLE_CHOICES = [ ("admin", "Администратор"), ("moderator", "Модератор"), ("user", "Пользователь"), ] # Связи user = models.OneToOneField( User, on_delete=models.CASCADE, verbose_name="Пользователь", help_text="Связанный пользователь Django", ) # Основные поля role = models.CharField( max_length=20, choices=ROLE_CHOICES, default="user", verbose_name="Роль пользователя", 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 ( f"{self.user.first_name} {self.user.last_name}" 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 = "Пользователь" verbose_name_plural = "Пользователи" ordering = ["user__username"]