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)
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:
verbose_name = 'Прогресс пользователя'

@ -33,7 +33,7 @@ COURSE_DIRECTION = (
class CourseManager(models.Manager):
@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,
teachers=None, level=None, direction=None, **kwargs):
@ -54,6 +54,9 @@ class CourseManager(models.Manager):
if direction:
kwargs['direction'] = get_real_name(COURSE_DIRECTION, direction)
if route:
kwargs['route'] = CourseRoute.objects.get(id=route)
try:
course = self.get(id=id)
for i in kwargs:
@ -62,6 +65,7 @@ class CourseManager(models.Manager):
course.save()
except ObjectDoesNotExist:
kwargs['slug'] = slug
kwargs['route'] = CourseRoute.objects.create(name="Основной шаблон")
course = self.create(**kwargs)
CourseMap.objects.create(course=course)
@ -214,21 +218,8 @@ class Vertex(models.Model):
def __str__(self):
return self.title + ': ' + str(self.content_type.model)
def get_next(self, vertex_model_list=None):
if vertex_model_list is None:
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_next(self, route):
return route.get_first().get_next(self)
def get_previous(self, vertex_model_list=None):
if vertex_model_list is None:

@ -5,7 +5,7 @@ from rest_framework.response import Response
from access.models import Progress
from maps.serializers import CourseMapSerializer
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
@ -85,12 +85,10 @@ class VertexDetail(APIView):
res = VertexSerializer(vertex).data
progress = vertex.course.progress_set.filter(user=request.user)
try:
journals = Thread.objects.get(key="user_%s__vertex_%s" % (request.user.id, vertex.id)).journal_set.all()
res['is_in_progress'] = progress.exists() and progress[0].active_obj == vertex and \
vertex.content_type.model == 'task' and \
not journals.filter(action_type__in=['no', 'yes']).count() < \
journals.filter(action_type='try').count()
except Thread.DoesNotExist:
if progress.exists():
res['next'] = MiniVertexSerializer(vertex.get_next(progress[0].get_template())).data
res['is_in_progress'] = vertex in progress[0].get_objects_in_progress()
except Thread.DoesNotExist or Vertex.DoesNotExist:
pass
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.core.files.base import ContentFile
@ -10,6 +10,7 @@ def decode_base64(my_str, upload_to=None):
ext = my_str.split('/')[-1]
return ContentFile(base64.b64decode(my_str), name='temp.' + ext)
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)
with open(path, "wb") as fh:
fh.write(base64.b64decode(my_str))

@ -2,6 +2,7 @@ from django.db import models
from lms.global_decorators import transaction_decorator
from maps.exeptions import MapTypeError
from django.db.models import Q
class CourseRoute(models.Model):
@ -39,6 +40,10 @@ class CourseMap(models.Model):
course = models.ForeignKey(to='courses.Course', verbose_name='К какому курсу привязан')
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
def add_vertex(self, vertex, sort):
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)])
def get_difference(self, user) -> list:
return list(set([i.vertex for i in self.pivotvertex_set.all()])
.difference(set(user.progress_set.get(course=self.course).progress_list.all())))
success_list = 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:
return self.get_difference(user) == []
def get_active_object(self, user):
return self.pivotvertex_set.exclude(vertex__in=self.get_difference(user), vertex__content_type__model='topic')[
0].vertex
return self.pivotvertex_set.exclude(
vertex__content_type__model='topic'
).filter(vertex__in=self.get_difference(user)).first().vertex
def __str__(self):
return '''Линейное прохождение по курсу "%s"''' % self.course.title

Loading…
Cancel
Save