From 486f19023e418015100126fe53323799b8c762de Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 24 Jan 2018 21:25:55 +0300 Subject: [PATCH] fix --- access/models/progress.py | 22 ++++++++++++++++++++++ access/serializers.py | 19 +++++++++++++++++++ access/urls.py | 1 + access/views.py | 24 +++++++++++++++++++++++- courses/api.py | 8 ++++++++ 5 files changed, 73 insertions(+), 1 deletion(-) diff --git a/access/models/progress.py b/access/models/progress.py index 7a86e21..7ef76be 100644 --- a/access/models/progress.py +++ b/access/models/progress.py @@ -2,6 +2,7 @@ from django.conf import settings from django.contrib.postgres.fields import ArrayField from django.db import models from model_utils import Choices +from courses.api import CourseProgressApi class Progress(models.Model): @@ -15,6 +16,27 @@ class Progress(models.Model): user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент') course_token = models.UUIDField(verbose_name="Токен курса", editable=False) + def progress_status(self, sorted_token_list): + """ + Возвращает порядок активной темы и урока или ничего + + :return: (topic_sort, lesson_sort) or None + """ + + token_list = [i.lesson_token for i in self.progresslesson_set.filter(status='done')] + + x = (1, 1) + + for idx_topic, lesson_list in enumerate(sorted_token_list): + for idx_lesson, lesson_token in enumerate(lesson_list): + if lesson_token in token_list: + x = None + + elif x is None: + x = (idx_topic+1, idx_lesson+1) + + return x + def __str__(self): return '%s' % (self.user.email,) diff --git a/access/serializers.py b/access/serializers.py index b213ea4..54d8690 100644 --- a/access/serializers.py +++ b/access/serializers.py @@ -5,6 +5,7 @@ from access.models.other import Account from access.models.progress import ProgressLesson from access.models import Progress from achievements.serialers import DiplomaSerializer, AchievementsSerializer +from courses.api import CourseProgressApi class ProgressLessonSerializer(serializers.ModelSerializer): @@ -19,6 +20,24 @@ class ProgressLessonSerializer(serializers.ModelSerializer): return self.teacher.get_full_name() +class ProgressAnalyticSerializer(serializers.ModelSerializer): + name = serializers.SerializerMethodField() + email = serializers.SerializerMethodField() + + class Meta: + model = Progress + fields = ('name', 'email',) + + @staticmethod + def get_name(self): + return self.user.get_full_name() + + @staticmethod + def get_email(self): + return self.user.email + + + class ProgressSerializer(serializers.ModelSerializer): lessons = serializers.SerializerMethodField() diff --git a/access/urls.py b/access/urls.py index 90c7ddc..be321f3 100644 --- a/access/urls.py +++ b/access/urls.py @@ -14,5 +14,6 @@ urlpatterns = [ url(r'logout/$', views.LogoutView.as_view()), url(r'reset/$', views.ResetPasswordView.as_view()), url(r'progress/$', views.UpdateProgress.as_view()), + url(r'progress_detail/(?P[0-9A-Fa-f-]+)/$', views.CourseProgressUserView.as_view()), url(r'progress_dynamic/(?P[0-9A-Fa-f-]+)/$', views.CourseProgressDynamicView.as_view()), ] \ No newline at end of file diff --git a/access/views.py b/access/views.py index 9f598c7..0b77483 100644 --- a/access/views.py +++ b/access/views.py @@ -16,7 +16,9 @@ from rest_framework.views import APIView from access.models.other import Invite, ResetPassword from access.models.progress import ProgressLesson from access.models import Progress -from access.serializers import UserSelfSerializer, UserSearchSerializer, ProgressLessonSerializer +from access.serializers import UserSelfSerializer, UserSearchSerializer, ProgressLessonSerializer, \ + ProgressAnalyticSerializer +from courses.api import CourseProgressApi class TeacherListView(APIView): @@ -318,6 +320,26 @@ class CourseProgressDynamicView(APIView): return Response(status=403) +class CourseProgressUserView(APIView): + renderer_classes = (JSONRenderer,) + + @staticmethod + def get(request, token): + if request.user.is_authenticated() and request.user.is_staff: + try: + res = [] + sorted_token_list = CourseProgressApi.get_topic_lesson(token) + for p in Progress.objects.filter(course_token=token): + progress = ProgressAnalyticSerializer(p).data + progress['progress_course'] = p.progress_status(sorted_token_list) + res.append(progress) + return Response(res, status=200) + except ValidationError: + return Response("Bad request", status=400) + + return Response(status=403) + + class MinUserView(APIView): renderer_classes = (JSONRenderer,) diff --git a/courses/api.py b/courses/api.py index 7019a77..af81ce0 100644 --- a/courses/api.py +++ b/courses/api.py @@ -19,3 +19,11 @@ class InApiTeacher: @staticmethod def get_token_list(slug: str) -> list: return Course.objects.get(slug=slug).teacher_tokens + + +class CourseProgressApi: + + @staticmethod + def get_topic_lesson(course_token: str): + course = Course.objects.get(token=course_token) + return [[lesson.token for lesson in topic.lesson_set.all()] for topic in course.topic_set.all()] \ No newline at end of file