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.
 
 
 
 
 
 

204 lines
8.1 KiB

# encoding=utf-8
import random
import string
from django.contrib.contenttypes.models import ContentType
from django_celery_results.models import TaskResult
from courses.models import Vertex, Course
from storage.models import Storage
from django.core.mail import send_mail
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin, Group
from django.db import models
from django.conf import settings
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from lms.global_decorators import transaction_decorator
from journals.models import Journal, Thread, ACTION_CHOICES
class Invite(models.Model):
owner = models.OneToOneField(to=settings.AUTH_USER_MODEL)
hash = models.CharField(max_length=15)
date = models.DateTimeField(null=True, blank=True)
class Meta:
verbose_name = 'Приглошение в систему'
verbose_name_plural = 'Приглошения в систему'
class Account(models.Model):
GENDER_CHOICES = (
(0, 'undefined'),
(1, 'male'),
(2, 'female'),
)
b_day = models.DateField(blank=True, null=True)
city = models.CharField(max_length=63, null=True, blank=True)
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0)
owner = models.OneToOneField(to=settings.AUTH_USER_MODEL)
photo = models.ImageField(null=True, blank=True, default='/static/default/access/default.png', upload_to='user/photo/')
phone = models.CharField(max_length=15, null=True, blank=True)
def __str__(self):
return self.owner.email
class Meta:
verbose_name = 'Дополнительная информация о пользователе'
verbose_name_plural = 'Дополнительная информация о пользователе'
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)
thread = Thread.objects.create(
key="""user_%s""" % user.id,
text="""Приватный тред пользователя %s""" % user.email,
is_recurse=True,
)
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)
thread.subscribers.add(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):
email = models.EmailField(_('email address'), unique=True)
first_name = models.CharField(_('first name'), max_length=63, blank=True, default='Guest')
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
def get_thread(self):
Thread.objects.get(key="""user_%s""" % self.id,)
class Meta:
verbose_name = _('Пользователь')
verbose_name_plural = _('Пользователи')
class Progress(models.Model):
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент')
course = models.ForeignKey(to=Course, verbose_name='Курс')
active_obj = models.ForeignKey(to=Vertex, verbose_name='Активный объект', blank=True, null=True)
success = models.BooleanField(default=False, verbose_name='Завершён ли курс')
def __str__(self):
return '%s %s %s' % (
self.user.email,
('завершил курс' if self.success else 'в процессе изучения курса'),
self.course.title,
)
def is_access(self, vertex):
return not vertex.is_more(self.active_obj)
class Meta:
verbose_name = 'Прогресс пользователя'
verbose_name_plural = 'Прогресс пользователя'
unique_together = ("user", "course")
class ExtraPrivilege(models.Model):
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Правообладатель')
is_done = models.BooleanField(default=False, verbose_name='Выполнено?')
subject = models.ForeignKey(to=Vertex, verbose_name='Объект')
class Meta:
verbose_name = 'Доп право'
verbose_name_plural = 'Доп права пользователя'