diff --git a/access/models/other.py b/access/models/other.py index b774feb..ac89c75 100644 --- a/access/models/other.py +++ b/access/models/other.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 = 'Прогресс пользователя' diff --git a/courses/models.py b/courses/models.py index 9e6d878..ecbc38b 100755 --- a/courses/models.py +++ b/courses/models.py @@ -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: diff --git a/courses/views.py b/courses/views.py index 3c22d07..0f43223 100644 --- a/courses/views.py +++ b/courses/views.py @@ -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) diff --git a/lms/tools.py b/lms/tools.py index 9ae929d..32f0002 100644 --- a/lms/tools.py +++ b/lms/tools.py @@ -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)) diff --git a/maps/models.py b/maps/models.py index 78351ac..66a0c55 100644 --- a/maps/models.py +++ b/maps/models.py @@ -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