Files
octopus/myproject/user_roles/models.py

107 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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}"