import uuid from django.conf import settings from django.contrib.postgres.fields import ArrayField from django.db import models from model_utils import Choices from django.utils import timezone from lms.tools import get_empty_list class OpenToken(models.Model): token = models.UUIDField(verbose_name="Токен", editable=False, default=uuid.uuid4,) email = models.CharField(max_length=255, verbose_name="email пользователя") course_token = models.UUIDField(verbose_name="Токен курса", editable=False) period_days = models.SmallIntegerField(verbose_name="Период (в днях)", default=3) date = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания") def __str__(self): return "Токен для пользователя %s от %s" % (self.email, self.date) class Meta: verbose_name = 'Токен на открытие курса' verbose_name_plural = 'Токены на открытие курса' unique_together = (("email", "course_token"),) class Progress(models.Model): teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь по умолчанию", related_name='teacher_progress') user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент') course_token = models.UUIDField(verbose_name="Токен курса", editable=False) is_finish = models.BooleanField(verbose_name="Окончен ли курс", default=False) is_freeze = models.BooleanField(verbose_name="Прохождение было преостановленно", default=False) only_watch = models.BooleanField(verbose_name="Только просмотр", default=False) exp_date = models.DateTimeField(verbose_name='Дата сгорания', blank=True, null=True) def progress_status(self, sorted_token_list): """ Возвращает порядок активной темы и урока или ничего :return: (topic_sort, lesson_sort) or None """ token_list = [i.lesson_token for i in self.progresslesson_set.filter(status='done')] x = (1, 1) for idx_topic, lesson_list in enumerate(sorted_token_list): for idx_lesson, lesson_token in enumerate(lesson_list): if lesson_token in token_list: x = None elif x is None: x = (idx_topic+1, idx_lesson+1) return x def __str__(self): return '%s' % (self.user.email,) class Meta: verbose_name = 'Прогресс пользователя' verbose_name_plural = 'Прогресс пользователя' unique_together = (("user", "course_token"),) class ProgressLesson(models.Model): STATUSES = Choices('start', 'done', 'wait', 'fail') progress = models.ForeignKey(to=Progress) lesson_token = models.UUIDField(verbose_name="Токен урока", editable=False) checker = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь", ) finish_date = models.DateTimeField(verbose_name='Дата зачтения задания', blank=True, null=True) start_date = models.DateTimeField(verbose_name='Дата начала прохождения задания', auto_now_add=True) status = models.CharField(choices=STATUSES, default=STATUSES.start, max_length=20) last_update = models.DateTimeField(verbose_name='Дата последней сдачи', auto_now_add=True) comment_tokens = ArrayField(models.UUIDField(verbose_name="Токен комента", editable=False), default=get_empty_list) dif_check_timestamps = ArrayField( models.IntegerField( verbose_name="Время проверки" ), verbose_name='Временные интервалы проверок', default=get_empty_list, ) def __init__(self, *args, **kwargs): super(ProgressLesson, self).__init__(*args, **kwargs) self.old_status = self.status def save(self, force_insert=False, force_update=False, **kwargs): if self.status == 'wait' and (self.old_status == 'start' or self.old_status == 'fail'): self.last_update = timezone.now() if self.old_status == 'wait' and (self.status == 'fail' or self.status == 'done'): dif = int(timezone.now().timestamp() - self.last_update.timestamp()) self.dif_check_timestamps.append(dif) super(ProgressLesson, self).save(force_insert, force_update, **kwargs) self.old_status = self.status def __str__(self): return self.progress.user.email class Meta: verbose_name = 'Прохождение уроков' verbose_name_plural = 'Прохождение урока' unique_together = ('progress', 'lesson_token')