зависимости

feature/fix_generate_pass
Andrey 8 years ago
parent ea3630accd
commit 9ace79accd
  1. 8
      access/admin.py
  2. 51
      access/migrations/0001_initial.py
  3. 19
      access/migrations/0003_remove_progresslesson_comment.py
  4. 25
      access/migrations/0004_auto_20180112_1123.py
  5. 3
      access/models/__init__.py
  6. 57
      access/models/other.py
  7. 62
      access/models/progress.py
  8. 4
      access/serializers.py
  9. 4
      access/views.py
  10. 2
      achievements/migrations/0001_initial.py
  11. 7
      courses/admin.py
  12. 86
      courses/migrations/0001_initial.py
  13. 16
      courses/migrations/0002_init_demands.py
  14. 20
      courses/migrations/0003_lesson_old_id.py
  15. 41
      courses/models.py
  16. 2
      csv/load_bills.py
  17. 3
      csv/load_comments.py
  18. 132
      csv/load_courses.py
  19. 11
      csv/load_perm.py
  20. 2
      csv/load_users.py
  21. 4
      finance/migrations/0001_initial.py
  22. 20
      finance/migrations/0002_auto_20180112_1013.py
  23. 2
      library/migrations/0001_initial.py
  24. 2
      storage/migrations/0001_initial.py

@ -1,5 +1,7 @@
from django.contrib import admin from django.contrib import admin
from access.models.other import Invite, Account, Progress, ResetPassword, ProgressLesson, UserAnswer, UserAnswerBlock from access.models.other import Invite, Account, ResetPassword
from access.models.progress import ProgressLesson, UserLessonAnswer, AnswerItem
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)
@ -8,5 +10,5 @@ admin.site.register(Progress)
admin.site.register(Invite) admin.site.register(Invite)
admin.site.register(ResetPassword) admin.site.register(ResetPassword)
admin.site.register(ProgressLesson) admin.site.register(ProgressLesson)
admin.site.register(UserAnswer) admin.site.register(AnswerItem)
admin.site.register(UserAnswerBlock) admin.site.register(UserLessonAnswer)

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-11 17:32 # Generated by Django 1.11.6 on 2018-01-12 15:44
from __future__ import unicode_literals from __future__ import unicode_literals
import access.models.user import access.models.user
@ -61,6 +61,20 @@ class Migration(migrations.Migration):
'verbose_name_plural': 'Дополнительная информация о пользователе', 'verbose_name_plural': 'Дополнительная информация о пользователе',
}, },
), ),
migrations.CreateModel(
name='AnswerItem',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('question', models.TextField(verbose_name='Вопрос')),
('value', models.TextField(verbose_name='Ответ')),
('comment', models.TextField(blank=True, null=True, verbose_name='Комент')),
('status', models.CharField(choices=[('done', 'done'), ('wait', 'wait'), ('fail', 'fail')], default='wait', max_length=20)),
],
options={
'verbose_name': 'Ответ пользователя',
'verbose_name_plural': 'Ответы пользователя',
},
),
migrations.CreateModel( migrations.CreateModel(
name='Invite', name='Invite',
fields=[ fields=[
@ -78,7 +92,7 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('hidden_lessons', django.contrib.postgres.fields.ArrayField(base_field=models.UUIDField(editable=False, unique=True, verbose_name='Токен урока'), default=[], size=None, verbose_name='Список скрытых уроков')), ('hidden_lessons', django.contrib.postgres.fields.ArrayField(base_field=models.UUIDField(editable=False, unique=True, verbose_name='Токен урока'), default=[], size=None, verbose_name='Список скрытых уроков')),
('course_token', models.UUIDField(editable=False, unique=True, verbose_name='Токен курса')), ('course_token', models.UUIDField(editable=False, verbose_name='Токен курса')),
('teacher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='teacher_progress', to=settings.AUTH_USER_MODEL, verbose_name='Преподователь по умолчанию')), ('teacher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='teacher_progress', to=settings.AUTH_USER_MODEL, verbose_name='Преподователь по умолчанию')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Студент')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Студент')),
], ],
@ -91,8 +105,7 @@ class Migration(migrations.Migration):
name='ProgressLesson', name='ProgressLesson',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('lesson_token', models.UUIDField(editable=False, unique=True, verbose_name='Токен урока')), ('lesson_token', models.UUIDField(editable=False, verbose_name='Токен урока')),
('comment', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=15, unique=True, verbose_name='Ссылки на комменты'), default=[], size=None)),
('date', models.DateTimeField(blank=True, null=True, verbose_name='Дата зачтения задания')), ('date', models.DateTimeField(blank=True, null=True, verbose_name='Дата зачтения задания')),
('progress', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='access.Progress')), ('progress', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='access.Progress')),
('teacher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Преподователь')), ('teacher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Преподователь')),
@ -103,26 +116,12 @@ class Migration(migrations.Migration):
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='UserAnswer', name='UserLessonAnswer',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('key', models.CharField(blank=True, max_length=255, verbose_name='Наименование поля')),
('value', models.TextField(verbose_name='Значение в поле')),
('status', models.CharField(choices=[('done', 'done'), ('wait', 'wait'), ('fail', 'fail')], default='done', max_length=20)),
],
options={
'verbose_name': 'Ответ пользователя',
'verbose_name_plural': 'Ответы пользователя',
},
),
migrations.CreateModel(
name='UserAnswerBlock',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateTimeField(auto_now_add=True, verbose_name='Дата сдачи')), ('date', models.DateTimeField(auto_now_add=True, verbose_name='Дата сдачи')),
('demand_token', models.UUIDField(editable=False, unique=True, verbose_name='Токен правила')), ('progress_lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='access.ProgressLesson')),
('checker', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Проверяющий')), ('reviewer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Проверяющий')),
('progress', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='access.ProgressLesson')),
], ],
options={ options={
'verbose_name': 'Блок ответов пользователя', 'verbose_name': 'Блок ответов пользователя',
@ -141,16 +140,16 @@ class Migration(migrations.Migration):
}, },
bases=('access.invite',), bases=('access.invite',),
), ),
migrations.AddField(
model_name='useranswer',
name='block',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='access.UserAnswerBlock'),
),
migrations.AddField( migrations.AddField(
model_name='invite', model_name='invite',
name='owner', name='owner',
field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Кому приглошение'), field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Кому приглошение'),
), ),
migrations.AddField(
model_name='answeritem',
name='lesson_answer',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='access.UserLessonAnswer'),
),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='progress', name='progress',
unique_together=set([('user', 'course_token')]), unique_together=set([('user', 'course_token')]),

@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-12 10:57
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('access', '0002_init_group'),
]
operations = [
migrations.RemoveField(
model_name='progresslesson',
name='comment',
),
]

@ -1,25 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-12 11:23
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0003_remove_progresslesson_comment'),
]
operations = [
migrations.AlterField(
model_name='progress',
name='course_token',
field=models.UUIDField(editable=False, verbose_name='Токен курса'),
),
migrations.AlterField(
model_name='progresslesson',
name='lesson_token',
field=models.UUIDField(editable=False, 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

@ -1,7 +1,5 @@
from django.conf import settings from django.conf import settings
from django.contrib.postgres.fields import ArrayField
from django.db import models from django.db import models
from model_utils import Choices
from phonenumber_field.modelfields import PhoneNumberField from phonenumber_field.modelfields import PhoneNumberField
@ -44,58 +42,3 @@ class Account(models.Model):
verbose_name_plural = 'Дополнительная информация о пользователе' verbose_name_plural = 'Дополнительная информация о пользователе'
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='Дата зачтения задания', blank=True, null=True)
def __str__(self):
return self.lesson_token
class Meta:
verbose_name = 'Прохождение уроков'
verbose_name_plural = 'Прохождение урока'
class UserAnswerBlock(models.Model):
progress = models.ForeignKey(to=ProgressLesson)
date = models.DateTimeField(verbose_name='Дата сдачи', auto_now_add=True)
demand_token = models.UUIDField(verbose_name="Токен правила", unique=True, editable=False)
checker = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Проверяющий",)
class Meta:
verbose_name = 'Блок ответов пользователя'
verbose_name_plural = 'Блоки ответов пользователя'
class UserAnswer(models.Model):
block = models.ForeignKey(to=UserAnswerBlock)
key = models.CharField(max_length=255, blank=True, verbose_name='Наименование поля')
value = models.TextField(verbose_name='Значение в поле')
STATUS = Choices('done', 'wait', 'fail')
status = models.CharField(choices=STATUS, default=STATUS.done, max_length=20)
class Meta:
verbose_name = 'Ответ пользователя'
verbose_name_plural = 'Ответы пользователя'

@ -0,0 +1,62 @@
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='Дата зачтения задания', blank=True, null=True)
def __str__(self):
return self.lesson_token
class Meta:
verbose_name = 'Прохождение уроков'
verbose_name_plural = 'Прохождение урока'
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,7 +1,9 @@
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from rest_framework import serializers from rest_framework import serializers
from access.models.other import Account, Progress, ProgressLesson from access.models.other import Account
from access.models.progress import ProgressLesson
from access.models import Progress
from achievements.serialers import DiplomaSerializer, AchievementsSerializer from achievements.serialers import DiplomaSerializer, AchievementsSerializer

@ -12,7 +12,9 @@ from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from access.models.other import Invite, Progress, ResetPassword, ProgressLesson from access.models.other import Invite, ResetPassword
from access.models.progress import ProgressLesson
from access.models import Progress
from access.serializers import UserSelfSerializer, UserSearchSerializer, ProgressVertexSerializer from access.serializers import UserSelfSerializer, UserSearchSerializer, ProgressVertexSerializer

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-11 17:32 # Generated by Django 1.11.6 on 2018-01-12 15:44
from __future__ import unicode_literals from __future__ import unicode_literals
from django.conf import settings from django.conf import settings

@ -1,9 +1,10 @@
from django.contrib import admin from django.contrib import admin
from courses.models import Course, Topic, Lesson, Demand, Field from courses.models import Course, Topic, Lesson, Requirement, Question, RightAnswer
admin.site.register(Topic) admin.site.register(Topic)
admin.site.register(Lesson) admin.site.register(Lesson)
admin.site.register(Course) admin.site.register(Course)
admin.site.register(Demand) admin.site.register(Requirement)
admin.site.register(Field) admin.site.register(Question)
admin.site.register(RightAnswer)

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-11 17:32 # Generated by Django 1.11.6 on 2018-01-12 15:44
from __future__ import unicode_literals from __future__ import unicode_literals
import django.contrib.postgres.fields import django.contrib.postgres.fields
@ -38,65 +38,75 @@ class Migration(migrations.Migration):
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Demand', name='Lesson',
fields=[ fields=[
('token', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='Токен')), ('token', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='Токен')),
('name', models.CharField(max_length=31, unique=True, verbose_name='Название')), ('title', models.CharField(max_length=255, verbose_name='Название')),
('checker', models.CharField(choices=[('student', 'student'), ('teacher', 'teacher'), ('support', 'support')], default='teacher', max_length=15, verbose_name='Проверяющий')), ('description', models.TextField(blank=True, null=True, verbose_name='Описание')),
('min_balls', models.SmallIntegerField(default=50, 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={ options={
'verbose_name': 'Требования', 'verbose_name': 'Урок',
'verbose_name_plural': 'Требования', 'verbose_name_plural': 'Уроки',
'ordering': ('sort',),
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Field', name='LessonRequirement',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('label', models.CharField(max_length=255, verbose_name='Надпись у поля')), ('sort', models.SmallIntegerField(default=1)),
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson')),
],
options={
'verbose_name': 'Порядок требований',
'verbose_name_plural': 'Порядок требований',
'ordering': ('sort',),
},
),
migrations.CreateModel(
name='Question',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.TextField(verbose_name='Вопрос')),
('type', models.CharField(choices=[('text', 'text'), ('char', 'char'), ('boolean', 'boolean'), ('file', 'file')], default='char', max_length=20)), ('type', models.CharField(choices=[('text', 'text'), ('char', 'char'), ('boolean', 'boolean'), ('file', 'file')], default='char', max_length=20)),
('multiple', models.BooleanField(default=False)), ('multiple', models.BooleanField(default=False)),
('null', 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='Вознаграждение')), ('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={ options={
'verbose_name': 'Поле', 'verbose_name': 'Вопрос',
'verbose_name_plural': 'Поля', 'verbose_name_plural': 'Вопросы',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Lesson', name='Requirement',
fields=[ fields=[
('token', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='Токен')), ('token', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='Токен')),
('title', models.CharField(max_length=255, verbose_name='Название')), ('name', models.CharField(max_length=31, unique=True, verbose_name='Название')),
('description', models.TextField(blank=True, null=True, verbose_name='Описание')), ('checker', models.CharField(choices=[('student', 'student'), ('teacher', 'teacher'), ('auto', 'auto')], default='teacher', max_length=15, verbose_name='Проверяющий')),
('video', models.TextField(blank=True, null=True, verbose_name='Код видео')), ('min_balls', models.SmallIntegerField(default=50, 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={ options={
'verbose_name': 'Урок', 'verbose_name': 'Требования',
'verbose_name_plural': 'Уроки', 'verbose_name_plural': 'Требования',
'ordering': ('sort',),
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='LessonDemand', name='RightAnswer',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sort', models.SmallIntegerField(default=1)), ('text', models.TextField(verbose_name='Верный ответ')),
('demand', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Demand')), ('success_comment', models.TextField(blank=True, null=True, verbose_name='Комментарий при верном ответе')),
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson')), ('error_comment', models.TextField(blank=True, null=True, verbose_name='Комментарий при ошибке')),
('question', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='courses.Question')),
], ],
options={ options={
'verbose_name': 'Порядок требований', 'verbose_name': 'Верный ответ',
'verbose_name_plural': 'Порядок требований', 'verbose_name_plural': 'Верные ответы',
'ordering': ('sort',),
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
@ -114,13 +124,23 @@ class Migration(migrations.Migration):
'verbose_name_plural': 'Темы', 'verbose_name_plural': 'Темы',
}, },
), ),
migrations.AddField(
model_name='question',
name='requirement',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Requirement'),
),
migrations.AddField(
model_name='lessonrequirement',
name='requirement',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Requirement'),
),
migrations.AddField( migrations.AddField(
model_name='lesson', model_name='lesson',
name='topic', name='topic',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Topic', verbose_name='Тема'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Topic', verbose_name='Тема'),
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='lessondemand', name='lessonrequirement',
unique_together=set([('lesson', 'demand', 'sort')]), unique_together=set([('lesson', 'requirement', 'sort')]),
), ),
] ]

@ -1,27 +1,27 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from courses.models import Demand, Field from courses.models import Requirement, Question
from django.db import migrations from django.db import migrations
def init_demands(*_args, **_kwargs): def init_demands(*_args, **_kwargs):
d, c = Demand.objects.get_or_create( requirement, created = Requirement.objects.get_or_create(
min_balls=51, min_balls=51,
name="Стандартные требования", name="Стандартные требования",
) )
Field.objects.get_or_create( Question.objects.get_or_create(
demand=d, requirement=requirement,
label='Комментарий', text='Комментарий',
type='text', type='text',
null=True, null=True,
balls=50, balls=50,
) )
Field.objects.get_or_create( Question.objects.get_or_create(
demand=d, requirement=requirement,
label='Приложенные файлы', text='Приложенные файлы',
type='files', type='files',
null=True, null=True,
multiple=True, multiple=True,

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-12 16:02
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0002_init_demands'),
]
operations = [
migrations.AddField(
model_name='lesson',
name='old_id',
field=models.IntegerField(blank=True, null=True),
),
]

@ -120,6 +120,8 @@ class Lesson(models.Model):
free = models.BooleanField(default=False, verbose_name='Привилегии для узла не будут проверяться') free = models.BooleanField(default=False, verbose_name='Привилегии для узла не будут проверяться')
sort = models.SmallIntegerField(unique=True) sort = models.SmallIntegerField(unique=True)
old_id = models.IntegerField(null=True, blank=True)
def __str__(self): def __str__(self):
return self.title return self.title
@ -129,20 +131,21 @@ class Lesson(models.Model):
ordering = ('sort', ) ordering = ('sort', )
class LessonDemand(models.Model): class LessonRequirement(models.Model):
demand = models.ForeignKey(to='Demand')
lesson = models.ForeignKey(to=Lesson) lesson = models.ForeignKey(to=Lesson)
requirement = models.ForeignKey(to='courses.Requirement')
sort = models.SmallIntegerField(default=1) sort = models.SmallIntegerField(default=1)
class Meta: class Meta:
verbose_name = "Порядок требований" verbose_name = "Порядок требований"
verbose_name_plural = "Порядок требований" verbose_name_plural = "Порядок требований"
ordering = ('sort', ) ordering = ('sort', )
unique_together = ('lesson', 'demand', 'sort') unique_together = ('lesson', 'requirement', 'sort')
class Requirement(models.Model):
CHECK_TYPES = Choices('student', 'teacher', 'auto',)
class Demand(models.Model):
CHECK_TYPES = Choices('student', 'teacher', 'support',)
token = models.UUIDField(verbose_name="Токен", default=uuid.uuid4, primary_key=True, editable=False) token = models.UUIDField(verbose_name="Токен", default=uuid.uuid4, primary_key=True, editable=False)
name = models.CharField(max_length=31, verbose_name="Название", unique=True) name = models.CharField(max_length=31, verbose_name="Название", unique=True)
checker = models.CharField( checker = models.CharField(
@ -157,21 +160,27 @@ class Demand(models.Model):
verbose_name_plural = "Требования" verbose_name_plural = "Требования"
class Field(models.Model): class Question(models.Model):
# TODO Нужно прикрутить предварительную валидацию
FIELD_TYPES = Choices('text', 'char', 'boolean', 'file') FIELD_TYPES = Choices('text', 'char', 'boolean', 'file')
demand = models.ForeignKey(to=Demand)
label = models.CharField(max_length=255, verbose_name='Надпись у поля') requirement = models.ForeignKey(to=Requirement)
text = models.TextField(verbose_name="Вопрос")
type = models.CharField(choices=FIELD_TYPES, default=FIELD_TYPES.char, max_length=20) type = models.CharField(choices=FIELD_TYPES, default=FIELD_TYPES.char, max_length=20)
multiple = models.BooleanField(default=False) multiple = models.BooleanField(default=False)
null = models.BooleanField(default=False) null = models.BooleanField(default=False)
answers = ArrayField(models.CharField(max_length=255), blank=True, null=True)
balls = models.SmallIntegerField(default=100, verbose_name='Вознаграждение') balls = models.SmallIntegerField(default=100, verbose_name='Вознаграждение')
match = models.CharField(
max_length=255,
verbose_name='Если не нулевое значение, то при точном сопоставлении даёт положителбный ответ',
blank=True, null=True)
class Meta: class Meta:
verbose_name = "Поле" verbose_name = "Вопрос"
verbose_name_plural = "Поля" verbose_name_plural = "Вопросы"
class RightAnswer(models.Model):
question = models.OneToOneField(to=Question)
text = models.TextField(verbose_name="Верный ответ")
success_comment = models.TextField(blank=True, null=True, verbose_name="Комментарий при верном ответе")
error_comment = models.TextField(blank=True, null=True, verbose_name="Комментарий при ошибке")
class Meta:
verbose_name = "Верный ответ"
verbose_name_plural = "Верные ответы"

@ -15,7 +15,7 @@ django.setup()
from yandex_money.models import Payment from yandex_money.models import Payment
from finance.models import Bill, Invoice from finance.models import Bill, Invoice
from access.models.other import Progress from access.models import Progress
from courses.models import Course from courses.models import Course
if __name__ == '__main__': if __name__ == '__main__':

@ -12,7 +12,8 @@ sys.path.append("../")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup() django.setup()
from storage.models import Comment, File from storage.models import File
from access.models.progress import UserLessonAnswer, AnswerItem, ProgressLesson
if __name__ == '__main__': if __name__ == '__main__':
csv.field_size_limit(500 * 1024 * 1024) csv.field_size_limit(500 * 1024 * 1024)

@ -10,80 +10,76 @@ django.setup()
from courses.api import InApiTeacher from courses.api import InApiTeacher
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from courses.models import Course, Lesson, Topic, Demand, LessonDemand from courses.models import Course, Lesson, Topic, Requirement, LessonRequirement
from storage.models import File from storage.models import File
if __name__ == '__main__': if __name__ == '__main__':
Topic.objects.all().delete() Course.objects.all().delete()
# with open('./course/course.csv') as user_csv: with open('./course/course.csv') as user_csv:
# user_reader = csv.DictReader(user_csv) user_reader = csv.DictReader(user_csv)
# for row in user_reader: for row in user_reader:
# row = dict(row) row = dict(row)
# teachers = row.pop('teachers', None).split("[")[1].split("]")[0].split(", ") teachers = row.pop('teachers', None).split("[")[1].split("]")[0].split(", ")
# course, _is_create = Course.objects.get_or_create(**row) course, _is_create = Course.objects.get_or_create(**row)
#
# try:
# for teacher in teachers:
# teacher = teacher.replace("\'", "")
# if teacher:
# teacher = get_user_model().objects.get(email=teacher).out_key
# InApiTeacher.add_teacher(course.slug, teacher)
#
# except get_user_model().DoesNotExist:
# print('Плохо')
with open('./course/old_new_id.csv', 'w') as write_id_csv: try:
writer = csv.writer(write_id_csv) for teacher in teachers:
writer.writerow(['old_id', 'new_id']) teacher = teacher.replace("\'", "")
with open('./course/vertex.csv') as vertex_csv: if teacher:
t_sort = 0 teacher = get_user_model().objects.get(email=teacher).out_key
l_sort = 0 InApiTeacher.add_teacher(course.slug, teacher)
vertex_reader = csv.DictReader(vertex_csv)
for row in vertex_reader:
row = dict(row)
model_type = row.pop('type', None)
description = row.pop('description', None)
title = row.pop('title', None)
pk = row.pop('id', None)
materials = []
try:
m = row.pop('materials', None)
if m:
materials = [File.objects.get(id=i).key for i in m.split("[")[1].split("]")[0].split(", ")]
except ValueError:
pass
if model_type == 'topic': except get_user_model().DoesNotExist:
t_sort += 1 print('Плохо')
course = Course.objects.get(slug=row.pop('course', None))
Topic.objects.create(
id=pk,
icon=row.pop('icon', None),
course=course,
description=description,
title=title,
sort=t_sort,
)
else: with open('./course/vertex.csv') as vertex_csv:
topic_id = row.pop('topic', None) t_sort = 0
l_sort += 1 l_sort = 0
topic = Topic.objects.get(id=topic_id) vertex_reader = csv.DictReader(vertex_csv)
small_vertex = Lesson.objects.create( for row in vertex_reader:
video=row.pop('video', None), row = dict(row)
material_tokens=materials, model_type = row.pop('type', None)
topic=topic, description = row.pop('description', None)
free=row['free'], title = row.pop('title', None)
description=description, pk = row.pop('id', None)
title=title, materials = []
sort=l_sort, try:
) m = row.pop('materials', None)
if m:
materials = [File.objects.get(id=i).key for i in m.split("[")[1].split("]")[0].split(", ")]
except ValueError:
pass
writer.writerow([pk, small_vertex.token]) if model_type == 'topic':
t_sort += 1
course = Course.objects.get(slug=row.pop('course', None))
Topic.objects.create(
id=pk,
icon=row.pop('icon', None),
course=course,
description=description,
title=title,
sort=t_sort,
)
if model_type == 'task': else:
LessonDemand.objects.create( topic_id = row.pop('topic', None)
lesson=small_vertex, l_sort += 1
demand=Demand.objects.get(name="Стандартные требования"), topic = Topic.objects.get(id=topic_id)
) small_vertex = Lesson.objects.create(
video=row.pop('video', None),
material_tokens=materials,
topic=topic,
free=row['free'],
description=description,
title=title,
sort=l_sort,
old_id=pk,
)
if model_type == 'task':
LessonRequirement.objects.create(
lesson=small_vertex,
requirement=Requirement.objects.get(name="Стандартные требования"),
)

@ -14,16 +14,11 @@ django.setup()
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from access.models.other import Progress, ProgressLesson from access.models.progress import ProgressLesson
from access.models import Progress
from courses.models import Lesson, Course from courses.models import Lesson, Course
def find_id(old_id):
with open('./course/old_new_id.csv') as id_csv:
id_reader = csv.DictReader(id_csv)
r = [a['new_id'] for a in id_reader if int(a['old_id']) == old_id][0]
return r
if __name__ == '__main__': if __name__ == '__main__':
Progress.objects.all().delete() Progress.objects.all().delete()
with open('./access/progress.csv') as progress_csv: with open('./access/progress.csv') as progress_csv:
@ -53,7 +48,7 @@ if __name__ == '__main__':
for pivot in pivots: for pivot in pivots:
pv = ProgressLesson.objects.create( pv = ProgressLesson.objects.create(
progress=p, progress=p,
lesson_token=find_id(pivot['id']), lesson_token=Lesson.objects.get(old_id=pivot['id']).token,
teacher=get_user_model().objects.get(email=pivot['teacher']), teacher=get_user_model().objects.get(email=pivot['teacher']),
) )

@ -1,4 +1,4 @@
import os, sys, django, csv, json import os, sys, django, csv
sys.path.append("../") sys.path.append("../")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-11 17:32 # Generated by Django 1.11.6 on 2018-01-12 15:44
from __future__ import unicode_literals from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
@ -21,7 +21,7 @@ class Migration(migrations.Migration):
name='Bill', name='Bill',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('course_token', models.UUIDField(editable=False, unique=True, verbose_name='Токен курса')), ('course_token', models.UUIDField(editable=False, verbose_name='Токен курса')),
('comment', models.TextField(blank=True, editable=False, help_text='Будет показано пользователю', verbose_name='Комментарий продавца')), ('comment', models.TextField(blank=True, editable=False, help_text='Будет показано пользователю', verbose_name='Комментарий продавца')),
('description', models.TextField(blank=True, verbose_name='Внутренняя заметка')), ('description', models.TextField(blank=True, verbose_name='Внутренняя заметка')),
('opener', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Ответственный сотрудник')), ('opener', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Ответственный сотрудник')),

@ -1,20 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-12 10:13
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='bill',
name='course_token',
field=models.UUIDField(editable=False, verbose_name='Токен курса'),
),
]

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-11 17:32 # Generated by Django 1.11.6 on 2018-01-12 15:44
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-11 17:32 # Generated by Django 1.11.6 on 2018-01-12 15:44
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models

Loading…
Cancel
Save