def rate(request): if request.method != 'POST': return JsonResponse({ "error": "Must use POST to this endpoint" }, status=405) post_request = loads(request.body.decode("utf-8")) distractor_id = post_request.get("distractorID", None) difficulty = post_request.get("difficulty", None) quality = post_request.get("quality", None) if difficulty is None and quality is None: return JsonResponse({"error": "At least response.rating or response.quality must be specified"}, status=422) if difficulty is not None: if is_number(difficulty) is False or not 0 <= int(difficulty) <= 5: return JsonResponse({"error": "response.difficulty must be between 0 and 5 inclusive"}, status=422) difficulty = int(difficulty) if quality is not None: if is_number(quality) is False or not 0 <= int(quality) <= 5: return JsonResponse({"error": "response.quality must be between 0 and 5 inclusive"}, status=422) quality = int(quality) if distractor_id is None: return JsonResponse({"error": "Missing integer distractorID in request"}, status=422) user_ratings = {"difficulty": difficulty, "quality": quality} if QuestionService.rate_question(distractor_id, user_ratings, UserService.logged_in_user(request)) is False: return JsonResponse({"error": "Invalid distractorID"}, status=422) else: return HttpResponse(status=204)
def test_rate_nonexistent(self): """ Tests rating a question which does not exists """ course = self._bootstrap_courses(1) user = self._bootstrap_user(1) author = CourseUser.objects.create(user=user, course=course) self._bootstrap_topics(course) self._bootstrap_questions(author) self._bootstrap_question_choices(correct_id=2) self.assertFalse( QuestionService.rate_question(-1, { "difficulty": 2, "quality": 4 }, author))
def test_rate_update(self): """ Tests rating a question which the user has rated before""" course = self._bootstrap_courses(1) user = self._bootstrap_user(1) author = CourseUser.objects.create(user=user, course=course) self._bootstrap_topics(course) self._bootstrap_questions(author) self._bootstrap_question_choices(correct_id=2) QuestionService.rate_question(2, { "difficulty": 2, "quality": 4 }, author) self.assertTrue( QuestionService.rate_question(2, {"difficulty": 4}, author)) user_rating = QuestionRating.objects.all() self.assertEqual(len(user_rating), 1) self.assertEqual(user_rating.first().quality, 4.0) self.assertEqual(user_rating.first().difficulty, 4.0) answered_question = Question.objects.get(pk=1).toJSON() self.assertEqual(answered_question["difficultyCount"], 1) self.assertEqual(answered_question["difficulty"], 4.0)
def test_rate_many(self): """ Tests rating a question with many users""" course = self._bootstrap_courses(1) user = self._bootstrap_user(1) author = CourseUser.objects.create(user=user, course=course) user2 = self._bootstrap_user(2) author2 = CourseUser.objects.create(user=user2, course=course) self._bootstrap_topics(course) self._bootstrap_questions(author) self._bootstrap_question_choices(correct_id=2) QuestionService.rate_question(1, {"quality": 2}, author) QuestionService.rate_question(1, {"quality": 2}, author2) QuestionService.rate_question(1, {"quality": 4}, author2) answered_question = Question.objects.get(pk=1).toJSON() self.assertEqual(answered_question["qualityCount"], 2) self.assertEqual(answered_question["quality"], 3.0)