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 achievements.models import Skills, Achievements, SkillJ, DiplomaGen, Diploma |
||||
from achievements.models import Skill, Achievement, SkillJ, DiplomaGen, Diploma |
||||
|
||||
admin.site.register(Skills) |
||||
admin.site.register(Achievements) |
||||
admin.site.register(Skill) |
||||
admin.site.register(Achievement) |
||||
admin.site.register(SkillJ) |
||||
admin.site.register(Diploma) |
||||
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: |
||||
@ -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 course_service.courses.models import Course |
||||
from courses.models import Course |
||||
from lms.tools import EXAMPLE_BASE64 |
||||
|
||||
from course_service.courses.api import InApiTeacher |
||||
from courses.api import InApiTeacher |
||||
|
||||
|
||||
class CourseInApiTestCase(TestCase): |
||||
@ -1,6 +1,6 @@ |
||||
from django.conf.urls import url |
||||
|
||||
from course_service.courses import views as views |
||||
from courses import views as views |
||||
|
||||
urlpatterns = [ |
||||
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