Files

106 lines
3.7 KiB
Python
Raw Permalink 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.
# -*- 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