You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
5.2 KiB
124 lines
5.2 KiB
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
|
|
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)
|
|
|
|
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, primary_key=True, 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 = _('Пользователи') |