|
|
|
@ -1,43 +1,93 @@ |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
from django.conf import settings |
|
|
|
from django.conf import settings |
|
|
|
|
|
|
|
from django.contrib.auth import get_user_model |
|
|
|
from django.contrib.contenttypes.fields import GenericForeignKey |
|
|
|
from django.contrib.contenttypes.fields import GenericForeignKey |
|
|
|
from django.contrib.contenttypes.models import ContentType |
|
|
|
from django.contrib.contenttypes.models import ContentType |
|
|
|
from django.db import models |
|
|
|
from django.db import models |
|
|
|
from django.core.exceptions import ObjectDoesNotExist |
|
|
|
from django.core.exceptions import ObjectDoesNotExist |
|
|
|
import json |
|
|
|
import json |
|
|
|
|
|
|
|
import unidecode |
|
|
|
|
|
|
|
from django.template.defaultfilters import slugify |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from lms.tools import decode_base64, get_real_name |
|
|
|
from lms.global_decorators import transaction_decorator |
|
|
|
from lms.global_decorators import transaction_decorator |
|
|
|
from library.models import Tags |
|
|
|
from library.models import Tags |
|
|
|
from storage.models import Storage |
|
|
|
from storage.models import Storage |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
COURSE_LEVEL = ( |
|
|
|
|
|
|
|
('B', 'Базовый'), |
|
|
|
|
|
|
|
('A', 'Продвинутый'), |
|
|
|
|
|
|
|
('E', 'Экспертный'), |
|
|
|
|
|
|
|
('B+A', 'Базовый + Продвинутый'), |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
COURSE_DIRECTION = ( |
|
|
|
|
|
|
|
(3, 'Бизнес'), |
|
|
|
|
|
|
|
(2, 'Веб-дизайн'), |
|
|
|
|
|
|
|
(1, 'Разработка'), |
|
|
|
|
|
|
|
(4, 'Рисование'), |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CourseManager(models.Manager): |
|
|
|
|
|
|
|
@transaction_decorator |
|
|
|
|
|
|
|
def update_or_create_course(self, image=None, big_image=None, id=0, |
|
|
|
|
|
|
|
big_mobile_image=None, mentors=None, slug=None, |
|
|
|
|
|
|
|
teachers=None, level=None, direction=None, **kwargs): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
slug = slug if slug else slugify(unidecode.unidecode(kwargs['title'])) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if image: |
|
|
|
|
|
|
|
kwargs['image'] = decode_base64(image, 'course/image%s.png' % slug) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if big_image: |
|
|
|
|
|
|
|
kwargs['big_image'] = decode_base64(big_image, 'course/big_image%s.png' % slug) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if big_mobile_image: |
|
|
|
|
|
|
|
kwargs['big_mobile_image'] = decode_base64(big_mobile_image, 'course/big_mobile_image%s.png' % slug) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if level: |
|
|
|
|
|
|
|
kwargs['level'] = get_real_name(COURSE_LEVEL, level) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if direction: |
|
|
|
|
|
|
|
kwargs['direction'] = get_real_name(COURSE_DIRECTION, direction) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
course = self.get(id=id) |
|
|
|
|
|
|
|
for i in kwargs: |
|
|
|
|
|
|
|
setattr(course, i, kwargs[i]) |
|
|
|
|
|
|
|
course.save() |
|
|
|
|
|
|
|
except ObjectDoesNotExist: |
|
|
|
|
|
|
|
kwargs['slug'] = slug |
|
|
|
|
|
|
|
course = self.create(**kwargs) |
|
|
|
|
|
|
|
CourseMap.objects.create(course=course) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if mentors: |
|
|
|
|
|
|
|
for email in mentors: |
|
|
|
|
|
|
|
course.mentors.add(get_user_model().objects.get(email=email)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if teachers: |
|
|
|
|
|
|
|
for email in teachers: |
|
|
|
|
|
|
|
course.teachers.add(get_user_model().objects.get(email=email)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return course |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Course(models.Model): |
|
|
|
class Course(models.Model): |
|
|
|
COURSE_LEVEL = ( |
|
|
|
hidden = models.BooleanField(verbose_name='Видно только оплатившим', default=False) |
|
|
|
('B', u'Базовый'), |
|
|
|
level = models.CharField(verbose_name='Уровень', choices=COURSE_LEVEL, default='B', max_length=3) |
|
|
|
('A', u'Продвинутый'), |
|
|
|
slug = models.SlugField(max_length=255, blank=True, default='', unique=True, editable=False) |
|
|
|
('E', u'Экспертный'), |
|
|
|
direction = models.SmallIntegerField(choices=COURSE_DIRECTION, verbose_name='Направление', null=True) |
|
|
|
('B+A', u'Базовый + Продвинутый') |
|
|
|
mentors = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='Кураторы', blank=True, |
|
|
|
) |
|
|
|
|
|
|
|
COURSE_DIRECTION = ( |
|
|
|
|
|
|
|
(3, 'Бизнес'), |
|
|
|
|
|
|
|
(2, 'Веб-дизайн'), |
|
|
|
|
|
|
|
(1, 'Разработка'), |
|
|
|
|
|
|
|
(4, 'Рисование') |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
hidden = models.BooleanField(verbose_name=u'Видно только оплатившим', default=False) |
|
|
|
|
|
|
|
level = models.CharField(verbose_name=u'Уровень', choices=COURSE_LEVEL, default='B', max_length=3) |
|
|
|
|
|
|
|
slug = models.SlugField(max_length=255, editable=False, blank=True, default='', unique=True) |
|
|
|
|
|
|
|
direction = models.SmallIntegerField(choices=COURSE_DIRECTION, verbose_name=u'Направление', null=True) |
|
|
|
|
|
|
|
mentors = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name=u'Кураторы', blank=True, |
|
|
|
|
|
|
|
related_name='course_mentors') |
|
|
|
related_name='course_mentors') |
|
|
|
public = models.BooleanField(verbose_name=u'Опубликовать', default=False) |
|
|
|
public = models.BooleanField(verbose_name='Опубликовать', default=False) |
|
|
|
title = models.CharField(verbose_name=u"Заголовок", max_length=255) |
|
|
|
title = models.CharField(verbose_name="Заголовок", max_length=255) |
|
|
|
description = models.TextField(verbose_name=u'Описание', blank=True) |
|
|
|
description = models.TextField(verbose_name='Описание', blank=True) |
|
|
|
image = models.ImageField(verbose_name=u'Изображение', upload_to='course', blank=True) |
|
|
|
image = models.URLField(verbose_name='Изображение', blank=True, max_length=255) |
|
|
|
big_image = models.ImageField(verbose_name=u'Большое изображение', upload_to='course', blank=True) |
|
|
|
big_image = models.URLField(verbose_name='Большое изображение', blank=True, max_length=255) |
|
|
|
big_mobile_image = models.ImageField(verbose_name=u'Под мобилку', upload_to='course', blank=True, null=True, |
|
|
|
big_mobile_image = models.URLField(verbose_name='Под мобилку', blank=True, null=True, |
|
|
|
help_text=u'Большая картинка для мобильной версии') |
|
|
|
help_text='Большая картинка для мобильной версии', max_length=255) |
|
|
|
teachers = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name=u'Преподаватели', |
|
|
|
teachers = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='Преподаватели', |
|
|
|
related_name='course_teachers') |
|
|
|
related_name='course_teachers') |
|
|
|
|
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
def __str__(self): |
|
|
|
@ -105,6 +155,8 @@ class Course(models.Model): |
|
|
|
|
|
|
|
|
|
|
|
return vertex.get_previous(vertex_model_list) |
|
|
|
return vertex.get_previous(vertex_model_list) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
objects = CourseManager() |
|
|
|
|
|
|
|
|
|
|
|
class Meta: |
|
|
|
class Meta: |
|
|
|
verbose_name = u"Курс" |
|
|
|
verbose_name = u"Курс" |
|
|
|
verbose_name_plural = u"Курсы" |
|
|
|
verbose_name_plural = u"Курсы" |
|
|
|
@ -235,7 +287,7 @@ class Vertex(models.Model): |
|
|
|
raise ValueError('undefined model: ' + i) |
|
|
|
raise ValueError('undefined model: ' + i) |
|
|
|
|
|
|
|
|
|
|
|
vertex_id = CourseMap.objects.get(course=self.course).get_next(self.id) |
|
|
|
vertex_id = CourseMap.objects.get(course=self.course).get_next(self.id) |
|
|
|
vertex = Vertex.objects.get(id=int(vertex_id),) |
|
|
|
vertex = Vertex.objects.get(id=int(vertex_id), ) |
|
|
|
|
|
|
|
|
|
|
|
if vertex.content_type.model in vertex_model_list: |
|
|
|
if vertex.content_type.model in vertex_model_list: |
|
|
|
return vertex |
|
|
|
return vertex |
|
|
|
@ -251,7 +303,7 @@ class Vertex(models.Model): |
|
|
|
raise ValueError('undefined model: ' + i) |
|
|
|
raise ValueError('undefined model: ' + i) |
|
|
|
|
|
|
|
|
|
|
|
vertex_id = CourseMap.objects.get(course=self.course).get_previous(self.id) |
|
|
|
vertex_id = CourseMap.objects.get(course=self.course).get_previous(self.id) |
|
|
|
vertex = Vertex.objects.get(id=int(vertex_id),) |
|
|
|
vertex = Vertex.objects.get(id=int(vertex_id), ) |
|
|
|
|
|
|
|
|
|
|
|
if vertex.content_type.model in vertex_model_list: |
|
|
|
if vertex.content_type.model in vertex_model_list: |
|
|
|
return vertex |
|
|
|
return vertex |
|
|
|
|