You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

86 lines
3.6 KiB

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', )