from django.conf import settings from django.contrib.postgres.fields import ArrayField from django.db import models from model_utils import Choices class Progress(models.Model): hidden_lessons = ArrayField( models.UUIDField(verbose_name="Токен урока", unique=True, editable=False), default=[], verbose_name='Список скрытых уроков', ) 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) 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) comment_tokens = ArrayField(models.UUIDField(verbose_name="Токен комента", editable=False), default=[]) def __str__(self): return self.progress.user.email class Meta: verbose_name = 'Прохождение уроков' verbose_name_plural = 'Прохождение урока' unique_together = ('progress', 'lesson_token')