Merge branch 'statistics_migrate' into 'dev'

stat part 1

See merge request !460
remotes/origin/autodeploy
Andrey 8 years ago
commit 8cc2000f26
  1. 14
      courses/api.py
  2. 2
      progress/urls.py
  3. 86
      progress/views.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}

@ -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<teacher_token>[0-9A-Fa-f-]+)/$', views.StudentWorkView.as_view()),
url(r'student/$', views.StudentUpdateProgress.as_view()),
url(r'find/$', views.FindProgressView.as_view()),

@ -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,)

Loading…
Cancel
Save