from django.conf import settings from django.contrib.postgres.fields import ArrayField from django.db import models from django.db.models import Q from course_service.courses.models import Course, Vertex from course_service.maps.models import CourseRoute from lms.global_decorators import transaction_decorator class Invite(models.Model): owner = models.OneToOneField(to=settings.AUTH_USER_MODEL, verbose_name="Кому приглошение", null=True, unique=True) hash = models.CharField(verbose_name="Уникальный код", max_length=15, unique=True) date = models.DateTimeField(verbose_name="Дата сгорания приглошения", null=True, blank=True) class Meta: verbose_name = 'Приглошение в систему' verbose_name_plural = 'Приглошения в систему' class ResetPassword(Invite): password = models.CharField(max_length=63, verbose_name="Новый пароль, если есть") 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, null=True) 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 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='Студент', null=True) template = models.CharField(max_length=15, verbose_name='Токен прохождения') def __str__(self): return '%s' % (self.user.email,) @transaction_decorator def add_vertex(self, vertex): PivotProgressVertex.objects.create( progress=self, vertex=vertex, ) self.progress_list.add(vertex) parent = vertex.vertex_set.first() if vertex.vertex_set.all().exists() else None if parent: children_ids = self.progress_list.values_list('id', flat=True) _flt = ~Q(id__in=children_ids) if parent.children.filter(_flt).exists(): self.progress_list.add(parent) def get_template(self): return self.template if self.template else self.course.route def is_finish(self): return self.get_template().is_finish(self.user) def get_objects_in_progress(self): return self.get_template().get_active_objects(self.user) def is_access(self, vertex): return vertex in self.progress_list.all() or vertex in self.get_objects_in_progress() class Meta: verbose_name = 'Прогресс пользователя' verbose_name_plural = 'Прогресс пользователя' unique_together = (("user", "template"),) class PivotProgressVertex(models.Model): VERTEX_STATUS = ( (2, 'Выполненно'), (1, 'Ожидание'), (0, 'Не выполненно'), ) teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь по умолчанию", blank=True, null=True) progress = models.ForeignKey(to=Progress) vertex = ArrayField(models.CharField(max_length=15, blank=True, verbose_name='Ссылки на узлы', unique=True),) status = models.SmallIntegerField(choices=VERTEX_STATUS, default=0) comment = ArrayField(models.CharField(max_length=15, blank=True, verbose_name='Ссылки на комменты', unique=True),)