from django.db import models from django.conf import settings from django.utils import timezone class Role(models.Model): """ Роль пользователя. ВАЖНО: Модель находится в TENANT_APPS, поэтому автоматически изолируется по тенантам через django-tenants. Каждый тенант имеет свой набор ролей в своей PostgreSQL schema. Не нужно явно связывать с тенантом через FK - изоляция происходит автоматически! """ PLATFORM_SUPPORT = 'platform_support' OWNER = 'owner' MANAGER = 'manager' FLORIST = 'florist' COURIER = 'courier' ROLE_CHOICES = [ (PLATFORM_SUPPORT, 'Техподдержка платформы'), (OWNER, 'Владелец'), (MANAGER, 'Менеджер'), (FLORIST, 'Флорист'), (COURIER, 'Курьер'), ] # Роли, скрытые от пользователей тенанта (не отображаются в списках) HIDDEN_ROLES = [PLATFORM_SUPPORT] code = models.CharField( max_length=20, choices=ROLE_CHOICES, unique=True, verbose_name="Код роли" ) name = models.CharField( max_length=100, verbose_name="Название" ) description = models.TextField( blank=True, verbose_name="Описание" ) is_system = models.BooleanField( default=True, verbose_name="Системная роль", help_text="Системные роли нельзя удалить" ) created_at = models.DateTimeField(auto_now_add=True) class Meta: verbose_name = "Роль" verbose_name_plural = "Роли" ordering = ['code'] def __str__(self): return self.name class UserRole(models.Model): """ Роль пользователя в текущем тенанте. ВАЖНО: Эта модель НЕ связывает пользователя с тенантом! Связь с тенантом обеспечивается автоматически через django-tenants (модель в TENANT_APPS = находится в schema тенанта). UserRole просто говорит: "этот пользователь имеет эту роль" (в рамках текущего тенанта). Один пользователь = одна роль в рамках одного тенанта. """ user = models.OneToOneField( 'accounts.CustomUser', on_delete=models.CASCADE, related_name='tenant_role', verbose_name="Пользователь", help_text="Пользователь тенанта (из tenant schema)" ) role = models.ForeignKey( Role, on_delete=models.PROTECT, related_name='users', verbose_name="Роль" ) created_at = models.DateTimeField(auto_now_add=True) created_by = models.ForeignKey( 'accounts.CustomUser', null=True, blank=True, on_delete=models.SET_NULL, related_name='created_user_roles', verbose_name="Создал" ) is_active = models.BooleanField( default=True, verbose_name="Активен" ) class Meta: verbose_name = "Роль пользователя" verbose_name_plural = "Роли пользователей" def __str__(self): return f"{self.user.email} - {self.role.name}"