def setUp(self):
        self.c = Client()
        author = RedditUser.objects.create(user=User.objects.create_user(
            username="******", password="******"))

        for i in range(50):
            Submission.objects.create(score=50 - i,
                                      title=get_random_string(length=20),
                                      author=author).save()

        for i in range(1, 50, 10):
            # [1, 11, 21] [31, 41] have upvotes (lists demonstrate pages)
            Vote.create(user=author,
                        vote_object=Submission.objects.get(id=i),
                        vote_value=1).save()

        for i in range(2, 50, 15):
            # [2, 17] [32, 47] have downvotes (lists demonstrate pages)
            Vote.create(user=author,
                        vote_object=Submission.objects.get(id=i),
                        vote_value=-1).save()
    def test_comment_vote_cancel_or_reverse(self):
        submission = Submission.objects.filter(title="vote testing").first()
        user = RedditUser.objects.get(user=User.objects.get(
            username=self.credentials['username']))
        self.assertIsNotNone(submission)
        self.assertIsNotNone(user)
        comment = Comment.objects.filter(submission=submission).first()
        self.assertIsNotNone(comment)
        Vote.create(user=user, vote_object=comment, vote_value=1).save()

        self.c.login(**self.credentials)
        r = self.c.post(reverse('vote'),
                        data={
                            'what': 'comment',
                            'what_id': comment.id,
                            'vote_value': '1'
                        })
        self.assertEqual(r.status_code, 200)
        json_r = json.loads(r.content.decode("utf-8"))
        self.assertIsNone(json_r['error'])
        self.assertEqual(json_r['voteDiff'], -1)

        vote = Vote.objects.get(vote_object_type=comment.get_content_type(),
                                vote_object_id=comment.id,
                                user=user)
        vote.value = 1
        vote.save()

        self.c.login(**self.credentials)
        r = self.c.post(reverse('vote'),
                        data={
                            'what': 'comment',
                            'what_id': comment.id,
                            'vote_value': '-1'
                        })
        self.assertEqual(r.status_code, 200)
        json_r = json.loads(r.content.decode("utf-8"))
        self.assertIsNone(json_r['error'])
        self.assertEqual(json_r['voteDiff'], -2)
    def setUp(self):
        self.c = Client()
        author = RedditUser.objects.create(
            user=User.objects.create_user(username="******",
                                          password="******"))

        for i in range(50):
            Submission.objects.create(score=50 - i,
                                      title=get_random_string(length=20),
                                      author=author).save()

        for i in range(1, 50, 10):
            # [1, 11, 21] [31, 41] have upvotes (lists demonstrate pages)
            Vote.create(user=author,
                        vote_object=Submission.objects.get(id=i),
                        vote_value=1).save()

        for i in range(2, 50, 15):
            # [2, 17] [32, 47] have downvotes (lists demonstrate pages)
            Vote.create(user=author,
                        vote_object=Submission.objects.get(id=i),
                        vote_value=-1).save()
    def test_comment_vote_cancel_or_reverse(self):
        submission = Submission.objects.filter(title="vote testing").first()
        user = RedditUser.objects.get(
            user=User.objects.get(username=self.credentials['username']))
        self.assertIsNotNone(submission)
        self.assertIsNotNone(user)
        comment = Comment.objects.filter(submission=submission).first()
        self.assertIsNotNone(comment)
        Vote.create(user=user, vote_object=comment, vote_value=1).save()

        self.c.login(**self.credentials)
        r = self.c.post(reverse('vote'),
                        data={
                            'what': 'comment',
                            'what_id': comment.id,
                            'vote_value': '1'
                        })
        self.assertEqual(r.status_code, 200)
        json_r = json.loads(r.content.decode("utf-8"))
        self.assertIsNone(json_r['error'])
        self.assertEqual(json_r['voteDiff'], -1)

        vote = Vote.objects.get(vote_object_type=comment.get_content_type(),
                                vote_object_id=comment.id,
                                user=user)
        vote.value = 1
        vote.save()

        self.c.login(**self.credentials)
        r = self.c.post(reverse('vote'),
                        data={
                            'what': 'comment',
                            'what_id': comment.id,
                            'vote_value': '-1'
                        })
        self.assertEqual(r.status_code, 200)
        json_r = json.loads(r.content.decode("utf-8"))
        self.assertIsNone(json_r['error'])
        self.assertEqual(json_r['voteDiff'], -2)
    def setUp(self):
        self.c = Client()
        self.credentials = {'username': '******',
                            'password': '******'}
        author = RedditUser.objects.create(
            user=User.objects.create_user(**self.credentials)
        )

        submission = Submission.objects.create(
            id=1,
            score=1,
            title=get_random_string(length=12),
            author=author
        )

        for _ in range(3):
            Comment.objects.create(
                author_name=author.user.username,
                author=author,
                submission=submission,
                html_comment="root comment"
            )

        # Add some replies
        parent = Comment.objects.get(id=1)
        for _ in range(2):
            Comment.objects.create(
                author_name=author.user.username,
                author=author,
                submission=submission,
                parent=parent,
                html_comment="reply comment"
            )

        # add upvote to one root comment,
        Vote.create(
            user=author,
            vote_object=Comment.objects.get(id=1),
            vote_value=1
        ).save()

        # and downvote to one reply comment
        Vote.create(
            user=author,
            vote_object=Comment.objects.get(id=5),
            vote_value=-1
        ).save()

        # add upvote to the submission
        Vote.create(
            user=author,
            vote_object=submission,
            vote_value=1
        ).save()
    def setUp(self):
        self.c = Client()
        self.credentials = {'username': '******',
                            'password': '******'}
        author = RedditUser.objects.create(
            user=User.objects.create_user(**self.credentials)
        )

        submission = Submission.objects.create(
            id=1,
            score=1,
            title=get_random_string(length=12),
            author=author
        )

        for _ in range(3):
            Comment.objects.create(
                author_name=author.user.username,
                author=author,
                submission=submission,
                html_comment="root comment"
            )

        # Add some replies
        parent = Comment.objects.get(id=1)
        for _ in range(2):
            Comment.objects.create(
                author_name=author.user.username,
                author=author,
                submission=submission,
                parent=parent,
                html_comment="reply comment"
            )

        # add upvote to one root comment,
        Vote.create(
            user=author,
            vote_object=Comment.objects.get(id=1),
            vote_value=1
        ).save()

        # and downvote to one reply comment
        Vote.create(
            user=author,
            vote_object=Comment.objects.get(id=5),
            vote_value=-1
        ).save()

        # add upvote to the submission
        Vote.create(
            user=author,
            vote_object=submission,
            vote_value=1
        ).save()
Exemple #7
0
def vote(request):
    # The type of object we're voting on, can be 'submission' or 'comment'
    vote_object_type = request.POST.get('what', None)

    # The ID of that object as it's stored in the database, positive int
    vote_object_id = request.POST.get('what_id', None)

    # The value of the vote we're writing to that object, -1 or 1
    # Passing the same value twice will cancel the vote i.e. set it to 0
    new_vote_value = request.POST.get('vote_value', None)

    # By how much we'll change the score, used to modify score on the fly
    # client side by the javascript instead of waiting for a refresh.
    vote_diff = 0

    if not request.user.is_authenticated():
        return HttpResponseForbidden()
    else:
        user = RedditUser.objects.get(user=request.user)

    try:  # If the vote value isn't an integer that's equal to -1 or 1
        # the request is bad and we can not continue.
        new_vote_value = int(new_vote_value)

        if new_vote_value not in [-1, 1]:
            raise ValueError("Wrong value for the vote!")

    except (ValueError, TypeError):
        return HttpResponseBadRequest()

    # if one of the objects is None, 0 or some other bool(value) == False value
    # or if the object type isn't 'comment' or 'submission' it's a bad request
    if not all([vote_object_type, vote_object_id, new_vote_value]) or \
            vote_object_type not in ['comment', 'submission']:
        return HttpResponseBadRequest()

    # Try and get the actual object we're voting on.
    try:
        if vote_object_type == "comment":
            vote_object = Comment.objects.get(id=vote_object_id)

        elif vote_object_type == "submission":
            vote_object = Submission.objects.get(id=vote_object_id)
        else:
            return HttpResponseBadRequest()  # should never happen

    except (Comment.DoesNotExist, Submission.DoesNotExist):
        return HttpResponseBadRequest()

    # Try and get the existing vote for this object, if it exists.
    try:
        vote = Vote.objects.get(vote_object_type=vote_object.get_content_type(),
                                vote_object_id=vote_object.id,
                                user=user)

    except Vote.DoesNotExist:
        # Create a new vote and that's it.
        vote = Vote.create(user=user,
                           vote_object=vote_object,
                           vote_value=new_vote_value)
        vote.save()
        vote_diff = new_vote_value
        return JsonResponse({'error'   : None,
                             'voteDiff': vote_diff})

    # User already voted on this item, this means the vote is either
    # being canceled (same value) or changed (different new_vote_value)
    if vote.value == new_vote_value:
        # canceling vote
        vote_diff = vote.cancel_vote()
        if not vote_diff:
            return HttpResponseBadRequest(
                'Something went wrong while canceling the vote')
    else:
        # changing vote
        vote_diff = vote.change_vote(new_vote_value)
        if not vote_diff:
            return HttpResponseBadRequest(
                'Wrong values for old/new vote combination')

    return JsonResponse({'error'   : None,
                         'voteDiff': vote_diff})