from django.db import models from lms.global_decorators import transaction_decorator class CourseRoute(models.Model): """ Объединение нескольких мап курса, одназначно определяет способ прохождения по курсу. """ name = models.CharField(max_length=255, verbose_name='Имя шаблона', blank=True, null=True, unique=True) is_template = models.BooleanField(default=True, verbose_name='Может ли быть использован как шаблон') def is_finish(self, user): return bool(sum([int(i.map_course.is_finish(user)) for i in self.pivotcoursemap_set.all()])) def get_active_objects(self, user): return (i.map_course.getactive_object(user) for i in self.pivotcoursemap_set.all()) def get_view(self): return (i.map_course for i in self.pivotcoursemap_set.all()) class Meta: verbose_name = 'Маршрут прохождения' verbose_name_plural = 'Маршруты прохождения' class CourseMap(models.Model): """ Способы отображения курса. Упорядочены в порядке возрастания приоретета. """ course = models.ForeignKey(to='courses.Course', verbose_name='К какому курсу привязан') @transaction_decorator def add_vertex(self, vertex, sort): if sort > self.pivotvertex_set.count()+1: raise ValueError("list index out of range") for i in self.pivotvertex_set.filter(sort__gte=sort): i.sort += 1 i.save() pivot = PivotVertex.objects.create(vertex=vertex, sort=sort, map_course=self) pivot.save() return pivot def merge(self, another): return # TODO: Доделать!!! def get_difference(self, user) -> list: return list(set( [i.vertex for i in self.pivotvertex_set.all()]).difference(set(user.progress.progress_list.all()) )) def is_finish(self, user) -> bool: return self.get_difference(user) == [] def get_active_object(self, user): return self.pivotvertex_set.exclude(vertex__in=self.get_difference(user))[0] class Meta: verbose_name = 'Карта линейного прохождения курсов' verbose_name_plural = 'Карты линейного прохождения курсов' class PivotCourseMap(models.Model): route = models.ForeignKey(to=CourseRoute, verbose_name="К какому узлу") sort = models.SmallIntegerField(verbose_name='Порядок сортировки', unique=True) map_course = models.ForeignKey(to=CourseMap, verbose_name='К какой сортеровке имеетотношение', blank=True, null=True) class Meta: verbose_name = 'Порядок сортировки узла' verbose_name_plural = 'Порядки сортировок узла' unique_together = (('map_course', 'route'),) ordering = ('sort', ) class PivotVertex(models.Model): vertex = models.ForeignKey(to='courses.Vertex', verbose_name="К какому узлу") sort = models.SmallIntegerField(verbose_name='Порядок сортировки', unique=True) map_course = models.ForeignKey(to=CourseMap, verbose_name='К какой сортеровке имеетотношение', blank=True, null=True) class Meta: verbose_name = 'Порядок сортировки узла' verbose_name_plural = 'Порядки сортировок узла' unique_together = (('map_course', 'vertex'),) ordering = ('sort', )