107 lines
3.6 KiB
Python
107 lines
3.6 KiB
Python
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}"
|