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