from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.db import models from core.mixins import ContactMixin class Role(models.Model): name = models.CharField(max_length=20, unique=True, verbose_name='Название роли') def __str__(self): return self.name class Meta: verbose_name = 'Роль' verbose_name_plural = 'Роли' class UserAccountManager(BaseUserManager): def create_user(self, username, password=None, role=None, **extra_fields): if not username: raise ValueError('Имя пользователя должно быть указано') user = self.model(username=username, role=role, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, password=None, **extra_fields): admin_role, _ = Role.objects.get_or_create(name='admin') extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(username, password, role=admin_role, **extra_fields) class UserAccount(ContactMixin, AbstractBaseUser, PermissionsMixin): username = models.CharField(max_length=150, unique=True, verbose_name='Имя пользователя') role = models.ForeignKey(Role, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Роль') is_active = models.BooleanField(default=True, verbose_name='Активен') is_staff = models.BooleanField(default=False, verbose_name='Сотрудник') objects = UserAccountManager() USERNAME_FIELD = 'username' REQUIRED_FIELDS = [] def __str__(self): return self.username+" ("+ContactMixin.__str__(self)+")" class Meta: verbose_name = 'Пользователь' verbose_name_plural = 'Пользователи'