New lms dev(critical) See merge request skillbox/go.skillbox.ru!74feature/fix_generate_pass
commit
a731a471de
70 changed files with 30707 additions and 31046 deletions
@ -1,9 +1,12 @@ |
|||||||
from django.contrib import admin |
from django.contrib import admin |
||||||
from access.models.other import Invite, Account, Progress, ResetPassword |
from access.models.other import Invite, Account, ResetPassword |
||||||
|
from access.models.progress import ProgressLesson |
||||||
|
from access.models import Progress |
||||||
from access.models.user import User |
from access.models.user import User |
||||||
|
|
||||||
admin.site.register(User) |
admin.site.register(User) |
||||||
admin.site.register(Account) |
admin.site.register(Account) |
||||||
admin.site.register(Progress) |
admin.site.register(Progress) |
||||||
admin.site.register(Invite) |
admin.site.register(Invite) |
||||||
admin.site.register(ResetPassword) |
admin.site.register(ResetPassword) |
||||||
|
admin.site.register(ProgressLesson) |
||||||
@ -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), |
|
||||||
), |
|
||||||
] |
|
||||||
@ -0,0 +1,20 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
# Generated by Django 1.11.6 on 2018-01-15 19:53 |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
from django.db import migrations, models |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
('access', '0002_init_group'), |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.AlterField( |
||||||
|
model_name='progresslesson', |
||||||
|
name='date', |
||||||
|
field=models.DateTimeField(auto_now_add=True, verbose_name='Дата зачтения задания'), |
||||||
|
), |
||||||
|
] |
||||||
@ -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,6 +1,7 @@ |
|||||||
# encoding=utf-8 |
# encoding=utf-8 |
||||||
|
|
||||||
from .other import Account, Progress, Invite |
from .other import Account, Invite |
||||||
|
from access.models.progress import Progress |
||||||
from .user import User |
from .user import User |
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,66 @@ |
|||||||
|
from django.conf import settings |
||||||
|
from django.contrib.postgres.fields import ArrayField |
||||||
|
from django.db import models |
||||||
|
from model_utils import Choices |
||||||
|
|
||||||
|
|
||||||
|
class Progress(models.Model): |
||||||
|
hidden_lessons = ArrayField( |
||||||
|
models.UUIDField(verbose_name="Токен урока", unique=True, editable=False), |
||||||
|
default=[], |
||||||
|
verbose_name='Список скрытых уроков', |
||||||
|
) |
||||||
|
teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь по умолчанию", |
||||||
|
related_name='teacher_progress') |
||||||
|
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент') |
||||||
|
course_token = models.UUIDField(verbose_name="Токен курса", editable=False) |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return '%s' % (self.user.email,) |
||||||
|
|
||||||
|
class Meta: |
||||||
|
verbose_name = 'Прогресс пользователя' |
||||||
|
verbose_name_plural = 'Прогресс пользователя' |
||||||
|
unique_together = (("user", "course_token"),) |
||||||
|
|
||||||
|
|
||||||
|
class ProgressLesson(models.Model): |
||||||
|
progress = models.ForeignKey(to=Progress) |
||||||
|
lesson_token = models.UUIDField(verbose_name="Токен урока", editable=False) |
||||||
|
teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь",) |
||||||
|
date = models.DateTimeField(verbose_name='Дата зачтения задания', auto_now_add=True) |
||||||
|
STATUSES = Choices('done', 'wait', 'fail') |
||||||
|
status = models.CharField(choices=STATUSES, default=STATUSES.wait, max_length=20) |
||||||
|
comment_tokens = ArrayField(models.UUIDField(verbose_name="Токен комента", editable=False), default=[]) |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return self.progress.user.email |
||||||
|
|
||||||
|
class Meta: |
||||||
|
verbose_name = 'Прохождение уроков' |
||||||
|
verbose_name_plural = 'Прохождение урока' |
||||||
|
unique_together = ('progress', 'lesson_token') |
||||||
|
|
||||||
|
|
||||||
|
# class UserLessonAnswer(models.Model): |
||||||
|
# progress_lesson = models.ForeignKey(to=ProgressLesson) |
||||||
|
# date = models.DateTimeField(verbose_name='Дата сдачи', auto_now_add=True) |
||||||
|
# reviewer = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Проверяющий",) |
||||||
|
# |
||||||
|
# class Meta: |
||||||
|
# verbose_name = 'Блок ответов пользователя' |
||||||
|
# verbose_name_plural = 'Блоки ответов пользователя' |
||||||
|
# |
||||||
|
# |
||||||
|
# class AnswerItem(models.Model): |
||||||
|
# STATUSES = Choices('done', 'wait', 'fail') |
||||||
|
# |
||||||
|
# lesson_answer = models.ForeignKey(to=UserLessonAnswer) |
||||||
|
# question = models.TextField(verbose_name='Вопрос') # TODO подумать над хранением токена вопроса |
||||||
|
# value = models.TextField(verbose_name='Ответ') |
||||||
|
# comment = models.TextField(verbose_name='Комент', blank=True, null=True) |
||||||
|
# status = models.CharField(choices=STATUSES, default=STATUSES.wait, max_length=20) |
||||||
|
# |
||||||
|
# class Meta: |
||||||
|
# verbose_name = 'Ответ пользователя' |
||||||
|
# verbose_name_plural = 'Ответы пользователя' |
||||||
@ -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,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,6 @@ |
|||||||
|
from django.contrib import admin |
||||||
|
|
||||||
|
from courses.models import Course, Topic, Lesson |
||||||
|
admin.site.register(Topic) |
||||||
|
admin.site.register(Lesson) |
||||||
|
admin.site.register(Course) |
||||||
@ -1,21 +1,21 @@ |
|||||||
from course_service.courses.models import Course |
from courses.models import Course |
||||||
|
|
||||||
|
|
||||||
class InApiTeacher: |
class InApiTeacher: |
||||||
@staticmethod |
@staticmethod |
||||||
def add_teacher(slug: str, token: str) -> Course: |
def add_teacher(slug: str, token: str) -> Course: |
||||||
course = Course.objects.get(slug=slug) |
course = Course.objects.get(slug=slug) |
||||||
course.teachers.append(token) |
course.teacher_tokens.append(token) |
||||||
course.save() |
course.save() |
||||||
return course |
return course |
||||||
|
|
||||||
@staticmethod |
@staticmethod |
||||||
def delete_teacher(slug: str, token: str) -> None: |
def delete_teacher(slug: str, token: str) -> None: |
||||||
course = Course.objects.get(slug=slug) |
course = Course.objects.get(slug=slug) |
||||||
course.teachers.remove(token) |
course.teacher_tokens.remove(token) |
||||||
course.save() |
course.save() |
||||||
return None |
return None |
||||||
|
|
||||||
@staticmethod |
@staticmethod |
||||||
def get_token_list(slug: str) -> list: |
def get_token_list(slug: str) -> list: |
||||||
return Course.objects.get(slug=slug).teachers |
return Course.objects.get(slug=slug).teacher_tokens |
||||||
@ -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()), |
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
Can't render this file because it is too large.
|
@ -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