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.
 
 
 
 
 
 

128 lines
5.5 KiB

import random
import string
import uuid
from django.conf import settings
from django.contrib.auth.base_user import BaseUserManager, AbstractBaseUser
from django.contrib.auth.models import Group, PermissionsMixin
from django.core.mail import send_mail, EmailMessage
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": 'Спасибо за регистрацию',
"body": '''
Вы были успешны зарегистрированны на портале go.skillbox.ru
ваш пароль (он будет дествителен после активации по ссылке) %s
для подтверждения регистрации перейдите по ссылке
%s/api/v1/users/registration/?hash=%s''' % (password, settings.DOMAIN, invite.hash),
"from_email": 'robo@skillbox.ru',
"to": [user.email],
"bcc": [settings.SUPPORT_EMAIL],
}
EmailMessage(
**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 = _('Пользователи')