feature/fix_generate_pass
Andrey 8 years ago
parent bc0b8112bc
commit 57a5f35e73
  1. 2
      access/models/other.py
  2. 23
      courses/models.py
  3. 12
      courses/views.py
  4. 3
      lms/tools.py
  5. 16
      maps/models.py

@ -60,7 +60,7 @@ class Progress(models.Model):
return self.get_template().get_active_objects(self.user) return self.get_template().get_active_objects(self.user)
def is_access(self, vertex): def is_access(self, vertex):
return vertex in self.progress_list.all() or vertex == self.get_objects_in_progress() return vertex in self.progress_list.all() or vertex in self.get_objects_in_progress()
class Meta: class Meta:
verbose_name = 'Прогресс пользователя' verbose_name = 'Прогресс пользователя'

@ -33,7 +33,7 @@ COURSE_DIRECTION = (
class CourseManager(models.Manager): class CourseManager(models.Manager):
@transaction_decorator @transaction_decorator
def update_or_create_course(self, image=None, big_image=None, id=0, def update_or_create_course(self, image=None, big_image=None, id=0, route=None,
big_mobile_image=None, mentors=None, slug=None, big_mobile_image=None, mentors=None, slug=None,
teachers=None, level=None, direction=None, **kwargs): teachers=None, level=None, direction=None, **kwargs):
@ -54,6 +54,9 @@ class CourseManager(models.Manager):
if direction: if direction:
kwargs['direction'] = get_real_name(COURSE_DIRECTION, direction) kwargs['direction'] = get_real_name(COURSE_DIRECTION, direction)
if route:
kwargs['route'] = CourseRoute.objects.get(id=route)
try: try:
course = self.get(id=id) course = self.get(id=id)
for i in kwargs: for i in kwargs:
@ -62,6 +65,7 @@ class CourseManager(models.Manager):
course.save() course.save()
except ObjectDoesNotExist: except ObjectDoesNotExist:
kwargs['slug'] = slug kwargs['slug'] = slug
kwargs['route'] = CourseRoute.objects.create(name="Основной шаблон")
course = self.create(**kwargs) course = self.create(**kwargs)
CourseMap.objects.create(course=course) CourseMap.objects.create(course=course)
@ -214,21 +218,8 @@ class Vertex(models.Model):
def __str__(self): def __str__(self):
return self.title + ': ' + str(self.content_type.model) return self.title + ': ' + str(self.content_type.model)
def get_next(self, vertex_model_list=None): def get_next(self, route):
if vertex_model_list is None: return route.get_first().get_next(self)
vertex_model_list = ['topic', 'tutorial', 'task']
else:
for i in vertex_model_list:
if i not in ['topic', 'tutorial', 'task']:
raise ValueError('undefined model: ' + i)
vertex_id = CourseMap.objects.get(course=self.course).get_next(self.id)
vertex = Vertex.objects.get(id=int(vertex_id), )
if vertex.content_type.model in vertex_model_list:
return vertex
return vertex.get_next(vertex_model_list)
def get_previous(self, vertex_model_list=None): def get_previous(self, vertex_model_list=None):
if vertex_model_list is None: if vertex_model_list is None:

@ -5,7 +5,7 @@ from rest_framework.response import Response
from access.models import Progress from access.models import Progress
from maps.serializers import CourseMapSerializer from maps.serializers import CourseMapSerializer
from courses.models import Course, Vertex from courses.models import Course, Vertex
from courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer from courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer, MiniVertexSerializer
from journals.models import Thread from journals.models import Thread
@ -85,12 +85,10 @@ class VertexDetail(APIView):
res = VertexSerializer(vertex).data res = VertexSerializer(vertex).data
progress = vertex.course.progress_set.filter(user=request.user) progress = vertex.course.progress_set.filter(user=request.user)
try: try:
journals = Thread.objects.get(key="user_%s__vertex_%s" % (request.user.id, vertex.id)).journal_set.all() if progress.exists():
res['is_in_progress'] = progress.exists() and progress[0].active_obj == vertex and \ res['next'] = MiniVertexSerializer(vertex.get_next(progress[0].get_template())).data
vertex.content_type.model == 'task' and \ res['is_in_progress'] = vertex in progress[0].get_objects_in_progress()
not journals.filter(action_type__in=['no', 'yes']).count() < \ except Thread.DoesNotExist or Vertex.DoesNotExist:
journals.filter(action_type='try').count()
except Thread.DoesNotExist:
pass pass
return Response(res, status=200) if status == 200 else Response(status=204) return Response(res, status=200) if status == 200 else Response(status=204)

@ -1,4 +1,4 @@
import base64 import base64, os
from django.conf import settings from django.conf import settings
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
@ -10,6 +10,7 @@ def decode_base64(my_str, upload_to=None):
ext = my_str.split('/')[-1] ext = my_str.split('/')[-1]
return ContentFile(base64.b64decode(my_str), name='temp.' + ext) return ContentFile(base64.b64decode(my_str), name='temp.' + ext)
path = "%s/%s" % (settings.MEDIA_ROOT, upload_to) path = "%s/%s" % (settings.MEDIA_ROOT, upload_to)
os.makedirs(os.path.dirname(path), exist_ok=True)
url = "%s%s" % (settings.MEDIA_URL, upload_to) url = "%s%s" % (settings.MEDIA_URL, upload_to)
with open(path, "wb") as fh: with open(path, "wb") as fh:
fh.write(base64.b64decode(my_str)) fh.write(base64.b64decode(my_str))

@ -2,6 +2,7 @@ from django.db import models
from lms.global_decorators import transaction_decorator from lms.global_decorators import transaction_decorator
from maps.exeptions import MapTypeError from maps.exeptions import MapTypeError
from django.db.models import Q
class CourseRoute(models.Model): class CourseRoute(models.Model):
@ -39,6 +40,10 @@ class CourseMap(models.Model):
course = models.ForeignKey(to='courses.Course', verbose_name='К какому курсу привязан') course = models.ForeignKey(to='courses.Course', verbose_name='К какому курсу привязан')
name = models.CharField(max_length=255, verbose_name="Имя прохождения", default="Линейное прохождение") name = models.CharField(max_length=255, verbose_name="Имя прохождения", default="Линейное прохождение")
def get_next(self, vertex):
next_idx = self.pivotvertex_set.get(vertex=vertex).sort + 1
return self.pivotvertex_set.get(sort=next_idx).vertex
@transaction_decorator @transaction_decorator
def add_vertex(self, vertex, sort): def add_vertex(self, vertex, sort):
if sort > self.pivotvertex_set.count() + 1: if sort > self.pivotvertex_set.count() + 1:
@ -79,15 +84,18 @@ class CourseMap(models.Model):
return helper([i.vertex for i in self.pivotvertex_set.filter(vertex__vertex__isnull=True)]) return helper([i.vertex for i in self.pivotvertex_set.filter(vertex__vertex__isnull=True)])
def get_difference(self, user) -> list: def get_difference(self, user) -> list:
return list(set([i.vertex for i in self.pivotvertex_set.all()]) success_list = user.progress_set.get(course=self.course).progress_list.all()
.difference(set(user.progress_set.get(course=self.course).progress_list.all()))) all_vertex = [i.vertex for i in self.pivotvertex_set.all()]
res = list(set(all_vertex).difference(set(success_list)))
return res
def is_finish(self, user) -> bool: def is_finish(self, user) -> bool:
return self.get_difference(user) == [] return self.get_difference(user) == []
def get_active_object(self, user): def get_active_object(self, user):
return self.pivotvertex_set.exclude(vertex__in=self.get_difference(user), vertex__content_type__model='topic')[ return self.pivotvertex_set.exclude(
0].vertex vertex__content_type__model='topic'
).filter(vertex__in=self.get_difference(user)).first().vertex
def __str__(self): def __str__(self):
return '''Линейное прохождение по курсу "%s"''' % self.course.title return '''Линейное прохождение по курсу "%s"''' % self.course.title

Loading…
Cancel
Save