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)