|
|
|
@ -73,20 +73,20 @@ class CourseManager(models.Manager): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Course(models.Model): |
|
|
|
class Course(models.Model): |
|
|
|
hidden = models.BooleanField(verbose_name='Видно только оплатившим', default=False) |
|
|
|
|
|
|
|
level = models.CharField(verbose_name='Уровень', choices=COURSE_LEVEL, default='B', max_length=3) |
|
|
|
|
|
|
|
slug = models.SlugField(unique=True, editable=False, max_length=127) |
|
|
|
slug = models.SlugField(unique=True, editable=False, max_length=127) |
|
|
|
direction = models.SmallIntegerField(choices=COURSE_DIRECTION, verbose_name='Направление') |
|
|
|
|
|
|
|
public = models.BooleanField(verbose_name='Опубликовать', default=False) |
|
|
|
|
|
|
|
title = models.CharField(verbose_name="Заголовок", max_length=255, unique=True) |
|
|
|
title = models.CharField(verbose_name="Заголовок", max_length=255, unique=True) |
|
|
|
description = models.TextField(verbose_name='Описание', blank=True) |
|
|
|
description = models.TextField(verbose_name='Описание', blank=True) |
|
|
|
|
|
|
|
level = models.CharField(verbose_name='Уровень', choices=COURSE_LEVEL, default='B', max_length=3) |
|
|
|
|
|
|
|
direction = models.SmallIntegerField(choices=COURSE_DIRECTION, verbose_name='Направление') |
|
|
|
|
|
|
|
public = models.BooleanField(verbose_name='Опубликовать', default=False) |
|
|
|
|
|
|
|
route = models.OneToOneField(to=CourseRoute, verbose_name="Порядок прохождения по умолчанию", blank=True, null=True) |
|
|
|
|
|
|
|
teachers = ArrayField( |
|
|
|
|
|
|
|
models.CharField(max_length=15, blank=True, verbose_name='Ссылки на преподов'), default=[]) |
|
|
|
image = models.URLField(verbose_name='Изображение', blank=True, max_length=255) |
|
|
|
image = models.URLField(verbose_name='Изображение', blank=True, max_length=255) |
|
|
|
big_image = models.URLField(verbose_name='Большое изображение', blank=True, max_length=255) |
|
|
|
big_image = models.URLField(verbose_name='Большое изображение', blank=True, max_length=255) |
|
|
|
big_mobile_image = models.URLField(verbose_name='Под мобилку', blank=True, |
|
|
|
big_mobile_image = models.URLField(verbose_name='Под мобилку', blank=True, |
|
|
|
help_text='Большая картинка для мобильной версии', max_length=255) |
|
|
|
help_text='Большая картинка для мобильной версии', max_length=255) |
|
|
|
teachers = ArrayField( |
|
|
|
hidden = models.BooleanField(verbose_name='Видно только оплатившим', default=False) |
|
|
|
models.CharField(max_length=15, blank=True, verbose_name='Ссылки на преподов'), default=[]) |
|
|
|
|
|
|
|
route = models.OneToOneField(to=CourseRoute, verbose_name="Порядок прохождения по умолчанию", blank=True, null=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
def __str__(self): |
|
|
|
return self.title |
|
|
|
return self.title |
|
|
|
@ -105,10 +105,10 @@ class Course(models.Model): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Topic(models.Model): |
|
|
|
class Topic(models.Model): |
|
|
|
|
|
|
|
course = models.ForeignKey(to=Course, verbose_name='курс') |
|
|
|
title = models.CharField(verbose_name='Название', max_length=255) |
|
|
|
title = models.CharField(verbose_name='Название', max_length=255) |
|
|
|
icon = models.ImageField(verbose_name='Иконка темы', null=True, blank=True) |
|
|
|
|
|
|
|
description = models.TextField(verbose_name='Описание', blank=True, null=True) |
|
|
|
description = models.TextField(verbose_name='Описание', blank=True, null=True) |
|
|
|
course = models.ForeignKey(to=Course, verbose_name='курс') |
|
|
|
icon = models.ImageField(verbose_name='Иконка темы', null=True, blank=True) |
|
|
|
|
|
|
|
|
|
|
|
class Meta: |
|
|
|
class Meta: |
|
|
|
verbose_name = "Тема" |
|
|
|
verbose_name = "Тема" |
|
|
|
@ -116,20 +116,24 @@ class Topic(models.Model): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Vertex(models.Model): |
|
|
|
class Vertex(models.Model): |
|
|
|
|
|
|
|
# TODO переименовать в Lesson |
|
|
|
|
|
|
|
token = models.CharField(max_length=15, verbose_name="Ключ доступа к узлу", unique=True, editable=False) |
|
|
|
|
|
|
|
topic = models.ForeignKey(to=Topic, verbose_name='Тема') |
|
|
|
|
|
|
|
title = models.CharField(verbose_name='Название', max_length=255) |
|
|
|
|
|
|
|
description = models.TextField(verbose_name='Описание', blank=True, null=True) |
|
|
|
|
|
|
|
video = models.TextField(verbose_name='Код видео', blank=True, null=True) |
|
|
|
|
|
|
|
materials = ArrayField(models.CharField(max_length=15, blank=True, verbose_name='Материалы урока')) |
|
|
|
|
|
|
|
# TODO material_tokens ??? |
|
|
|
|
|
|
|
free = models.BooleanField(default=False, verbose_name='Привилегии для узла не будут проверяться') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# TODO перейти на список валидаторов |
|
|
|
VALID_TYPE = ( |
|
|
|
VALID_TYPE = ( |
|
|
|
(3, 'Автаматическая валидация'), |
|
|
|
(3, 'Автаматическая валидация'), |
|
|
|
(2, 'Полуавтаматическая валидация'), |
|
|
|
(2, 'Полуавтаматическая валидация'), |
|
|
|
(1, 'Ручная валидация'), |
|
|
|
(1, 'Ручная валидация'), |
|
|
|
(0, 'Без валидации'), |
|
|
|
(0, 'Без валидации'), |
|
|
|
) |
|
|
|
) |
|
|
|
topic = models.ForeignKey(to=Topic, verbose_name='Тема') |
|
|
|
|
|
|
|
title = models.CharField(verbose_name='Название', max_length=255) |
|
|
|
|
|
|
|
free = models.BooleanField(default=False, verbose_name='Привилегии для узла не будут проверяться') |
|
|
|
|
|
|
|
description = models.TextField(verbose_name='Описание', blank=True, null=True) |
|
|
|
|
|
|
|
video = models.TextField(verbose_name='Код видео', blank=True, null=True) |
|
|
|
|
|
|
|
materials = ArrayField(models.CharField(max_length=15, blank=True, verbose_name='Материалы урока')) |
|
|
|
|
|
|
|
valid_type = models.SmallIntegerField(choices=VALID_TYPE, default=0) |
|
|
|
valid_type = models.SmallIntegerField(choices=VALID_TYPE, default=0) |
|
|
|
token = models.CharField(max_length=15, verbose_name="Ключ доступа к узлу", unique=True, editable=False) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
def __str__(self): |
|
|
|
return self.title |
|
|
|
return self.title |
|
|
|
|