def test_admin(self): user = UserFactory.create(groups=['Admin']) group = Group.objects.get(name='Rep') poll = PollFactory.create(valid_groups=group) ok_(user_has_poll_permissions(user, poll))
def edit_voting(request, slug=None): """Create/Edit voting view.""" poll, created = get_or_create_instance(Poll, slug=slug) can_delete_voting = False extra_range_polls = 0 extra_radio_polls = 0 current_voting_edit = False range_poll_formset = None radio_poll_formset = None if created: poll.created_by = request.user extra_range_polls = 1 extra_radio_polls = 1 else: if not poll.range_polls.exists(): extra_range_polls = 1 if not poll.radio_polls.exists(): extra_radio_polls = 1 can_delete_voting = True if poll.is_current_voting: current_voting_edit = True if not user_has_poll_permissions(request.user, poll): messages.error(request, 'Permission denied.') return redirect('voting_list_votings') nominee_list = (User.objects.filter( groups__name='Rep', userprofile__registration_complete=True).order_by('first_name')) if current_voting_edit: poll_form = forms.PollEditForm(request.POST or None, instance=poll) else: RangePollFormset = (inlineformset_factory( Poll, RangePoll, formset=forms.BaseRangePollInlineFormSet, extra=extra_range_polls, can_delete=True, fields='__all__')) RadioPollFormset = (inlineformset_factory( Poll, RadioPoll, formset=forms.BaseRadioPollInlineFormSet, extra=extra_radio_polls, can_delete=True, fields='__all__')) range_poll_formset = RangePollFormset(request.POST or None, instance=poll, user_list=nominee_list) radio_poll_formset = RadioPollFormset(request.POST or None, instance=poll) poll_form = forms.PollAddForm(request.POST or None, instance=poll, radio_poll_formset=radio_poll_formset, range_poll_formset=range_poll_formset) if poll_form.is_valid(): poll_form.save() if created: messages.success(request, 'Voting successfully created.') statsd.incr('voting.create_voting') else: messages.success(request, 'Voting successfully edited.') statsd.incr('voting.edit_voting') if not current_voting_edit: statsd.incr('voting.create_range_poll', poll_form.radio_poll_formset.total_form_count()) statsd.incr('voting.create_radio_poll', poll_form.range_poll_formset.total_form_count()) return redirect('voting_edit_voting', slug=poll.slug) return render( request, 'edit_voting.jinja', { 'created': created, 'poll': poll, 'poll_form': poll_form, 'range_poll_formset': range_poll_formset, 'radio_poll_formset': radio_poll_formset, 'can_delete_voting': can_delete_voting, 'current_voting_edit': current_voting_edit, 'nominee_list': nominee_list })
def test_invalid_user(self): user = UserFactory.create(groups=['Rep']) group = Group.objects.get(name='Mentor') poll = PollFactory.create(valid_groups=group) ok_(not user_has_poll_permissions(user, poll))
def view_voting(request, slug): user = request.user poll = get_object_or_404(Poll, slug=slug) is_council = request.user.groups.filter(name='Council').exists() is_peer = user.groups.filter(name='Peers').exists() is_review_poll = poll.valid_groups.name == 'Review' user_should_vote = user.groups.filter(id=poll.valid_groups.id).exists() read_only_perms = (is_peer or (is_council and is_review_poll)) and not user_should_vote # If the user does not belong to a valid poll group if not user_has_poll_permissions(user, poll) and not read_only_perms: messages.error( request, u'You do not have the permissions to vote on this voting.') return redirect('voting_list_votings') range_poll_choice_forms = {} radio_poll_choice_forms = {} user_voted = False comment_form = forms.PollCommentForm() data = { 'poll': poll, 'comment_form': comment_form, 'read_only_access': read_only_perms } # if the voting period has ended, display the results if poll.is_past_voting: return render(request, 'view_voting.jinja', data) # avoid multiple votes from the same user if Vote.objects.filter(poll=poll, user=user).exists(): if not poll.comments_allowed: messages.warning( request, ('You have already cast your vote for ' 'this voting. Come back to see the ' 'results on %s UTC.' % poll.end.strftime('%Y %B %d, %H:%M'))) return redirect('voting_list_votings') # If the poll allows comments, display them along with an info msg user_voted = True data['user_voted'] = user_voted if not request.method == 'POST': msg = "You have already cast your vote for this voting." messages.info(request, msg) # pack the forms for rendering for item in poll.range_polls.all(): range_poll_choice_forms[item] = forms.RangePollChoiceVoteForm( choices=item.choices.all()) for item in poll.radio_polls.all(): radio_poll_choice_forms[item] = forms.RadioPollChoiceVoteForm( radio_poll=item) if request.method == 'POST': # Process comment form if 'comment' in request.POST and poll.comments_allowed: comment_form = forms.PollCommentForm(request.POST) data['comment_form'] = comment_form if comment_form.is_valid(): obj = comment_form.save(commit=False) obj.user = request.user obj.poll = poll obj.save() messages.success(request, 'Comment saved successfully.') statsd.incr('voting.create_comment') data['comment_form'] = forms.PollCommentForm() else: # pack the forms for rendering for item in poll.range_polls.all(): range_poll_choice_forms[item] = forms.RangePollChoiceVoteForm( data=request.POST, choices=item.choices.all()) for item in poll.radio_polls.all(): radio_poll_choice_forms[item] = forms.RadioPollChoiceVoteForm( data=request.POST, radio_poll=item, user=request.user) # Process poll form forms_valid = True # validate all forms for item in (range_poll_choice_forms.values() + radio_poll_choice_forms.values()): if not item.is_valid(): forms_valid = False break if forms_valid and poll.is_current_voting and not user_voted: for range_poll_form in range_poll_choice_forms.values(): range_poll_form.save() for radio_poll_form in radio_poll_choice_forms.values(): radio_poll_form.save() Vote.objects.create(user=user, poll=poll) messages.success( request, u'Your vote has been successfully registered.') statsd.incr('voting.vote_voting') return redirect('voting_list_votings') data['range_poll_choice_forms'] = range_poll_choice_forms data['radio_poll_choice_forms'] = radio_poll_choice_forms return render(request, 'vote_voting.jinja', data)
def edit_voting(request, slug=None): """Create/Edit voting view.""" poll, created = get_or_create_instance(Poll, slug=slug) can_delete_voting = False extra_range_polls = 0 extra_radio_polls = 0 current_voting_edit = False range_poll_formset = None radio_poll_formset = None if created: poll.created_by = request.user extra_range_polls = 1 extra_radio_polls = 1 else: if not poll.range_polls.exists(): extra_range_polls = 1 if not poll.radio_polls.exists(): extra_radio_polls = 1 can_delete_voting = True if poll.is_current_voting: current_voting_edit = True if not user_has_poll_permissions(request.user, poll): messages.error(request, 'Permission denied.') return redirect('voting_list_votings') nominee_list = (User.objects.filter(groups__name='Rep', userprofile__registration_complete=True) .order_by('first_name')) if current_voting_edit: poll_form = forms.PollEditForm(request.POST or None, instance=poll) else: RangePollFormset = (inlineformset_factory(Poll, RangePoll, formset=forms.BaseRangePollInlineFormSet, extra=extra_range_polls, can_delete=True, fields='__all__')) RadioPollFormset = (inlineformset_factory(Poll, RadioPoll, formset=forms.BaseRadioPollInlineFormSet, extra=extra_radio_polls, can_delete=True, fields='__all__')) range_poll_formset = RangePollFormset(request.POST or None, instance=poll, user_list=nominee_list) radio_poll_formset = RadioPollFormset(request.POST or None, instance=poll) poll_form = forms.PollAddForm(request.POST or None, instance=poll, radio_poll_formset=radio_poll_formset, range_poll_formset=range_poll_formset) if poll_form.is_valid(): poll_form.save() if created: messages.success(request, 'Voting successfully created.') statsd.incr('voting.create_voting') else: messages.success(request, 'Voting successfully edited.') statsd.incr('voting.edit_voting') if not current_voting_edit: statsd.incr('voting.create_range_poll', poll_form.radio_poll_formset.total_form_count()) statsd.incr('voting.create_radio_poll', poll_form.range_poll_formset.total_form_count()) return redirect('voting_edit_voting', slug=poll.slug) return render(request, 'edit_voting.jinja', {'created': created, 'poll': poll, 'poll_form': poll_form, 'range_poll_formset': range_poll_formset, 'radio_poll_formset': radio_poll_formset, 'can_delete_voting': can_delete_voting, 'current_voting_edit': current_voting_edit, 'nominee_list': nominee_list})
def view_voting(request, slug): user = request.user poll = get_object_or_404(Poll, slug=slug) is_council = request.user.groups.filter(name='Council').exists() is_peer = user.groups.filter(name='Peers').exists() is_review_poll = poll.valid_groups.name == 'Review' user_should_vote = user.groups.filter(id=poll.valid_groups.id).exists() read_only_perms = (is_peer or (is_council and is_review_poll)) and not user_should_vote # If the user does not belong to a valid poll group if not user_has_poll_permissions(user, poll) and not read_only_perms: messages.error(request, u'You do not have the permissions to vote on this voting.') return redirect('voting_list_votings') range_poll_choice_forms = {} radio_poll_choice_forms = {} user_voted = False comment_form = forms.PollCommentForm() data = { 'poll': poll, 'comment_form': comment_form, 'read_only_access': read_only_perms } # if the voting period has ended, display the results if poll.is_past_voting: return render(request, 'view_voting.jinja', data) # avoid multiple votes from the same user if Vote.objects.filter(poll=poll, user=user).exists(): if not poll.comments_allowed: messages.warning(request, ('You have already cast your vote for ' 'this voting. Come back to see the ' 'results on %s UTC.' % poll.end.strftime('%Y %B %d, %H:%M'))) return redirect('voting_list_votings') # If the poll allows comments, display them along with an info msg user_voted = True data['user_voted'] = user_voted if not request.method == 'POST': msg = "You have already cast your vote for this voting." messages.info(request, msg) # pack the forms for rendering for item in poll.range_polls.all(): range_poll_choice_forms[item] = forms.RangePollChoiceVoteForm(choices=item.choices.all()) for item in poll.radio_polls.all(): radio_poll_choice_forms[item] = forms.RadioPollChoiceVoteForm(radio_poll=item) if request.method == 'POST': # Process comment form if 'comment' in request.POST and poll.comments_allowed: comment_form = forms.PollCommentForm(request.POST) data['comment_form'] = comment_form if comment_form.is_valid(): obj = comment_form.save(commit=False) obj.user = request.user obj.poll = poll obj.save() messages.success(request, 'Comment saved successfully.') statsd.incr('voting.create_comment') data['comment_form'] = forms.PollCommentForm() else: # pack the forms for rendering for item in poll.range_polls.all(): range_poll_choice_forms[item] = forms.RangePollChoiceVoteForm( data=request.POST, choices=item.choices.all()) for item in poll.radio_polls.all(): radio_poll_choice_forms[item] = forms.RadioPollChoiceVoteForm( data=request.POST, radio_poll=item, user=request.user) # Process poll form forms_valid = True # validate all forms for item in (range_poll_choice_forms.values() + radio_poll_choice_forms.values()): if not item.is_valid(): forms_valid = False break if forms_valid and poll.is_current_voting and not user_voted: for range_poll_form in range_poll_choice_forms.values(): range_poll_form.save() for radio_poll_form in radio_poll_choice_forms.values(): radio_poll_form.save() Vote.objects.create(user=user, poll=poll) # Append a comment that the user voted successfully. comment_msg = u'**{0}** voted successfully.'.format(user) commenter = User.objects.get(username='******') PollComment.objects.create(poll=poll, user=commenter, comment=comment_msg) messages.success(request, u'Your vote has been successfully registered.') statsd.incr('voting.vote_voting') return redirect('voting_list_votings') data['range_poll_choice_forms'] = range_poll_choice_forms data['radio_poll_choice_forms'] = radio_poll_choice_forms return render(request, 'vote_voting.jinja', data)