def curator_post_vote(request, post_id): if request.method == 'POST': post = get_object_or_404(models.Post, pk=post_id) form = forms.VoteForm(request.POST) if form.is_valid(): if services.is_topic_curator(request.user, post.topic): curator_type = ContentType.objects.get(app_label='manopozicija', model='curator') voted_for_himself = ( post.content_type == curator_type and request.user == post.content_object.user and not request.user.is_superuser ) if voted_for_himself: logger.debug(( '%r user voted for his own curator application on %r topic for %r post with vote: %r' ), request.user, post.topic, post, form.cleaned_data['vote']) else: upvotes, downvotes = services.update_curator_position(request.user, post, form.cleaned_data['vote']) return JsonResponse({'success': True, 'upvotes': upvotes, 'downvotes': downvotes}) else: logger.debug(( '%r user who is not a %r topic curator attempted to vote for %r post with vote: %r' ), request.user, post.topic, post, form.cleaned_data['vote']) else: logger.debug('form error: %s', form.errors.as_text()) else: logger.debug('only POST is allowed, got %s instead', request.method) return JsonResponse({'success': False})
def curator_post_vote(request, post_id): if request.method == 'POST': post = get_object_or_404(models.Post, pk=post_id) form = forms.VoteForm(request.POST) if form.is_valid(): if services.is_topic_curator(request.user, post.topic): curator_type = ContentType.objects.get( app_label='manopozicija', model='curator') voted_for_himself = (post.content_type == curator_type and request.user == post.content_object.user and not request.user.is_superuser) if voted_for_himself: logger.debug(( '%r user voted for his own curator application on %r topic for %r post with vote: %r' ), request.user, post.topic, post, form.cleaned_data['vote']) else: upvotes, downvotes = services.update_curator_position( request.user, post, form.cleaned_data['vote']) return JsonResponse({ 'success': True, 'upvotes': upvotes, 'downvotes': downvotes }) else: logger.debug(( '%r user who is not a %r topic curator attempted to vote for %r post with vote: %r' ), request.user, post.topic, post, form.cleaned_data['vote']) else: logger.debug('form error: %s', form.errors.as_text()) else: logger.debug('only POST is allowed, got %s instead', request.method) return JsonResponse({'success': False})
def test_curator_votes(app): users = (factories.UserFactory(first_name='u%d' % i) for i in itertools.count()) event = factories.EventFactory() post = factories.PostFactory(content_object=event) assert services.get_curator_votes(post) == (0, 0) assert services.update_curator_position(next(users), post, 1) == (1, 0) assert services.update_curator_position(next(users), post, 1) == (2, 0) assert services.update_curator_position(next(users), post, -1) == (2, 1) assert services.get_curator_votes(post) == (2, 1) # Try to vote several times with the same user user = factories.UserFactory() assert services.update_curator_position(user, post, 1) == (3, 1) assert services.update_curator_position(user, post, -1) == (2, 2) assert services.update_curator_position(user, post, -1) == (2, 2) assert services.update_curator_position(user, post, 1) == (3, 1) assert services.get_curator_votes(post) == (3, 1) assert services.get_curator_topic_votes(user, post.topic) == {post.pk: 1} # Try to vote for new curator application curator = factories.CuratorFactory(user=user) post = factories.PostFactory(content_object=curator) user_1, user_2, user_3 = next(users), next(users), next(users) # Initially user should not be a curator assert services.is_topic_curator(user, post.topic) is False # After first positive vote user shuould become a curator assert services.update_curator_position(user_1, post, 1) == (1, 0) assert services.is_topic_curator(user, post.topic) is True # When number of curator upvotes and downvotes becomes equal, user should be removed from curators assert services.update_curator_position(user_1, post, -1) == (0, 1) assert services.is_topic_curator(user, post.topic) is False # Same thing, but with two users voting differently assert services.update_curator_position(user_2, post, 1) == (1, 1) assert services.is_topic_curator(user, post.topic) is False # If third users agrees to accept new curator it will be accepted assert services.update_curator_position(user_3, post, 1) == (2, 1) assert services.is_topic_curator(user, post.topic) is True