# -*- coding: utf-8 -*- """ Модели для администраторов платформы. PlatformAdmin - отдельная сущность для управления тенантами, живёт только в public schema и не связана с CustomUser. """ from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.utils import timezone class PlatformAdminManager(BaseUserManager): """Менеджер для модели PlatformAdmin.""" def create_user(self, email, name, password=None, **extra_fields): """ Создаёт обычного администратора платформы. """ if not email: raise ValueError('Email обязателен') email = self.normalize_email(email) extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_active', True) user = self.model(email=email, name=name, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, name, password=None, **extra_fields): """ Создаёт суперадминистратора платформы. Суперадмин может: - Управлять всеми тенантами - Входить в /admin/ на tenant доменах для поддержки """ extra_fields['is_superuser'] = True extra_fields['is_staff'] = True return self.create_user(email, name, password, **extra_fields) class PlatformAdmin(AbstractBaseUser, PermissionsMixin): """ Администратор платформы для управления тенантами. Живёт ТОЛЬКО в public schema. НЕ имеет доступа к бизнес-данным тенантов (только управление). НЕ связан с UserRole и ролевой системой тенантов. Используется для: - Управления тенантами (Client) - Одобрения заявок на регистрацию (TenantRegistration) - Управления подписками (Subscription) - Управления доменами (Domain) Суперадмин (is_superuser=True) дополнительно может: - Входить в /admin/ на tenant доменах для поддержки клиентов """ email = models.EmailField( unique=True, verbose_name="Email" ) name = models.CharField( max_length=200, verbose_name="Имя" ) is_staff = models.BooleanField( default=True, verbose_name="Доступ к админке", help_text="Определяет, может ли пользователь входить в Django Admin" ) is_active = models.BooleanField( default=True, verbose_name="Активен" ) date_joined = models.DateTimeField( default=timezone.now, verbose_name="Дата регистрации" ) last_login = models.DateTimeField( null=True, blank=True, verbose_name="Последний вход" ) objects = PlatformAdminManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['name'] class Meta: verbose_name = "Администратор платформы" verbose_name_plural = "Администраторы платформы" def __str__(self): return f"{self.name} ({self.email})" def get_full_name(self): return self.name def get_short_name(self): return self.name.split()[0] if self.name else self.email