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 post_delete(request, object_id): post = get_object_or_404(models.Post, pk=object_id) is_topic_curator = services.is_topic_curator(request.user, post.topic) if not is_topic_curator: raise Http404('User is not a topic curator.') services.delete_post(post) return redirect(post.topic)
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
def quote_update_form(request, object_id): post = get_object_or_404(models.Post, pk=object_id) quote = get_object_or_404(models.Quote, post=post) source = quote.source topic = post.topic is_topic_curator = services.is_topic_curator(request.user, topic) if not is_topic_curator: raise Http404('User is not a topic curator.') arguments = models.PostArgument.objects.filter(post=post) ArgumentFormSet = modelformset_factory( models.PostArgument, form=forms.ArgumentForm, min_num=0, max_num=3, extra=3, validate_min=True, validate_max=True, ) if request.method == 'POST': source_form = forms.SourceForm(request.POST, instance=source) source_form.full_clean() source = source_form.cleaned_data form = forms.CombinedForms( source=source_form, quote=forms.QuoteForm(topic, source.get('actor'), source.get('source_link'), request.POST, instance=quote), arguments=ArgumentFormSet(request.POST, queryset=arguments), ) if form.is_valid(): services.update_quote(request.user, topic, post, quote, arguments, form.cleaned_data) return redirect(topic) else: form = forms.CombinedForms( source=forms.SourceForm(instance=source), quote=forms.QuoteForm(topic, actor=None, source_link=None, instance=quote), arguments=ArgumentFormSet(queryset=arguments), ) return render( request, 'manopozicija/quote_form.html', { 'topic': topic, 'source_form': form['source'], 'quote_form': form['quote'], 'arguments_formset': form['arguments'], })
def topic_details(request, object_id, slug): topic = get_object_or_404(models.Topic, pk=object_id) is_topic_curator = services.is_topic_curator(request.user, topic) return render(request, 'manopozicija/topic_details.html', { 'topic': topic, 'arguments': helpers.get_arguments(services.get_topic_arguments(topic)), 'posts': helpers.get_posts(request.user, topic, services.get_topic_posts(topic)), 'queue': ( helpers.get_posts(request.user, topic, services.get_topic_posts(topic, queue=True)) if is_topic_curator else [] ), 'has_indicators': topic.indicators.count() > 0, 'indicators': helpers.get_indicators(topic), 'is_topic_curator': is_topic_curator, 'curators': helpers.get_topic_curators(topic) if is_topic_curator else [] })
def topic_details(request, object_id, slug): topic = get_object_or_404(models.Topic, pk=object_id) is_topic_curator = services.is_topic_curator(request.user, topic) return render( request, 'manopozicija/topic_details.html', { 'topic': topic, 'arguments': helpers.get_arguments(services.get_topic_arguments(topic)), 'posts': helpers.get_posts(request.user, topic, services.get_topic_posts(topic)), 'queue': (helpers.get_posts( request.user, topic, services.get_topic_posts( topic, queue=True)) if is_topic_curator else []), 'has_indicators': topic.indicators.count() > 0, 'indicators': helpers.get_indicators(topic), 'is_topic_curator': is_topic_curator, 'curators': helpers.get_topic_curators(topic) if is_topic_curator else [] })