From b1fd168302a905245107154f0313a3011bd0d162 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 29 Apr 2018 17:54:05 +0300 Subject: [PATCH] stat part 1 --- courses/api.py | 14 ++++++-- progress/urls.py | 2 ++ progress/views.py | 86 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 3 deletions(-) diff --git a/courses/api.py b/courses/api.py index 0917650..584e92e 100644 --- a/courses/api.py +++ b/courses/api.py @@ -1,4 +1,4 @@ -from courses.models import Course +from courses.models import Course, Lesson class InApiTeacher: @@ -53,7 +53,15 @@ class CourseProgressApi: class CourseParamsApi: def __init__(self, token): - self.course = Course.objects.get(token=token) + self.__course = Course.objects.get(token=token) def get_slug_and_title(self): - return {"title": self.course.title, "slug": self.course.slug} + return {"title": self.__course.title, "slug": self.__course.slug} + + def get_length(self): + return self.__course.topic_set.count() + + def get_topic_by_lesson(self, lesson_token): + for idx, topic in enumerate(self.__course.topic_set.all()): + if topic.lesson_set.filter(token=lesson_token).exists(): + return {"title": topic.title, "idx": idx} diff --git a/progress/urls.py b/progress/urls.py index f47fe79..e0ba446 100644 --- a/progress/urls.py +++ b/progress/urls.py @@ -4,6 +4,8 @@ from progress import views urlpatterns = [ url(r'progress_dynamic/$', views.CourseProgressDynamicView.as_view()), + url(r'progress_table_detail/$', views.ProgressTableDetailView.as_view()), + url(r'progress_table/$', views.CourseProgressTableView.as_view()), url(r'students/(?P[0-9A-Fa-f-]+)/$', views.StudentWorkView.as_view()), url(r'student/$', views.StudentUpdateProgress.as_view()), url(r'find/$', views.FindProgressView.as_view()), diff --git a/progress/views.py b/progress/views.py index 482e36a..2ed2805 100644 --- a/progress/views.py +++ b/progress/views.py @@ -114,6 +114,92 @@ class CourseProgressDynamicView(APIView): return Response('Доступно только персоналу', status=403) +class CourseProgressTableView(APIView): + renderer_classes = (JSONRenderer,) + + @staticmethod + def get(request): + from_date = request.GET.get('from', None) + to_date = request.GET.get('to', None) + + if request.user.is_authenticated() and request.user.is_staff: + progresses = ProgressLesson.objects.filter(checker=F('progress__teacher'), progress__only_watch=False) \ + .exclude(status='done') + + if from_date is not None: + date = timezone.now() - relativedelta(days=int(from_date)) + progresses = progresses.filter(progress__user__useractivity__last_request__gt=date) + + if to_date is not None: + date = timezone.now() - relativedelta(days=int(to_date)) + progresses = progresses.filter(progress__user__useractivity__last_request__lt=date) + + res = {} + progresses = progresses.values('progress__course_token', 'lesson_token').annotate(count=Count('id')) + course_tokens = progresses.values('progress__course_token').distinct() + res['val'] = [] + res['max_length'] = 0 + for course_token in course_tokens: + ct = course_token['progress__course_token'] + api = CourseParamsApi(ct) + course_title = api.get_slug_and_title()['title'] + course_length = api.get_length() + res['max_length'] = course_length if course_length > res['max_length'] else res['max_length'] + f_progresses = progresses.filter(progress__course_token=ct) + res_elem = { + "course_title": course_title, + "course_token": course_token['progress__course_token'], + 'stat': [0 for _i in range(course_length)], + "sum": 0 + } + res['val'].append(res_elem) + for i in f_progresses: + topic = api.get_topic_by_lesson(i['lesson_token']) + if topic is not None: + res_elem['stat'][topic['idx']] += i["count"] + res_elem['sum'] += i["count"] + + return Response(res, status=200) + return Response('Доступно только персоналу', status=403) + + +class ProgressTableDetailView(APIView): + renderer_classes = (JSONRenderer,) + + @staticmethod + def get(request): + course_token = request.GET.get('course_token', None) + topic_idx = request.GET.get('topic_idx', None) + + if course_token is None: + return Response('Должен быть передан токен курса', 400) + + if request.user.is_authenticated() and request.user.is_staff: + progresses = ProgressLesson.objects.filter( + checker=F('progress__teacher'), + progress__only_watch=False, + progress__course_token=course_token, + ) \ + .exclude(status='done') + + api = CourseParamsApi(course_token) + res = [] + for progress in progresses: + topic = api.get_topic_by_lesson(progress.lesson_token) + if topic_idx is not None and not int(topic_idx)-1 == topic['idx']: + continue + res.append({ + 'email': progress.progress.user.email, + 'name': progress.progress.user.get_full_name(), + 'status': progress.status, + 'last_request': progress.progress.user.useractivity.last_request, + 'topic_title': topic['title'], + }) + + return Response(res, status=200) + return Response('Доступно только персоналу', status=403) + + class CourseProgressUserView(APIView): renderer_classes = (JSONRenderer,)