Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
 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))
Ejemplo n.º 3
0
    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)
Ejemplo n.º 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)