в процессе

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. 3
      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 -*- # -*- 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 __future__ import unicode_literals
import access.models 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')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('b_day', models.DateField(blank=True, null=True)), ('b_day', models.DateField(blank=True, null=True)),
('city', models.CharField(blank=True, max_length=63, 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/')), ('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)), ('phone', models.CharField(blank=True, max_length=15, null=True)),
], ],
@ -67,7 +67,7 @@ class Migration(migrations.Migration):
name='Invite', name='Invite',
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')),
('hash', models.CharField(default='NduzOxMZQyaOJIb', max_length=15)), ('hash', models.CharField(max_length=15)),
('date', models.DateTimeField(blank=True, null=True)), ('date', models.DateTimeField(blank=True, null=True)),
], ],
options={ options={

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- 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 __future__ import unicode_literals
from django.conf import settings from django.conf import settings
@ -12,9 +12,9 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('courses', '0001_initial'),
('access', '0001_initial'), ('access', '0001_initial'),
('auth', '0008_alter_user_username_max_length'), ('auth', '0008_alter_user_username_max_length'),
('courses', '0001_initial'),
] ]
operations = [ 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): class Invite(models.Model):
owner = models.OneToOneField(to=settings.AUTH_USER_MODEL) owner = models.OneToOneField(to=settings.AUTH_USER_MODEL)
hash = models.CharField( hash = models.CharField(max_length=15)
max_length=15, default=''.join(random.choice(string.ascii_letters) for x in range(15))
)
date = models.DateTimeField(null=True, blank=True) date = models.DateTimeField(null=True, blank=True)
class Meta: class Meta:
@ -43,7 +41,6 @@ class Account(models.Model):
def __str__(self): def __str__(self):
return self.owner.email return self.owner.email
class Meta: class Meta:
verbose_name = 'Дополнительная информация о пользователе' verbose_name = 'Дополнительная информация о пользователе'
verbose_name_plural = 'Дополнительная информация о пользователе' verbose_name_plural = 'Дополнительная информация о пользователе'
@ -101,7 +98,7 @@ class CustomUserManager(BaseUserManager):
if is_send: if is_send:
pass 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 return user

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- 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 __future__ import unicode_literals
from django.conf import settings from django.conf import settings
@ -12,9 +12,9 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('contenttypes', '0002_remove_content_type_name'), ('contenttypes', '0002_remove_content_type_name'),
('storage', '0001_initial'), ('storage', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
] ]
operations = [ operations = [
@ -36,12 +36,15 @@ class Migration(migrations.Migration):
('hidden', models.BooleanField(default=False, verbose_name='Видно только оплатившим')), ('hidden', models.BooleanField(default=False, verbose_name='Видно только оплатившим')),
('level', models.CharField(choices=[('B', 'Базовый'), ('A', 'Продвинутый'), ('E', 'Экспертный'), ('B+A', 'Базовый + Продвинутый')], default='B', max_length=3, 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)), ('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='Опубликовать')), ('public', models.BooleanField(default=False, verbose_name='Опубликовать')),
('title', models.CharField(max_length=255, verbose_name='Заголовок')), ('title', models.CharField(max_length=255, verbose_name='Заголовок')),
('description', models.TextField(blank=True, verbose_name='Описание')), ('description', models.TextField(blank=True, verbose_name='Описание')),
('image', models.ImageField(blank=True, upload_to='course', verbose_name='Изображение')), ('image', models.ImageField(blank=True, upload_to='course', verbose_name='Изображение')),
('big_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='Под мобилку')), ('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={ options={
'verbose_name': 'Курс', 'verbose_name': 'Курс',
@ -70,30 +73,14 @@ class Migration(migrations.Migration):
'verbose_name_plural': 'Дипломы', '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( migrations.CreateModel(
name='SkillJ', name='SkillJ',
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')),
('size', models.IntegerField(default=0, verbose_name='Размер')),
], ],
options={ options={
'verbose_name': 'Размер навыка', 'verbose_name': 'Размер навыка',
'verbose_name_plural': 'Размеры навыков', 'verbose_name_plural': 'Размеры навыков',
'ordering': ['id'],
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
@ -110,57 +97,42 @@ class Migration(migrations.Migration):
'verbose_name_plural': 'Навыки', '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( migrations.CreateModel(
name='Task', name='Task',
fields=[ 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='Экзамен или домашка')), ('is_exam', models.BooleanField(default=False, verbose_name='Экзамен или домашка')),
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='Материалы для домашней работы')), ('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='Материалы для домашней работы')),
], ],
bases=('courses.vertex',),
), ),
migrations.CreateModel( migrations.CreateModel(
name='Topic', name='Topic',
fields=[ 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')),
('icon', models.ImageField(blank=True, null=True, upload_to='CourseTheme', verbose_name='Иконка темы')), ('icon', models.ImageField(blank=True, null=True, upload_to='', verbose_name='Иконка темы')),
], ],
bases=('courses.vertex',),
), ),
migrations.CreateModel( migrations.CreateModel(
name='Tutorial', name='Tutorial',
fields=[ 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='Комментарии')), ('on_comment', models.BooleanField(default=True, verbose_name='Комментарии')),
('video', models.TextField(blank=True, default='', verbose_name='Код видео')), ('video', models.TextField(blank=True, default='', verbose_name='Код видео')),
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='Материалы урока')), ('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='Материалы урока')),
], ],
bases=('courses.vertex',),
), ),
migrations.AddField( migrations.CreateModel(
model_name='vertex', name='Vertex',
name='children', fields=[
field=models.ManyToManyField(blank=True, to='courses.Vertex'), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
), ('title', models.CharField(max_length=255, verbose_name='Название')),
migrations.AddField( ('free', models.BooleanField(default=True, verbose_name='Привилегии для узла не будут проверяться')),
model_name='vertex', ('description', models.TextField(blank=True, default='', null=True, verbose_name='Описание')),
name='content_type', ('object_id', models.PositiveIntegerField()),
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), ('children', models.ManyToManyField(blank=True, to='courses.Vertex')),
), ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
migrations.AddField( ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course')),
model_name='vertex', ],
name='course',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course'),
), ),
migrations.AddField( migrations.AddField(
model_name='skillj', model_name='skillj',
@ -172,21 +144,6 @@ class Migration(migrations.Migration):
name='skill', name='skill',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Skills', verbose_name='Навык'), 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( migrations.AddField(
model_name='achievements', model_name='achievements',
name='course', 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 from django.db import models
import json import json
from lms.global_decorators import transaction_decorator
from library.models import Tags from library.models import Tags
from management.models import Comment from management.models import Comment
from storage.models import Storage from storage.models import Storage
@ -94,7 +95,7 @@ class SkillJ(models.Model):
skill = models.ForeignKey(to="Skills", verbose_name=u'Навык') skill = models.ForeignKey(to="Skills", verbose_name=u'Навык')
lesson = models.ForeignKey(to="Vertex", 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: class Meta:
verbose_name = u'Размер навыка' verbose_name = u'Размер навыка'
@ -130,20 +131,34 @@ class Diploma(models.Model):
class VertexManager(models.Manager): class VertexManager(models.Manager):
# Менеджер вершин графа. # Менеджер вершин графа.
def create_with_dependencies(self, model, course, old_id, title, description, @transaction_decorator
free=True, materials=None, **kwargs): 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) 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 [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, content_type=content_type,
object_id=obj.id, object_id=obj.id,
course=course, course=course,
title=title, title=title,
description=description, description=description,
free=free, 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 return res
@ -179,7 +194,7 @@ class Vertex(models.Model):
# Модели нового API со временем всё, что выше будет выпилено # Модели нового API со временем всё, что выше будет выпилено
class Tutorial(Vertex): class Tutorial(models.Model):
""" """
Модель урока. Модель урока.
Урок может быть открыт для комментирования и закрыт, по дефолту открыт, Урок может быть открыт для комментирования и закрыт, по дефолту открыт,
@ -196,7 +211,7 @@ class Tutorial(Vertex):
materials = models.ManyToManyField(Storage, verbose_name=u'Материалы урока', blank=True) 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'Экзамен или домашка') is_exam = models.BooleanField(default=False, verbose_name=u'Экзамен или домашка')
class Topic(Vertex): class Topic(models.Model):
""" """
Модель темы, нужно просто для объединения тасков и уроков. Модель темы, нужно просто для объединения тасков и уроков.
У некоторых тем есть иконка. У некоторых тем есть иконка.
Возможно поле icon перекачует в Vertex, а данная модель отвалится за ненадобностью Возможно поле 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): class CourseMap(models.Model):

@ -1,10 +1,12 @@
import os, sys, django, csv import os, sys, django, csv
from django.db import IntegrityError
sys.path.append("../") sys.path.append("../")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup() django.setup()
from courses.models import Course from courses.models import Course, Vertex
if __name__ == '__main__': if __name__ == '__main__':
with open('./course/course.csv') as user_csv: 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(", ") mentors = row.pop('mentors', None).split("[")[1].split("]")[0].split(", ")
course, _is_create = Course.objects.get_or_create(**row) course, _is_create = Course.objects.get_or_create(**row)
for teacher in teachers: try:
if teacher: for teacher in teachers:
course.teachers.add(teacher) if teacher:
course.teachers.add(teacher)
for mentor in mentors:
if mentor:
course.mentors.add(mentor)
except IntegrityError:
pass
for mentor in mentors: with open('./course/vertex.csv') as vertex_csv:
if mentor: vertex_reader = csv.DictReader(vertex_csv)
course.mentors.add(mentor) 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 -*- # -*- 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 __future__ import unicode_literals
from django.conf import settings from django.conf import settings

@ -2,9 +2,8 @@
from django.contrib import admin 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(Thread)
admin.site.register(Journal) admin.site.register(Journal)
admin.site.register(Action)

@ -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 -*- # -*- 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 __future__ import unicode_literals
from django.conf import settings from django.conf import settings
@ -12,27 +12,19 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('contenttypes', '0002_remove_content_type_name'), ('contenttypes', '0002_remove_content_type_name'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
] ]
operations = [ 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( migrations.CreateModel(
name='Journal', name='Journal',
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')),
('extra_data', models.TextField(default='')), ('extra_data', models.TextField(blank=True, null=True)),
('object_id', models.PositiveIntegerField()), ('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)), ('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')), ('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 management.models import Comment
from finance.models import Bill 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 # Новое API
class Journal(models.Model): class Journal(models.Model):
thread = models.ForeignKey(to='Thread', verbose_name=u'Тред') thread = models.ForeignKey(to='Thread', verbose_name=u'Тред')
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Инициатор действия') user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Инициатор действия')
content_type = models.ForeignKey(to=ContentType) content_type = models.ForeignKey(to=ContentType)
extra_data = models.TextField(default='') extra_data = models.TextField(null=True, blank=True)
object_id = models.PositiveIntegerField() object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id') 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) date = models.DateTimeField(auto_now=True)
def __str__(self): 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): class Thread(models.Model):
@ -74,11 +87,3 @@ class Thread(models.Model):
def __str__(self): def __str__(self):
return self.key 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 -*- # -*- 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 __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 2017-10-17 16:06 # Generated by Django 1.11.6 on 2017-10-18 14:37
from __future__ import unicode_literals from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
@ -12,8 +12,8 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('contenttypes', '0002_remove_content_type_name'), ('contenttypes', '0002_remove_content_type_name'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('storage', '0001_initial'), ('storage', '0001_initial'),
] ]

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- 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 __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 2017-10-17 16:06 # Generated by Django 1.11.6 on 2017-10-18 14:37
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