parent
b9fc5a8cef
commit
85d182e756
62 changed files with 432 additions and 689 deletions
@ -1,21 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-17 18:08 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations |
|
||||||
import phonenumber_field.modelfields |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('access', '0001_initial'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AlterField( |
|
||||||
model_name='account', |
|
||||||
name='phone', |
|
||||||
field=phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, null=True), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,20 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-18 14:37 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations, models |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('access', '0002_auto_20171217_1808'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AddField( |
|
||||||
model_name='pivotprogressvertex', |
|
||||||
name='date', |
|
||||||
field=models.DateTimeField(blank=True, null=True, verbose_name='Дата зачтения задания'), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,21 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-18 14:38 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
import django.contrib.postgres.fields |
|
||||||
from django.db import migrations, models |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('access', '0003_pivotprogressvertex_date'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AlterField( |
|
||||||
model_name='pivotprogressvertex', |
|
||||||
name='comment', |
|
||||||
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=15, unique=True, verbose_name='Ссылки на комменты'), default=[], size=None), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,20 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-18 15:16 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations, models |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('access', '0004_auto_20171218_1438'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AlterField( |
|
||||||
model_name='pivotprogressvertex', |
|
||||||
name='vertex', |
|
||||||
field=models.CharField(blank=True, max_length=15, verbose_name='Ссылки на узлы'), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,20 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-20 12:28 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations, models |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('access', '0005_auto_20171218_1516'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AlterField( |
|
||||||
model_name='progress', |
|
||||||
name='route', |
|
||||||
field=models.CharField(blank=True, max_length=15, null=True, verbose_name='Токен прохождения'), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,21 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-20 13:21 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations, models |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('access', '0006_auto_20171220_1228'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AddField( |
|
||||||
model_name='progress', |
|
||||||
name='course', |
|
||||||
field=models.CharField(default='', max_length=15, verbose_name='Токен курса'), |
|
||||||
preserve_default=False, |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,20 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-20 13:25 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations, models |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('access', '0007_progress_course'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AlterField( |
|
||||||
model_name='progress', |
|
||||||
name='course', |
|
||||||
field=models.CharField(max_length=127, verbose_name='Слаг курса'), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,9 +1,9 @@ |
|||||||
from django.contrib import admin |
from django.contrib import admin |
||||||
|
|
||||||
from achievements.models import Skills, Achievements, SkillJ, DiplomaGen, Diploma |
from achievements.models import Skill, Achievement, SkillJ, DiplomaGen, Diploma |
||||||
|
|
||||||
admin.site.register(Skills) |
admin.site.register(Skill) |
||||||
admin.site.register(Achievements) |
admin.site.register(Achievement) |
||||||
admin.site.register(SkillJ) |
admin.site.register(SkillJ) |
||||||
admin.site.register(Diploma) |
admin.site.register(Diploma) |
||||||
admin.site.register(DiplomaGen) |
admin.site.register(DiplomaGen) |
||||||
|
|||||||
@ -1 +0,0 @@ |
|||||||
default_app_config = "course_service.courses.apps.CoursesAppConfig" |
|
||||||
@ -1,7 +0,0 @@ |
|||||||
from django.contrib import admin |
|
||||||
|
|
||||||
from course_service.courses.models import Course, Topic, Vertex |
|
||||||
|
|
||||||
admin.site.register(Topic) |
|
||||||
admin.site.register(Vertex) |
|
||||||
admin.site.register(Course) |
|
||||||
@ -1,71 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-17 18:03 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
import django.contrib.postgres.fields |
|
||||||
from django.db import migrations, models |
|
||||||
import django.db.models.deletion |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
initial = True |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.CreateModel( |
|
||||||
name='Course', |
|
||||||
fields=[ |
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||||
('hidden', models.BooleanField(default=False, verbose_name='Видно только оплатившим')), |
|
||||||
('level', models.CharField(choices=[('B', 'Базовый'), ('A', 'Продвинутый'), ('E', 'Экспертный'), ('B+A', 'Базовый + Продвинутый')], default='B', max_length=3, verbose_name='Уровень')), |
|
||||||
('slug', models.SlugField(editable=False, unique=True)), |
|
||||||
('direction', models.SmallIntegerField(choices=[(3, 'Бизнес'), (2, 'Веб-дизайн'), (1, 'Разработка'), (4, 'Рисование')], verbose_name='Направление')), |
|
||||||
('public', models.BooleanField(default=False, verbose_name='Опубликовать')), |
|
||||||
('title', models.CharField(max_length=255, unique=True, verbose_name='Заголовок')), |
|
||||||
('description', models.TextField(blank=True, verbose_name='Описание')), |
|
||||||
('image', models.URLField(blank=True, max_length=255, verbose_name='Изображение')), |
|
||||||
('big_image', models.URLField(blank=True, max_length=255, verbose_name='Большое изображение')), |
|
||||||
('big_mobile_image', models.URLField(blank=True, help_text='Большая картинка для мобильной версии', max_length=255, verbose_name='Под мобилку')), |
|
||||||
('teachers', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=15, verbose_name='Ссылки на преподов'), default=[], size=None)), |
|
||||||
], |
|
||||||
options={ |
|
||||||
'verbose_name': 'Курс', |
|
||||||
'verbose_name_plural': 'Курсы', |
|
||||||
}, |
|
||||||
), |
|
||||||
migrations.CreateModel( |
|
||||||
name='Topic', |
|
||||||
fields=[ |
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||||
('title', models.CharField(max_length=255, verbose_name='Название')), |
|
||||||
('icon', models.ImageField(blank=True, null=True, upload_to='', verbose_name='Иконка темы')), |
|
||||||
('description', models.TextField(blank=True, null=True, verbose_name='Описание')), |
|
||||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='курс')), |
|
||||||
], |
|
||||||
options={ |
|
||||||
'verbose_name': 'Тема', |
|
||||||
'verbose_name_plural': 'Темы', |
|
||||||
}, |
|
||||||
), |
|
||||||
migrations.CreateModel( |
|
||||||
name='Vertex', |
|
||||||
fields=[ |
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||||
('title', models.CharField(max_length=255, verbose_name='Название')), |
|
||||||
('free', models.BooleanField(default=False, verbose_name='Привилегии для узла не будут проверяться')), |
|
||||||
('description', models.TextField(blank=True, null=True, verbose_name='Описание')), |
|
||||||
('video', models.TextField(blank=True, null=True, verbose_name='Код видео')), |
|
||||||
('materials', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=15, verbose_name='Материалы урока'), size=None)), |
|
||||||
('valid_type', models.SmallIntegerField(choices=[(3, 'Автаматическая валидация'), (2, 'Полуавтаматическая валидация'), (1, 'Ручная валидация'), (0, 'Без валидации')], default=0)), |
|
||||||
('token', models.CharField(editable=False, max_length=15, unique=True, verbose_name='Ключ доступа к узлу')), |
|
||||||
('topic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Topic', verbose_name='Тема')), |
|
||||||
], |
|
||||||
options={ |
|
||||||
'verbose_name': 'Урок', |
|
||||||
'verbose_name_plural': 'Уроки', |
|
||||||
}, |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,24 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-17 18:03 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations, models |
|
||||||
import django.db.models.deletion |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
initial = True |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('courses', '0001_initial'), |
|
||||||
('maps', '0001_initial'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AddField( |
|
||||||
model_name='course', |
|
||||||
name='route', |
|
||||||
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='maps.CourseRoute', verbose_name='Порядок прохождения по умолчанию'), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,20 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-17 18:21 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations, models |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('courses', '0002_course_route'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AlterField( |
|
||||||
model_name='course', |
|
||||||
name='slug', |
|
||||||
field=models.SlugField(editable=False, max_length=127, unique=True), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,11 +0,0 @@ |
|||||||
from django.db.models.signals import pre_delete |
|
||||||
from django.dispatch import receiver |
|
||||||
|
|
||||||
from course_service.courses.models import Vertex |
|
||||||
|
|
||||||
|
|
||||||
@receiver(pre_delete, sender=Vertex) |
|
||||||
def delete_dependencies(instance, **kwargs): |
|
||||||
"""Удаляем зависимости вместе с узлом""" |
|
||||||
if instance.content_object: |
|
||||||
instance.content_object.delete() |
|
||||||
@ -1,8 +0,0 @@ |
|||||||
from django.contrib import admin |
|
||||||
|
|
||||||
from course_service.maps.models import CourseMap, CourseRoute, PivotCourseMap, PivotVertex |
|
||||||
|
|
||||||
admin.site.register(CourseMap) |
|
||||||
admin.site.register(CourseRoute) |
|
||||||
admin.site.register(PivotCourseMap) |
|
||||||
admin.site.register(PivotVertex) |
|
||||||
@ -1,16 +0,0 @@ |
|||||||
from course_service.maps.models import CourseRoute |
|
||||||
|
|
||||||
|
|
||||||
class OutApiRoute: |
|
||||||
@staticmethod |
|
||||||
def change_id(id: int) -> str: |
|
||||||
return CourseRoute.objects.get(id=id).out_key |
|
||||||
|
|
||||||
@staticmethod |
|
||||||
def get_route_matrix(out_key): |
|
||||||
map_list = [i.map_course for i in CourseRoute.objects.get(out_key=out_key).pivotcoursemap_set.all()] |
|
||||||
return [[j.vertex.token for j in i.pivotvertex_set.all()] for i in map_list] |
|
||||||
|
|
||||||
@staticmethod |
|
||||||
def get_route(out_key): |
|
||||||
return CourseRoute.objects.get(out_key=out_key) |
|
||||||
@ -1,7 +0,0 @@ |
|||||||
from django.apps import AppConfig |
|
||||||
|
|
||||||
|
|
||||||
class MapsConfig(AppConfig): |
|
||||||
name = "course_service.maps" |
|
||||||
label = 'maps' |
|
||||||
verbose_name = "Отображение курсов" |
|
||||||
@ -1,2 +0,0 @@ |
|||||||
class MapTypeError(ValueError): |
|
||||||
pass |
|
||||||
@ -1,83 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-17 18:03 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations, models |
|
||||||
import django.db.models.deletion |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
initial = True |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('courses', '0001_initial'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.CreateModel( |
|
||||||
name='CourseMap', |
|
||||||
fields=[ |
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||||
('name', models.CharField(max_length=255, verbose_name='Имя прохождения')), |
|
||||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='К какому курсу привязан')), |
|
||||||
], |
|
||||||
options={ |
|
||||||
'verbose_name': 'Карта линейного прохождения курсов', |
|
||||||
'verbose_name_plural': 'Карты линейного прохождения курсов', |
|
||||||
}, |
|
||||||
), |
|
||||||
migrations.CreateModel( |
|
||||||
name='CourseRoute', |
|
||||||
fields=[ |
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||||
('out_key', models.CharField(editable=False, max_length=15, unique=True, verbose_name='Ключ для внешних сервисов')), |
|
||||||
('name', models.CharField(max_length=255, verbose_name='Имя шаблона')), |
|
||||||
('is_template', models.BooleanField(default=True, verbose_name='Может ли быть использован как шаблон')), |
|
||||||
], |
|
||||||
options={ |
|
||||||
'verbose_name': 'Маршрут прохождения', |
|
||||||
'verbose_name_plural': 'Маршруты прохождения', |
|
||||||
}, |
|
||||||
), |
|
||||||
migrations.CreateModel( |
|
||||||
name='PivotCourseMap', |
|
||||||
fields=[ |
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||||
('sort', models.SmallIntegerField(verbose_name='Порядок сортировки')), |
|
||||||
('map_course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='maps.CourseMap', verbose_name='К какой сортировке имеетотношение')), |
|
||||||
('route', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='maps.CourseRoute', verbose_name='К какому узлу')), |
|
||||||
], |
|
||||||
options={ |
|
||||||
'verbose_name': 'Порядок сортировки маршрута', |
|
||||||
'verbose_name_plural': 'Порядки сортировок маршрутов', |
|
||||||
'ordering': ('sort',), |
|
||||||
}, |
|
||||||
), |
|
||||||
migrations.CreateModel( |
|
||||||
name='PivotVertex', |
|
||||||
fields=[ |
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
||||||
('sort', models.SmallIntegerField(verbose_name='Порядок сортировки')), |
|
||||||
('map_course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='maps.CourseMap', verbose_name='К какой сортировке имеетотношение')), |
|
||||||
('vertex', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Vertex', verbose_name='К какому узлу')), |
|
||||||
], |
|
||||||
options={ |
|
||||||
'verbose_name': 'Порядок сортировки узла', |
|
||||||
'verbose_name_plural': 'Порядки сортировок узла', |
|
||||||
'ordering': ('sort',), |
|
||||||
}, |
|
||||||
), |
|
||||||
migrations.AlterUniqueTogether( |
|
||||||
name='pivotvertex', |
|
||||||
unique_together=set([('sort', 'map_course'), ('map_course', 'vertex')]), |
|
||||||
), |
|
||||||
migrations.AlterUniqueTogether( |
|
||||||
name='pivotcoursemap', |
|
||||||
unique_together=set([('sort', 'route'), ('map_course', 'route')]), |
|
||||||
), |
|
||||||
migrations.AlterUniqueTogether( |
|
||||||
name='coursemap', |
|
||||||
unique_together=set([('course', 'name')]), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -1,67 +0,0 @@ |
|||||||
from django.db import models |
|
||||||
|
|
||||||
from course_service.maps.exeptions import MapTypeError |
|
||||||
from lms.global_decorators import transaction_decorator |
|
||||||
|
|
||||||
|
|
||||||
class CourseRoute(models.Model): |
|
||||||
""" |
|
||||||
Объединение нескольких мап курса, одназначно |
|
||||||
определяет способ прохождения по курсу. |
|
||||||
""" |
|
||||||
out_key = models.CharField(max_length=15, unique=True, verbose_name="Ключ для внешних сервисов", editable=False) |
|
||||||
name = models.CharField(max_length=255, verbose_name='Имя шаблона') |
|
||||||
is_template = models.BooleanField(default=True, verbose_name='Может ли быть использован как шаблон') |
|
||||||
|
|
||||||
def __str__(self): |
|
||||||
return self.name |
|
||||||
|
|
||||||
class Meta: |
|
||||||
verbose_name = 'Маршрут прохождения' |
|
||||||
verbose_name_plural = 'Маршруты прохождения' |
|
||||||
|
|
||||||
|
|
||||||
class CourseMap(models.Model): |
|
||||||
""" |
|
||||||
Способы отображения курса. Упорядочены в порядке возрастания приоретета. |
|
||||||
""" |
|
||||||
course = models.ForeignKey(to='courses.Course', verbose_name='К какому курсу привязан') |
|
||||||
name = models.CharField(max_length=255, verbose_name="Имя прохождения") |
|
||||||
|
|
||||||
def __str__(self): |
|
||||||
return '''Линейное прохождение по курсу "%s"''' % self.course.title |
|
||||||
|
|
||||||
class Meta: |
|
||||||
verbose_name = 'Карта линейного прохождения курсов' |
|
||||||
verbose_name_plural = 'Карты линейного прохождения курсов' |
|
||||||
unique_together =('course', 'name',) |
|
||||||
|
|
||||||
|
|
||||||
class PivotCourseMap(models.Model): |
|
||||||
route = models.ForeignKey(to=CourseRoute, verbose_name="К какому узлу") |
|
||||||
sort = models.SmallIntegerField(verbose_name='Порядок сортировки') |
|
||||||
map_course = models.ForeignKey(to=CourseMap, verbose_name='К какой сортировке имеетотношение') |
|
||||||
|
|
||||||
def __str__(self): |
|
||||||
return '''Карта с №%s по маршруту ID%s''' % (self.sort, self.route_id) |
|
||||||
|
|
||||||
class Meta: |
|
||||||
verbose_name = 'Порядок сортировки маршрута' |
|
||||||
verbose_name_plural = 'Порядки сортировок маршрутов' |
|
||||||
unique_together = (('map_course', 'route'), ('sort', 'route'),) |
|
||||||
ordering = ('sort',) |
|
||||||
|
|
||||||
|
|
||||||
class PivotVertex(models.Model): |
|
||||||
vertex = models.ForeignKey(to='courses.Vertex', verbose_name="К какому узлу") |
|
||||||
sort = models.SmallIntegerField(verbose_name='Порядок сортировки') |
|
||||||
map_course = models.ForeignKey(to=CourseMap, verbose_name='К какой сортировке имеетотношение') |
|
||||||
|
|
||||||
def __str__(self): |
|
||||||
return '''Карта с №%s по линейному прохождению ID%s''' % (self.sort, self.map_course_id) |
|
||||||
|
|
||||||
class Meta: |
|
||||||
verbose_name = 'Порядок сортировки узла' |
|
||||||
verbose_name_plural = 'Порядки сортировок узла' |
|
||||||
unique_together = (('map_course', 'vertex'), ('sort', 'map_course')) |
|
||||||
ordering = ('sort',) |
|
||||||
@ -1,27 +0,0 @@ |
|||||||
from rest_framework import serializers |
|
||||||
|
|
||||||
from course_service.maps.models import CourseRoute, CourseMap |
|
||||||
|
|
||||||
|
|
||||||
class CourseRouteSerializer(serializers.ModelSerializer): |
|
||||||
maps = serializers.SerializerMethodField() |
|
||||||
|
|
||||||
class Meta: |
|
||||||
model = CourseRoute |
|
||||||
fields = ('maps', 'name') |
|
||||||
|
|
||||||
@staticmethod |
|
||||||
def get_maps(self): |
|
||||||
return [CourseMapSerializer(i.map_course).data for i in self.pivotcoursemap_set.all()] |
|
||||||
|
|
||||||
|
|
||||||
class CourseMapSerializer(serializers.ModelSerializer): |
|
||||||
vertexes = serializers.SerializerMethodField() |
|
||||||
|
|
||||||
class Meta: |
|
||||||
model = CourseMap |
|
||||||
fields = ('name', 'vertexes') |
|
||||||
|
|
||||||
@staticmethod |
|
||||||
def get_vertexes(self): |
|
||||||
return [i.vertex.token for i in self.pivotvertex_set.all()] |
|
||||||
@ -1,23 +0,0 @@ |
|||||||
# from django.test import TestCase |
|
||||||
# from course_service.maps.models import CourseRoute |
|
||||||
# |
|
||||||
# from course_service.maps.api import OutApiRoute |
|
||||||
# |
|
||||||
# |
|
||||||
# class RouteOutApiTestCase(TestCase): |
|
||||||
# def setUp(self): |
|
||||||
# self.first_course = Course.objects.create( |
|
||||||
# title='Первый курс', |
|
||||||
# slug='perviy-kuourse', |
|
||||||
# ) |
|
||||||
# self.CDTeacher = OutApiRoute() |
|
||||||
# |
|
||||||
# def test_teacher(self): |
|
||||||
# token1 = "token1" |
|
||||||
# token2 = "token2" |
|
||||||
# token3 = "token3" |
|
||||||
# self.CDTeacher.add_teacher(slug=self.first_course.slug, token=token1) |
|
||||||
# self.CDTeacher.add_teacher(slug=self.first_course.slug, token=token2) |
|
||||||
# self.CDTeacher.add_teacher(slug=self.first_course.slug, token=token3) |
|
||||||
# self.CDTeacher.delete_teacher(slug=self.first_course.slug, token=token2) |
|
||||||
# self.assertEqual(self.CDTeacher.get_token_list(self.first_course.slug), ['token1', 'token3']) |
|
||||||
@ -1,3 +0,0 @@ |
|||||||
from django.shortcuts import render |
|
||||||
|
|
||||||
# Create your views here. |
|
||||||
@ -0,0 +1 @@ |
|||||||
|
default_app_config = "courses.apps.CoursesAppConfig" |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
from django.contrib import admin |
||||||
|
|
||||||
|
from courses.models import Course, Topic, Lesson, Demand, Field |
||||||
|
|
||||||
|
admin.site.register(Topic) |
||||||
|
admin.site.register(Lesson) |
||||||
|
admin.site.register(Course) |
||||||
|
admin.site.register(Demand) |
||||||
|
admin.site.register(Field) |
||||||
@ -1,4 +1,4 @@ |
|||||||
from course_service.courses.models import Course |
from courses.models import Course |
||||||
|
|
||||||
|
|
||||||
class InApiTeacher: |
class InApiTeacher: |
||||||
@ -0,0 +1,127 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
# Generated by Django 1.11.6 on 2018-01-11 10:47 |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
import django.contrib.postgres.fields |
||||||
|
from django.db import migrations, models |
||||||
|
import django.db.models.deletion |
||||||
|
import uuid |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
initial = True |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.CreateModel( |
||||||
|
name='Course', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||||
|
('slug', models.SlugField(editable=False, max_length=127, unique=True)), |
||||||
|
('title', models.CharField(max_length=255, unique=True, verbose_name='Заголовок')), |
||||||
|
('description', models.TextField(blank=True, verbose_name='Описание')), |
||||||
|
('level', models.CharField(choices=[('B', 'Базовый'), ('A', 'Продвинутый'), ('E', 'Экспертный'), ('B+A', 'Базовый + Продвинутый')], default='B', max_length=3, verbose_name='Уровень')), |
||||||
|
('direction', models.SmallIntegerField(choices=[(3, 'Бизнес'), (2, 'Веб-дизайн'), (1, 'Разработка'), (4, 'Рисование'), (5, 'Музыка')], verbose_name='Направление')), |
||||||
|
('public', models.BooleanField(default=False, verbose_name='Опубликовать')), |
||||||
|
('teachers', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=15, verbose_name='Ссылки на преподов'), default=[], size=None)), |
||||||
|
('image', models.URLField(blank=True, max_length=255, verbose_name='Изображение')), |
||||||
|
('big_image', models.URLField(blank=True, max_length=255, verbose_name='Большое изображение')), |
||||||
|
('big_mobile_image', models.URLField(blank=True, help_text='Большая картинка для мобильной версии', max_length=255, verbose_name='Под мобилку')), |
||||||
|
('hidden', models.BooleanField(default=False, verbose_name='Видно только оплатившим')), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'Курс', |
||||||
|
'verbose_name_plural': 'Курсы', |
||||||
|
}, |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='Demand', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||||
|
('token', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='Токен валидатора')), |
||||||
|
('name', models.CharField(max_length=31, unique=True, verbose_name='Название')), |
||||||
|
('checker', models.CharField(choices=[('student', 'student'), ('teacher', 'teacher'), ('support', 'support')], default='teacher', max_length=15, verbose_name='Проверяющий')), |
||||||
|
('min_balls', models.SmallIntegerField(default=50, verbose_name='Проходной бал')), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'Требования', |
||||||
|
'verbose_name_plural': 'Требования', |
||||||
|
}, |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='Field', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||||
|
('label', models.CharField(max_length=255, verbose_name='Надпись у поля')), |
||||||
|
('type', models.CharField(choices=[('text', 'text'), ('char', 'char'), ('boolean', 'boolean'), ('file', 'file')], default='char', max_length=20)), |
||||||
|
('multiple', models.BooleanField(default=False)), |
||||||
|
('null', models.BooleanField(default=False)), |
||||||
|
('answers', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), blank=True, null=True, size=None)), |
||||||
|
('balls', models.SmallIntegerField(default=100, verbose_name='Вознаграждение')), |
||||||
|
('match', models.CharField(blank=True, max_length=255, null=True, verbose_name='Если не нулевое значение, то при точном сопоставлении даёт положителбный ответ')), |
||||||
|
('demand', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Demand')), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'Поле', |
||||||
|
'verbose_name_plural': 'Поля', |
||||||
|
}, |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='Lesson', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||||
|
('token', models.CharField(editable=False, max_length=15, unique=True, verbose_name='Ключ доступа к узлу')), |
||||||
|
('title', models.CharField(max_length=255, verbose_name='Название')), |
||||||
|
('description', models.TextField(blank=True, null=True, verbose_name='Описание')), |
||||||
|
('video', models.TextField(blank=True, null=True, verbose_name='Код видео')), |
||||||
|
('material_tokens', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, max_length=15, verbose_name='Материалы урока'), default=[], size=None)), |
||||||
|
('free', models.BooleanField(default=False, verbose_name='Привилегии для узла не будут проверяться')), |
||||||
|
('sort', models.SmallIntegerField(unique=True)), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'Урок', |
||||||
|
'verbose_name_plural': 'Уроки', |
||||||
|
'ordering': ('sort',), |
||||||
|
}, |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='LessonDemand', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||||
|
('sort', models.SmallIntegerField(default=1)), |
||||||
|
('demand', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Demand')), |
||||||
|
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson')), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'Порядок требований', |
||||||
|
'verbose_name_plural': 'Порядок требований', |
||||||
|
'ordering': ('sort',), |
||||||
|
}, |
||||||
|
), |
||||||
|
migrations.CreateModel( |
||||||
|
name='Topic', |
||||||
|
fields=[ |
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||||
|
('title', models.CharField(max_length=255, verbose_name='Название')), |
||||||
|
('description', models.TextField(blank=True, null=True, verbose_name='Описание')), |
||||||
|
('icon', models.ImageField(blank=True, null=True, upload_to='', verbose_name='Иконка темы')), |
||||||
|
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='курс')), |
||||||
|
], |
||||||
|
options={ |
||||||
|
'verbose_name': 'Тема', |
||||||
|
'verbose_name_plural': 'Темы', |
||||||
|
}, |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='lesson', |
||||||
|
name='topic', |
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Topic', verbose_name='Тема'), |
||||||
|
), |
||||||
|
migrations.AlterUniqueTogether( |
||||||
|
name='lessondemand', |
||||||
|
unique_together=set([('lesson', 'demand', 'sort')]), |
||||||
|
), |
||||||
|
] |
||||||
@ -0,0 +1,42 @@ |
|||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
from courses.models import Demand, Field |
||||||
|
|
||||||
|
from django.db import migrations |
||||||
|
|
||||||
|
|
||||||
|
def init_demands(*_args, **_kwargs): |
||||||
|
d, c = Demand.objects.get_or_create( |
||||||
|
min_balls=51, |
||||||
|
name="Стандартные требования", |
||||||
|
) |
||||||
|
|
||||||
|
Field.objects.get_or_create( |
||||||
|
demand=d, |
||||||
|
label='Комментарий', |
||||||
|
type='text', |
||||||
|
null=True, |
||||||
|
balls=50, |
||||||
|
) |
||||||
|
|
||||||
|
Field.objects.get_or_create( |
||||||
|
demand=d, |
||||||
|
label='Приложенные файлы', |
||||||
|
type='files', |
||||||
|
null=True, |
||||||
|
multiple=True, |
||||||
|
balls=50, |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
initial = True |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
('courses', '0001_initial'), |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.RunPython(init_demands) |
||||||
|
] |
||||||
@ -1,8 +1,8 @@ |
|||||||
from django.test import TestCase |
from django.test import TestCase |
||||||
from course_service.courses.models import Course |
from courses.models import Course |
||||||
from lms.tools import EXAMPLE_BASE64 |
from lms.tools import EXAMPLE_BASE64 |
||||||
|
|
||||||
from course_service.courses.api import InApiTeacher |
from courses.api import InApiTeacher |
||||||
|
|
||||||
|
|
||||||
class CourseInApiTestCase(TestCase): |
class CourseInApiTestCase(TestCase): |
||||||
@ -1,6 +1,6 @@ |
|||||||
from django.conf.urls import url |
from django.conf.urls import url |
||||||
|
|
||||||
from course_service.courses import views as views |
from courses import views as views |
||||||
|
|
||||||
urlpatterns = [ |
urlpatterns = [ |
||||||
url(r'vertex/(?P<token>.+)/$', views.VertexDetail.as_view()), |
url(r'vertex/(?P<token>.+)/$', views.VertexDetail.as_view()), |
||||||
@ -1,20 +0,0 @@ |
|||||||
# -*- coding: utf-8 -*- |
|
||||||
# Generated by Django 1.11.6 on 2017-12-25 11:42 |
|
||||||
from __future__ import unicode_literals |
|
||||||
|
|
||||||
from django.db import migrations, models |
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration): |
|
||||||
|
|
||||||
dependencies = [ |
|
||||||
('finance', '0001_initial'), |
|
||||||
] |
|
||||||
|
|
||||||
operations = [ |
|
||||||
migrations.AlterField( |
|
||||||
model_name='invoice', |
|
||||||
name='price', |
|
||||||
field=models.IntegerField(blank=True, editable=False, null=True, verbose_name='Сумма'), |
|
||||||
), |
|
||||||
] |
|
||||||
Loading…
Reference in new issue