|
|
|
|
@ -15,14 +15,16 @@ from rest_framework.permissions import IsAuthenticated |
|
|
|
|
from rest_framework.renderers import JSONRenderer |
|
|
|
|
from rest_framework.response import Response |
|
|
|
|
from rest_framework.views import APIView |
|
|
|
|
from django.db.models import Q, Count |
|
|
|
|
from django.db.models import Q, Count, F |
|
|
|
|
import jwt |
|
|
|
|
from django.conf import settings |
|
|
|
|
|
|
|
|
|
from django.db.models.functions import Cast |
|
|
|
|
from django.db.models.fields import DateField |
|
|
|
|
from access.serializers import UserProgressSearchSerializer |
|
|
|
|
from courses.models import Course, Lesson |
|
|
|
|
from progress.models import ProgressLesson, Progress |
|
|
|
|
from progress.serializers import ProgressAnalyticSerializer, ProgressLessonSerializer, ProgressSerializer, \ |
|
|
|
|
from progress.serializers import ProgressAnalyticSerializer, ProgressLessonSerializer, \ |
|
|
|
|
SecureProgressSerializer |
|
|
|
|
from courses.api import CourseProgressApi, CourseParamsApi |
|
|
|
|
from progress.tasks import add_next_lesson |
|
|
|
|
@ -65,27 +67,45 @@ class CourseProgressDynamicView(APIView): |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def get(request): |
|
|
|
|
course_token = request.GET.get('course_token', None) |
|
|
|
|
course_token = request.GET.get('course_token', '') |
|
|
|
|
teacher_email = request.GET.get('teacher_email', '').lower() |
|
|
|
|
from_date = int(request.GET.get('from', '7')) |
|
|
|
|
to_date = int(request.GET.get('to', '0')) |
|
|
|
|
only_hw = request.GET.get('only_hw', 'yes') == 'yes' |
|
|
|
|
|
|
|
|
|
if request.user.is_authenticated() and request.user.is_staff: |
|
|
|
|
progresses = ProgressLesson.objects.filter(status='done') |
|
|
|
|
if not course_token is None: |
|
|
|
|
try: |
|
|
|
|
progresses = progresses.filter(progress__course_token=course_token) |
|
|
|
|
except ProgressLesson.DoesNotExist: |
|
|
|
|
return Response('incorrect course token', status=404) |
|
|
|
|
progresses = ProgressLesson.objects.all() |
|
|
|
|
|
|
|
|
|
if only_hw: |
|
|
|
|
progresses = progresses.filter(checker=F('progress__teacher')) |
|
|
|
|
|
|
|
|
|
progresses = progresses.filter(finish_date__gt=timezone.now() - relativedelta(days=from_date)) |
|
|
|
|
progresses = progresses.filter(finish_date__lt=timezone.now() - relativedelta(days=to_date)) |
|
|
|
|
progresses = progresses.order_by('finish_date') |
|
|
|
|
if not course_token is '': |
|
|
|
|
progresses = progresses.filter(progress__course_token=course_token) |
|
|
|
|
|
|
|
|
|
if not teacher_email is '': |
|
|
|
|
progresses = progresses.filter(checker__email=teacher_email) |
|
|
|
|
|
|
|
|
|
res = {} |
|
|
|
|
progresses = progresses.extra({'finish_date_day': "date(finish_date)"})\ |
|
|
|
|
.values('progress__course_token', 'finish_date_day')\ |
|
|
|
|
.annotate(total=Count('progress')) |
|
|
|
|
#TODO Доделать |
|
|
|
|
|
|
|
|
|
progresses_finish = progresses.filter(finish_date__gt=timezone.now() - relativedelta(days=from_date)) |
|
|
|
|
progresses_finish = progresses_finish.filter(finish_date__lt=timezone.now() - relativedelta(days=to_date)) |
|
|
|
|
|
|
|
|
|
progresses_start = progresses.filter(start_date__gt=timezone.now() - relativedelta(days=from_date)) |
|
|
|
|
progresses_start = progresses_start.filter(start_date__lt=timezone.now() - relativedelta(days=to_date)) |
|
|
|
|
|
|
|
|
|
progresses_finish = progresses_finish.annotate(name=Cast('finish_date', DateField())) \ |
|
|
|
|
.values('name') \ |
|
|
|
|
.annotate(value=Count('id')) |
|
|
|
|
|
|
|
|
|
progresses_start = progresses_start.annotate(name=Cast('start_date', DateField())) \ |
|
|
|
|
.values('name') \ |
|
|
|
|
.annotate(value=Count('id')) |
|
|
|
|
|
|
|
|
|
progresses_finish = progresses_finish.order_by('name') |
|
|
|
|
progresses_start = progresses_start.order_by('name') |
|
|
|
|
|
|
|
|
|
res['finish'] = progresses_finish |
|
|
|
|
res['start'] = progresses_start |
|
|
|
|
|
|
|
|
|
return Response(res, status=200) |
|
|
|
|
return Response('Доступно только персоналу', status=403) |
|
|
|
|
|