import random import string import uuid from django.contrib.auth.base_user import BaseUserManager, AbstractBaseUser from django.contrib.auth.models import Group, PermissionsMixin from django.core.mail import send_mail from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from access.models.other import Invite, Account, UserActivity from lms.global_decorators import transaction_decorator class CustomUserManager(BaseUserManager): use_in_migrations = True def get_or_create(self, email=None, password=None, **kwargs): if not email: raise ValueError('The given email must be set') if password: kwargs["hash_password"] = password kwargs['email'] = self.normalize_email(email) try: return self.get(email=kwargs['email']) except self.model.DoesNotExist: return self._create_user(**kwargs) @transaction_decorator def _create_user(self, email, password=None, is_staff=False, is_superuser=False, role_list=None, is_active=False, first_name='Guest', hash_password=None, is_send=False, date_joined=timezone.now(), last_login=timezone.now(), **extra_fields): if role_list is None: role_list = [] if not email: raise ValueError('The given email must be set') email = self.normalize_email(email) user = self.model(email=email, is_staff=is_staff, is_active=is_active, first_name=first_name, is_superuser=is_superuser, date_joined=date_joined, last_login=last_login, **extra_fields) if not password: password = ''.join(random.choice(string.ascii_letters) for x in range(8)) if not hash_password: user.set_password(password) else: user.password = hash_password user.save(using=self._db) Account.objects.create(owner=user) UserActivity.objects.create(owner=user) if role_list: for group in role_list: user.groups.add(Group.objects.get(name=group)) if is_send and password: invite = Invite.objects.create(owner=user, hash=''.join(random.choice(string.ascii_letters) for x in range(15))) body = { "subject": 'Спасибо за регистрацию', "message": ''' Вы были успешны зарегистрированны на портале go.skillbox.ru ваш пароль %s для подтверждения регистрации перейдите по ссылке https://go.skillbox.ru/api/v1/users/registration/?hash=%s''' %(password, invite.hash), "from_email": 'robo@skillbox.ru', "recipient_list": [user.email], } send_mail( **body ) return user def create_user(self, email, **extra_fields): return self._create_user(email=email, **extra_fields) def create_superuser(self, email, password): return self._create_user(email=email, password=password, is_superuser=True, is_staff=True, is_active=True) def create_student(self, email, **extra_fields): return self.create_user(email=email, role_list=['students'], is_send=True, **extra_fields) class User(AbstractBaseUser, PermissionsMixin): out_key = models.UUIDField(verbose_name="Токен", default=uuid.uuid4, editable=False) in_key = models.UUIDField(verbose_name="Токен", default=uuid.uuid4, editable=False) email = models.EmailField(_('email address'), unique=True) first_name = models.CharField(_('first name'), max_length=63, blank=True, default='Гость') last_name = models.CharField(_('last name'), max_length=63, blank=True) date_joined = models.DateTimeField(_('date joined')) is_staff = models.BooleanField(verbose_name='флаг персонала', default=False, help_text='Определяет разрешение пользователя на вход в административную часть.') is_active = models.BooleanField(verbose_name='активен', default=False, help_text='Определяет активен ли пользователь в системе. Снимите флаг, ' 'вместо удаления пользователя.') is_blocked = models.BooleanField(verbose_name='заблочен', default=False, help_text='Определяет заблокирован ли пользователь. Поставьте флаг, ' 'если знаете, что это нехороший человек.') objects = CustomUserManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] def get_full_name(self): full_name = '%s %s' % (self.first_name, self.last_name) return full_name.strip() def get_short_name(self): return self.first_name class Meta: verbose_name = _('Пользователь') verbose_name_plural = _('Пользователи')