from django.conf import settings from django.db import models from courses.models import Course, Vertex from maps.models import CourseRoute from django.db.models import Q class Invite(models.Model): owner = models.OneToOneField(to=settings.AUTH_USER_MODEL, null=True) 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, 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): user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент', null=True) course = models.ForeignKey(to=Course, verbose_name='Курс', null=True) progress_list = models.ManyToManyField(to=Vertex, verbose_name='Лист пройденных объектов', blank=True) template = models.OneToOneField(to=CourseRoute, blank=True, null=True, verbose_name='Шаблон для прохождения если ' 'не указан явно смотри ' 'функцию get_template()') def __str__(self): return '%s %s' % ( self.user.email, self.course.title, ) def add_vertex(self, 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) parent.children.filter(_flt) 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", "course"),)