def post(self, request, quiz_id, format=None): user, user_key = get_user_and_user_key(request) data = request.data try: quiz = Quiz.objects.get(pk=quiz_id) except Quiz.DoesNotExist: return({"quiz_does_not_exist": True}, status.HTTP_400_BAD_REQUEST) #Not using a serializer because POST and GET return different attributes #and using a serializer does not reduce the amount of code #And the only validation I need is checking if the quiz exists. #Other fields can be blank. attrs = { "quiz_id": quiz.id, "result": data['result'], "answer": data['answer'] or "", "choices": ','.join((str(choice_id) for choice_id in data['choices'])), "user": user, "user_key": user_key, "created_at": timezone.now() } attempt = QuizAttempt.objects.create(**attrs) data['id'] = attempt.id return Response(request.data, status.HTTP_201_CREATED)
def get(self, request, quiz_id, format=None): user, user_key = get_user_and_user_key(request) attempts = QuizAttempt.objects.get_user_attempts_by_quiz_id(user_key=user_key, quiz_id=quiz_id) serialized_attempts = [] for a in attempts: serializer = serializers.QuizAttemptSerializer(a) serialized_attempts.append(serializer.data) return Response(serialized_attempts)
def get_quizattempts(request, concept): _, user_key = get_user_and_user_key(request) attempts = concept.get_user_quizattempts(user_key) serializer = QuizAttemptSerializer(attempts, many=True) serialized_attempts = serializer.data for attempt in serialized_attempts: attempt['quizId'] = attempt['quiz'] del attempt['quiz'] return serialized_attempts
def post(self, request, format=None): """ Get course by course_id """ user, _ = get_user_and_user_key(request) serializer = CodeQuizSerializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors, status.HTTP_400_BAD_REQUEST) attrs = get_audit_attrs(request.user) attrs.update(serializer.data) attrs['test_cases'] = request.data['test_cases'] codequiz = serializer.create(attrs) response_data = dict(serializer.data) response_data['id'] = codequiz.id return Response(response_data, status.HTTP_201_CREATED)
def put(self, request, pk): codequiz = get_object_or_404(CodeQuiz, id=pk) user, _ = get_user_and_user_key(request) if user.id != codequiz.created_by.id: return Response({"nice": "try"}, status.HTTP_403_FORBIDDEN) serializer = CodeQuizSerializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors, status.HTTP_400_BAD_REQUEST) attrs = get_audit_attrs(request.user) attrs.update(serializer.data) attrs['test_cases'] = request.data['test_cases'] serializer.update(codequiz, attrs) return Response(request.data)
def get(self, request): """ Get all attempts by user """ user, _ = get_user_and_user_key(request) codequizzes = CodeQuiz.objects.filter(created_by=user) # Um, django-rest-framework is unable to serialize for me. # todo -> debug later data = [ { "problem_statement": cq.problem_statement, "id": str(cq.id), "created_at": cq.created_at } for cq in codequizzes ] return Response(data)
def post(self, request, pk): codequiz = get_object_or_404(CodeQuiz, id=pk) user, user_key = get_user_and_user_key(request) code = request.data['code'] attrs = { 'code': code, 'user': user, 'user_key': user_key, 'codequiz': codequiz } try: identical_attempt = CodeQuizAttempt.objects.filter(codequiz=codequiz, code=code, state=2).first() if identical_attempt is not None: if identical_attempt.user_key == user_key: attempt = identical_attempt outputs = attempt.outputs state = attempt.state else: attrs['result'] = identical_attempt.result attrs['response'] = identical_attempt.response attrs['state'] = 3 attempt = CodeQuizAttempt.objects.create(**attrs) outputs = None state = attempt.state else: attempt = CodeQuizAttempt.objects.create(**attrs) outputs = None state = 1 attempt.async_submit() except IntegrityError: attempt = identical_attempt json_response = { 'result': attempt.result, 'id': attempt.id, 'outputs': outputs, 'state': state } return Response(json_response, status.HTTP_201_CREATED)
def _get_codequizattempts(self, request, concept): _, user_key = get_user_and_user_key(request) attempts = concept.get_user_codequizattempts(user_key) serializer = CodeQuizAttemptSerializer(attempts, many=True) return serializer.data
def get(self, request, course_slug): course = get_course_or_404(course_slug) _, user_key = get_user_and_user_key(request) progress = course.get_student_progress(user_key) return Response(progress)