Initial commit: Django inventory system
This commit is contained in:
81
myproject/accounts/models.py
Normal file
81
myproject/accounts/models.py
Normal file
@@ -0,0 +1,81 @@
|
||||
from django.db import models
|
||||
from django.contrib.auth.models import AbstractUser, BaseUserManager
|
||||
from django.utils import timezone
|
||||
import uuid
|
||||
|
||||
|
||||
class CustomUserManager(BaseUserManager):
|
||||
def create_user(self, email, name, password=None, **extra_fields):
|
||||
if not email:
|
||||
raise ValueError('Email обязателен')
|
||||
email = self.normalize_email(email)
|
||||
# Generate a unique username based on email to satisfy the AbstractUser constraint
|
||||
username = email
|
||||
user = self.model(email=email, name=name, username=username, **extra_fields)
|
||||
user.set_password(password)
|
||||
user.save(using=self._db)
|
||||
return user
|
||||
|
||||
def create_superuser(self, email, name, password=None, **extra_fields):
|
||||
extra_fields.setdefault('is_staff', True)
|
||||
extra_fields.setdefault('is_superuser', True)
|
||||
extra_fields.setdefault('is_active', True)
|
||||
# Суперпользователь автоматически имеет подтвержденный email
|
||||
extra_fields.setdefault('is_email_confirmed', True)
|
||||
|
||||
if extra_fields.get('is_staff') is not True:
|
||||
raise ValueError('Суперпользователь должен иметь is_staff=True.')
|
||||
if extra_fields.get('is_superuser') is not True:
|
||||
raise ValueError('Суперпользователь должен иметь is_superuser=True.')
|
||||
|
||||
user = self.create_user(email, name, password, **extra_fields)
|
||||
# Устанавливаем дату подтверждения email
|
||||
if user.is_email_confirmed and not user.email_confirmed_at:
|
||||
user.email_confirmed_at = timezone.now()
|
||||
user.save()
|
||||
return user
|
||||
|
||||
|
||||
class CustomUser(AbstractUser):
|
||||
email = models.EmailField(unique=True)
|
||||
name = models.CharField(max_length=100)
|
||||
is_email_confirmed = models.BooleanField(default=False)
|
||||
email_confirmation_token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
|
||||
email_confirmed_at = models.DateTimeField(null=True, blank=True)
|
||||
password_reset_token = models.UUIDField(null=True, blank=True, editable=False, unique=True)
|
||||
|
||||
USERNAME_FIELD = 'email'
|
||||
REQUIRED_FIELDS = ['name']
|
||||
|
||||
objects = CustomUserManager() # Добавляем кастомный менеджер
|
||||
|
||||
# Изменяем related_name для избежания конфликта с встроенной моделью User
|
||||
groups = models.ManyToManyField(
|
||||
'auth.Group',
|
||||
related_name='custom_user_set',
|
||||
blank=True,
|
||||
verbose_name='groups',
|
||||
help_text='The groups this user belongs to.',
|
||||
)
|
||||
user_permissions = models.ManyToManyField(
|
||||
'auth.Permission',
|
||||
related_name='custom_user_set',
|
||||
blank=True,
|
||||
verbose_name='user permissions',
|
||||
help_text='Specific permissions for this user.',
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return self.email
|
||||
|
||||
def generate_confirmation_token(self):
|
||||
"""Генерирует новый токен для подтверждения email"""
|
||||
self.email_confirmation_token = uuid.uuid4()
|
||||
self.save()
|
||||
return self.email_confirmation_token
|
||||
|
||||
def confirm_email(self):
|
||||
"""Подтверждает email пользователя"""
|
||||
self.is_email_confirmed = True
|
||||
self.email_confirmed_at = timezone.now()
|
||||
self.save()
|
||||
Reference in New Issue
Block a user