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 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 |
||||
|
||||
admin.site.register(User) |
||||
admin.site.register(Account) |
||||
admin.site.register(Progress) |
||||
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 |
||||
|
||||
from .other import Account, Progress, Invite |
||||
from .other import Account, Invite |
||||
from access.models.progress import Progress |
||||
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 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,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: |
||||
@staticmethod |
||||
def add_teacher(slug: str, token: str) -> Course: |
||||
course = Course.objects.get(slug=slug) |
||||
course.teachers.append(token) |
||||
course.teacher_tokens.append(token) |
||||
course.save() |
||||
return course |
||||
|
||||
@staticmethod |
||||
def delete_teacher(slug: str, token: str) -> None: |
||||
course = Course.objects.get(slug=slug) |
||||
course.teachers.remove(token) |
||||
course.teacher_tokens.remove(token) |
||||
course.save() |
||||
return None |
||||
|
||||
@staticmethod |
||||
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 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()), |
||||
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