You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
4.6 KiB
117 lines
4.6 KiB
import datetime
|
|
|
|
import csv
|
|
from django.http import HttpResponse
|
|
from django.shortcuts import render
|
|
|
|
# Create your views here.
|
|
from rest_framework.exceptions import ValidationError
|
|
from rest_framework.renderers import JSONRenderer
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from courses.api import CourseProgressApi
|
|
from progress.models import Progress, ProgressLesson
|
|
from progress.serializers import ProgressLessonSerializer, ProgressAnalyticSerializer
|
|
|
|
|
|
class UpdateProgress(APIView):
|
|
renderer_classes = (JSONRenderer,)
|
|
|
|
@staticmethod
|
|
def post(request):
|
|
"""
|
|
На вход обязательно передаётся параметр id (id узла).
|
|
"""
|
|
lesson_token = request.JSON.get('lesson_token', None)
|
|
course_token = request.JSON.get('course_token', None)
|
|
if lesson_token is None or course_token is None:
|
|
return Response('Не передан слаг курса или токен урока', status=400)
|
|
try:
|
|
p = Progress.objects.get(user=request.user, course_token=course_token)
|
|
try:
|
|
pv = ProgressLesson.objects.get(
|
|
progress=p,
|
|
lesson_token=lesson_token,
|
|
)
|
|
|
|
except ProgressLesson.DoesNotExist:
|
|
pv = ProgressLesson.objects.create(
|
|
date=datetime.datetime.now(),
|
|
teacher=p.teacher,
|
|
progress=p,
|
|
lesson_token=lesson_token,
|
|
)
|
|
pv.status = ProgressLesson.STATUSES.done
|
|
pv.save()
|
|
return Response(ProgressLessonSerializer(pv).data, status=200)
|
|
|
|
except Progress.DoesNotExist:
|
|
return Response('Не найден прогресс по заданным параметрам', status=404)
|
|
|
|
|
|
class CourseProgressDynamicView(APIView):
|
|
renderer_classes = (JSONRenderer,)
|
|
|
|
@staticmethod
|
|
def get(request, token):
|
|
if request.user.is_authenticated() and request.user.is_staff:
|
|
try:
|
|
progresses = Progress.objects.filter(course_token=token)
|
|
res = {}
|
|
for i in progresses:
|
|
key = i.progresslesson_set.filter(status="done").count()
|
|
res[key] = 1 if not key in res.keys() else res[key] + 1
|
|
return Response(res, status=200)
|
|
except ValidationError:
|
|
return Response("Bad request", status=400)
|
|
|
|
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 UploadCourseProgressUserView(APIView):
|
|
renderer_classes = (JSONRenderer,)
|
|
|
|
@staticmethod
|
|
def get(request, token):
|
|
if request.user.is_authenticated() and request.user.is_staff:
|
|
try:
|
|
response = HttpResponse(content_type='text/csv')
|
|
response['Content-Disposition'] = 'attachment; filename="%s.csv"' % token
|
|
sorted_token_list = CourseProgressApi.get_topic_lesson(token)
|
|
writer = csv.writer(response)
|
|
writer.writerow(['Имя', 'Почта', 'Последняя тема', 'Последний урок'])
|
|
|
|
for p in Progress.objects.filter(course_token=token):
|
|
progress = ProgressAnalyticSerializer(p).data
|
|
progress['progress_course'] = p.progress_status(sorted_token_list)
|
|
writer.writerow([
|
|
progress['name'],
|
|
progress['email'],
|
|
progress['progress_course'] and progress['progress_course'][0],
|
|
progress['progress_course'] and progress['progress_course'][1],
|
|
])
|
|
return response
|
|
except ValidationError:
|
|
return Response("Bad request", status=400)
|
|
return Response(status=403)
|
|
|