в процессе

feature/fix_generate_pass
Andrey 8 years ago
parent 8fbdb28e92
commit fd87fb52ee
  1. 6
      access/migrations/0001_initial.py
  2. 4
      access/migrations/0002_auto_20171018_1437.py
  3. 25
      access/migrations/0003_auto_20171017_1623.py
  4. 25
      access/migrations/0004_auto_20171018_1022.py
  5. 25
      access/migrations/0005_auto_20171018_1025.py
  6. 7
      access/models.py
  7. 85
      courses/migrations/0001_initial.py
  8. 23
      courses/migrations/0004_auto_20171018_1025.py
  9. 35
      courses/models.py
  10. 29
      csv/load_courses.py
  11. 2
      finance/migrations/0001_initial.py
  12. 5
      journals/admin.py
  13. 60
      journals/default_ations.py
  14. 16
      journals/migrations/0001_initial.py
  15. 27
      journals/models.py
  16. 2
      library/migrations/0001_initial.py
  17. 4
      management/migrations/0001_initial.py
  18. 2
      service/migrations/0001_initial.py
  19. 2
      storage/migrations/0001_initial.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:06
# Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals
import access.models
@ -43,7 +43,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('b_day', models.DateField(blank=True, null=True)),
('city', models.CharField(blank=True, max_length=63, null=True)),
('gender', models.SmallIntegerField(choices=[(1, 'male'), (0, 'undefined'), (2, 'female')], default=0)),
('gender', models.SmallIntegerField(choices=[(2, 'female'), (1, 'male'), (0, 'undefined')], default=0)),
('photo', models.ImageField(blank=True, default='user/photo/default_avatar.png', null=True, upload_to='user/photo/')),
('phone', models.CharField(blank=True, max_length=15, null=True)),
],
@ -67,7 +67,7 @@ class Migration(migrations.Migration):
name='Invite',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('hash', models.CharField(default='NduzOxMZQyaOJIb', max_length=15)),
('hash', models.CharField(max_length=15)),
('date', models.DateTimeField(blank=True, null=True)),
],
options={

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:06
# Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals
from django.conf import settings
@ -12,9 +12,9 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('courses', '0001_initial'),
('access', '0001_initial'),
('auth', '0008_alter_user_username_max_length'),
('courses', '0001_initial'),
]
operations = [

@ -1,25 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:23
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0002_auto_20171017_1606'),
]
operations = [
migrations.AlterField(
model_name='account',
name='gender',
field=models.SmallIntegerField(choices=[(1, 'male'), (2, 'female'), (0, 'undefined')], default=0),
),
migrations.AlterField(
model_name='invite',
name='hash',
field=models.CharField(default='CMrIVEzSAMFLaRx', max_length=15),
),
]

@ -1,25 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-18 10:22
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0003_auto_20171017_1623'),
]
operations = [
migrations.AlterField(
model_name='account',
name='gender',
field=models.SmallIntegerField(choices=[(2, 'female'), (0, 'undefined'), (1, 'male')], default=0),
),
migrations.AlterField(
model_name='invite',
name='hash',
field=models.CharField(default='eyCJRNJduvUlzpu', max_length=15),
),
]

@ -1,25 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-18 10:25
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0004_auto_20171018_1022'),
]
operations = [
migrations.AlterField(
model_name='account',
name='gender',
field=models.SmallIntegerField(choices=[(1, 'male'), (2, 'female'), (0, 'undefined')], default=0),
),
migrations.AlterField(
model_name='invite',
name='hash',
field=models.CharField(default='iaTxuvvpFPbVQPt', max_length=15),
),
]

@ -17,9 +17,7 @@ from lms.global_decorators import transaction_decorator
class Invite(models.Model):
owner = models.OneToOneField(to=settings.AUTH_USER_MODEL)
hash = models.CharField(
max_length=15, default=''.join(random.choice(string.ascii_letters) for x in range(15))
)
hash = models.CharField(max_length=15)
date = models.DateTimeField(null=True, blank=True)
class Meta:
@ -43,7 +41,6 @@ class Account(models.Model):
def __str__(self):
return self.owner.email
class Meta:
verbose_name = 'Дополнительная информация о пользователе'
verbose_name_plural = 'Дополнительная информация о пользователе'
@ -101,7 +98,7 @@ class CustomUserManager(BaseUserManager):
if is_send:
pass
Invite.objects.create(owner=user)
Invite.objects.create(owner=user, hash=''.join(random.choice(string.ascii_letters) for x in range(15)))
# Должна идти отбивка
return user

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:06
# Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals
from django.conf import settings
@ -12,9 +12,9 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('contenttypes', '0002_remove_content_type_name'),
('storage', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@ -36,12 +36,15 @@ class Migration(migrations.Migration):
('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(blank=True, default='', editable=False, max_length=255, unique=True)),
('direction', models.SmallIntegerField(choices=[(3, 'Бизнес'), (2, 'Веб-дизайн'), (1, 'Разработка'), (4, 'Рисование')], null=True, verbose_name='Направление')),
('public', models.BooleanField(default=False, verbose_name='Опубликовать')),
('title', models.CharField(max_length=255, verbose_name='Заголовок')),
('description', models.TextField(blank=True, verbose_name='Описание')),
('image', models.ImageField(blank=True, upload_to='course', verbose_name='Изображение')),
('big_image', models.ImageField(blank=True, upload_to='course', verbose_name='Большое изображение')),
('big_mobile_image', models.ImageField(blank=True, help_text='Большая картинка для мобильной версии', null=True, upload_to='course', verbose_name='Под мобилку')),
('mentors', models.ManyToManyField(blank=True, related_name='course_mentors', to=settings.AUTH_USER_MODEL, verbose_name='Кураторы')),
('teachers', models.ManyToManyField(related_name='course_teachers', to=settings.AUTH_USER_MODEL, verbose_name='Преподаватели')),
],
options={
'verbose_name': 'Курс',
@ -70,30 +73,14 @@ class Migration(migrations.Migration):
'verbose_name_plural': 'Дипломы',
},
),
migrations.CreateModel(
name='MaterialDirection',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255, verbose_name='Заголовок')),
('color', models.CharField(max_length=50, verbose_name='Цвет')),
('description', models.TextField(blank=True, verbose_name='Описание')),
('mentors', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='Кураторы')),
],
options={
'verbose_name': 'Направление',
'verbose_name_plural': 'Направления',
},
),
migrations.CreateModel(
name='SkillJ',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('size', models.IntegerField(default=0, verbose_name='Размер')),
],
options={
'verbose_name': 'Размер навыка',
'verbose_name_plural': 'Размеры навыков',
'ordering': ['id'],
},
),
migrations.CreateModel(
@ -110,57 +97,42 @@ class Migration(migrations.Migration):
'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=True, verbose_name='Привилегии для узла не будут проверяться')),
('description', models.TextField(blank=True, default='', null=True, verbose_name='Описание')),
('object_id', models.PositiveIntegerField()),
],
),
migrations.CreateModel(
name='Task',
fields=[
('vertex_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Vertex')),
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_exam', models.BooleanField(default=False, verbose_name='Экзамен или домашка')),
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='Материалы для домашней работы')),
],
bases=('courses.vertex',),
),
migrations.CreateModel(
name='Topic',
fields=[
('vertex_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Vertex')),
('icon', models.ImageField(blank=True, null=True, upload_to='CourseTheme', verbose_name='Иконка темы')),
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('icon', models.ImageField(blank=True, null=True, upload_to='', verbose_name='Иконка темы')),
],
bases=('courses.vertex',),
),
migrations.CreateModel(
name='Tutorial',
fields=[
('vertex_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Vertex')),
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('on_comment', models.BooleanField(default=True, verbose_name='Комментарии')),
('video', models.TextField(blank=True, default='', verbose_name='Код видео')),
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='Материалы урока')),
],
bases=('courses.vertex',),
),
migrations.AddField(
model_name='vertex',
name='children',
field=models.ManyToManyField(blank=True, to='courses.Vertex'),
),
migrations.AddField(
model_name='vertex',
name='content_type',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'),
),
migrations.AddField(
model_name='vertex',
name='course',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course'),
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=True, verbose_name='Привилегии для узла не будут проверяться')),
('description', models.TextField(blank=True, default='', null=True, verbose_name='Описание')),
('object_id', models.PositiveIntegerField()),
('children', models.ManyToManyField(blank=True, to='courses.Vertex')),
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course')),
],
),
migrations.AddField(
model_name='skillj',
@ -172,21 +144,6 @@ class Migration(migrations.Migration):
name='skill',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Skills', verbose_name='Навык'),
),
migrations.AddField(
model_name='course',
name='direction',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.MaterialDirection', verbose_name='Направление'),
),
migrations.AddField(
model_name='course',
name='mentors',
field=models.ManyToManyField(blank=True, related_name='course_mentors', to=settings.AUTH_USER_MODEL, verbose_name='Кураторы'),
),
migrations.AddField(
model_name='course',
name='teachers',
field=models.ManyToManyField(related_name='course_teachers', to=settings.AUTH_USER_MODEL, verbose_name='Преподаватели'),
),
migrations.AddField(
model_name='achievements',
name='course',

@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-18 10:25
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('courses', '0003_auto_20171018_1022'),
]
operations = [
migrations.AlterModelOptions(
name='skillj',
options={'verbose_name': 'Размер навыка', 'verbose_name_plural': 'Размеры навыков'},
),
migrations.RemoveField(
model_name='skillj',
name='size',
),
]

@ -5,6 +5,7 @@ from django.contrib.contenttypes.models import ContentType
from django.db import models
import json
from lms.global_decorators import transaction_decorator
from library.models import Tags
from management.models import Comment
from storage.models import Storage
@ -94,7 +95,7 @@ class SkillJ(models.Model):
skill = models.ForeignKey(to="Skills", verbose_name=u'Навык')
lesson = models.ForeignKey(to="Vertex", verbose_name=u'Урок')
def __str__(self): return '%s %s' % (self.skill, self.size)
def __str__(self): return '%s' % self.skill
class Meta:
verbose_name = u'Размер навыка'
@ -130,20 +131,34 @@ class Diploma(models.Model):
class VertexManager(models.Manager):
# Менеджер вершин графа.
def create_with_dependencies(self, model, course, old_id, title, description,
free=True, materials=None, **kwargs):
@transaction_decorator
def create_with_dependencies(self, model, course, title, description, extra_data=None,
free=True, materials=None, parents=None, children=None):
extra_data = json.loads(extra_data)
content_type = ContentType.objects.get(app_label='courses', model=model)
obj, _is_create = content_type.model_class().objects.update_or_create(**kwargs)
obj = content_type.model_class().objects.create(**extra_data)
[obj.materials.add(i) for i in materials] if materials else None
res, _is_create = self.update_or_create(
res = self.create(
content_type=content_type,
object_id=obj.id,
course=course,
title=title,
description=description,
free=free,
old_id=old_id,
)
if children:
for child in children:
res.children.add(child)
if parents:
for parent in parents:
parent.children.add(res)
return res
@ -179,7 +194,7 @@ class Vertex(models.Model):
# Модели нового API со временем всё, что выше будет выпилено
class Tutorial(Vertex):
class Tutorial(models.Model):
"""
Модель урока.
Урок может быть открыт для комментирования и закрыт, по дефолту открыт,
@ -196,7 +211,7 @@ class Tutorial(Vertex):
materials = models.ManyToManyField(Storage, verbose_name=u'Материалы урока', blank=True)
class Task(Vertex):
class Task(models.Model):
"""
Модель таска.
Исторически сложилось, что на сервере хостятся два типа тасков отличающихся лишь наименованием
@ -209,13 +224,13 @@ class Task(Vertex):
is_exam = models.BooleanField(default=False, verbose_name=u'Экзамен или домашка')
class Topic(Vertex):
class Topic(models.Model):
"""
Модель темы, нужно просто для объединения тасков и уроков.
У некоторых тем есть иконка.
Возможно поле icon перекачует в Vertex, а данная модель отвалится за ненадобностью
"""
icon = models.ImageField(verbose_name=u'Иконка темы', upload_to='CourseTheme', null=True, blank=True)
icon = models.ImageField(verbose_name=u'Иконка темы', null=True, blank=True)
class CourseMap(models.Model):

@ -1,10 +1,12 @@
import os, sys, django, csv
from django.db import IntegrityError
sys.path.append("../")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup()
from courses.models import Course
from courses.models import Course, Vertex
if __name__ == '__main__':
with open('./course/course.csv') as user_csv:
@ -15,10 +17,23 @@ if __name__ == '__main__':
mentors = row.pop('mentors', None).split("[")[1].split("]")[0].split(", ")
course, _is_create = Course.objects.get_or_create(**row)
for teacher in teachers:
if teacher:
course.teachers.add(teacher)
try:
for teacher in teachers:
if teacher:
course.teachers.add(teacher)
for mentor in mentors:
if mentor:
course.mentors.add(mentor)
except IntegrityError:
pass
for mentor in mentors:
if mentor:
course.mentors.add(mentor)
with open('./course/vertex.csv') as vertex_csv:
vertex_reader = csv.DictReader(vertex_csv)
for row in vertex_reader:
row = dict(row)
model = row.pop('type', None)
parent = row.pop('parent', None)
course = Course.objects.get(id=row.pop('course', None))
parents = [parent] if parent else []
Vertex.objects.create_with_dependencies(model=model, course=course, parents=parents, **row)

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:06
# Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals
from django.conf import settings

@ -2,9 +2,8 @@
from django.contrib import admin
from journals.models import Thread, Journal, Action
from journals.models import Thread, Journal
admin.site.register(Thread)
admin.site.register(Journal)
admin.site.register(Action)
admin.site.register(Journal)

@ -1,60 +0,0 @@
import os, sys, django
sys.path.append("../")
os.environ['PG_PORT_5432_TCP_ADDR'] = '127.0.0.1'
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup()
from journals.models import Action
if __name__ == '__main__':
Action.objects.update_or_create(
name='try',
text='попытка сдачи чего-либо',
)
Action.objects.update_or_create(
name='yes',
text='одобрение чего-либо',
)
Action.objects.update_or_create(
name='no',
text='отказ от чего-либо',
)
Action.objects.update_or_create(
name='favorite',
text='добавить в избранное',
)
Action.objects.update_or_create(
name='watch',
text='просмотр',
)
Action.objects.update_or_create(
name='start',
text='начало чего-либо',
)
Action.objects.update_or_create(
name='end',
text='окончание чего-либо',
)
Action.objects.update_or_create(
name='create',
text='создание чего-либо',
)
Action.objects.update_or_create(
name='delete',
text='удаление чего-либо',
)
Action.objects.update_or_create(
name='update',
text='изминение чего-либо',
)

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:06
# Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals
from django.conf import settings
@ -12,27 +12,19 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('contenttypes', '0002_remove_content_type_name'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Action',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Наименование действия (на английском)')),
('text', models.TextField(verbose_name='Описание действия')),
],
),
migrations.CreateModel(
name='Journal',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('extra_data', models.TextField(default='')),
('extra_data', models.TextField(blank=True, null=True)),
('object_id', models.PositiveIntegerField()),
('action_type', models.SmallIntegerField(choices=[(0, 'try'), (1, 'yes'), (2, 'no'), (3, 'favorite'), (4, 'watch'), (5, 'start'), (6, 'end'), (7, 'create'), (8, 'update'), (9, 'delete')])),
('date', models.DateTimeField(auto_now=True)),
('action_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='journals.Action')),
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
],
),

@ -10,20 +10,33 @@ from courses.models import Achievements, Course, CourseMap, Diploma
from management.models import Comment
from finance.models import Bill
ACTION_CHOICES = (
(0, 'try'),
(1, 'yes'),
(2, 'no'),
(3, 'favorite'),
(4, 'watch'),
(5, 'start'),
(6, 'end'),
(7, 'create'),
(8, 'update'),
(9, 'delete'),
)
# Новое API
class Journal(models.Model):
thread = models.ForeignKey(to='Thread', verbose_name=u'Тред')
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Инициатор действия')
content_type = models.ForeignKey(to=ContentType)
extra_data = models.TextField(default='')
extra_data = models.TextField(null=True, blank=True)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
action_type = models.ForeignKey(to='Action')
action_type = models.SmallIntegerField(choices=ACTION_CHOICES)
date = models.DateTimeField(auto_now=True)
def __str__(self):
return '%d Пользователь %s %s %s' % (self.id, self.user.email, self.action_type.name, self.thread.key)
return '%d Пользователь %s %s %s' % (self.id, self.user.email, self.get_action_type_display(), self.thread.key)
class Thread(models.Model):
@ -74,11 +87,3 @@ class Thread(models.Model):
def __str__(self):
return self.key
class Action(models.Model):
name = models.CharField(max_length=255, verbose_name=u'Наименование действия (на английском)')
text = models.TextField(verbose_name=u'Описание действия')
def __str__(self):
return "%s (%s)" % (self.name, self.text)

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:06
# Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals
import datetime

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:06
# Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals
from django.conf import settings
@ -12,8 +12,8 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('contenttypes', '0002_remove_content_type_name'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('storage', '0001_initial'),
]

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:06
# Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals
import datetime

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-17 16:06
# Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals
from django.db import migrations, models

Loading…
Cancel
Save