def list_votings(request): """List votings view.""" user = request.user polls = Poll.objects.all() if not user.groups.filter(name='Admin').exists(): polls = Poll.objects.filter(valid_groups__in=user.groups.all()) past_polls_query = polls.filter(end__lt=now_utc()) current_polls = polls.filter(start__lt=now_utc(), end__gt=now_utc()) future_polls = polls.filter(start__gt=now_utc()) past_polls_paginator = Paginator(past_polls_query, settings.ITEMS_PER_PAGE) past_polls_page = request.GET.get('page', 1) try: past_polls = past_polls_paginator.page(past_polls_page) except PageNotAnInteger: past_polls = past_polls_paginator.page(1) except EmptyPage: past_polls = past_polls_paginator.page(past_polls_paginator.num_pages) return render( request, 'list_votings.html', { 'user': user, 'past_polls': past_polls, 'current_polls': current_polls, 'future_polls': future_polls })
def list_votings(request): """List votings view.""" user = request.user polls = Poll.objects.all() if not user.groups.filter(name='Admin').exists(): polls = Poll.objects.filter(valid_groups__in=user.groups.all()) past_polls_query = polls.filter(end__lt=now_utc()) current_polls = polls.filter(start__lt=now_utc(), end__gt=now_utc()) future_polls = polls.filter(start__gt=now_utc()) past_polls_paginator = Paginator(past_polls_query, settings.ITEMS_PER_PAGE) past_polls_page = request.GET.get('page', 1) try: past_polls = past_polls_paginator.page(past_polls_page) except PageNotAnInteger: past_polls = past_polls_paginator.page(1) except EmptyPage: past_polls = past_polls_paginator.page(past_polls_paginator.num_pages) return render(request, 'list_votings.html', {'user': user, 'past_polls': past_polls, 'current_polls': current_polls, 'future_polls': future_polls})
class NGReportFactory(factory.django.DjangoModelFactory): FACTORY_FOR = NGReport user = factory.SubFactory(UserFactory, userprofile__initial_council=True) mentor = factory.SelfAttribute('user.userprofile.mentor') activity = factory.SubFactory(ActivityFactory) latitude = fuzzy.FuzzyDecimal(low=-90.0, high=90.0, precision=5) longitude = fuzzy.FuzzyDecimal(low=-180.0, high=180.0, precision=5) location = 'Activity Location' is_passive = False link = 'www.example.com' report_date = fuzzy.FuzzyDate(datetime.date(2013, 01, 01), now_utc().date()) @factory.post_generation def functional_areas(self, create, extracted, **kwargs): """Add functional areas list after object generation.""" if not create: return if extracted: for area in extracted: self.functional_areas.add(area) else: # create random rand_int = randint(1, 6) for area in (FunctionalArea.active_objects.all().order_by('?') [:rand_int]): self.functional_areas.add(area)
def cleanup_email_message_body_data(*args, **kwargs): """ Deletes ``EmailMessageBodyData`` objects created N {days|weeks} from now. >>> EmailMessage.objects.create() >>> EmailMessage.body = EmailMessageBodyData.objects.create(data="body") >>> EmailMessageBodyData.objects.count() 1 >>> cleanup_email_message_body_data(days=0) >>> EmailMessageBodyData.objects.count() 1 >>> cleanup_email_message_body_data(days=1) >>> EmailMessageBodyData.objects.count() 0 """ if all(kwargs.values()): # datetime.timedelta will actually handle multiple keyword args just fine raise Exception("Ambiguous arguments given") start = now_utc() delta = datetime.timedelta(**kwargs) purgeDate = start - delta logger.debug("Start: {s}".format(s=start)) logger.debug("Delta: {d}".format(d=delta)) logger.debug("Purge date: {p}".format(p=purgeDate)) emailMessages = EmailMessage.objects.filter( creation_time__lt=purgeDate, body__isnull=False, ) if emailMessages.exists(): result = delete_email_message_body_data(emailMessages) else: result = None logger.debug("Result: {r}".format(r=str(result))) return result
def clean_report_date(self): """Clean report_date field.""" if self.cleaned_data['report_date'] > now_utc().date(): raise ValidationError('Report date cannot be in the future.') return self.cleaned_data['report_date']
def view_voting(request, slug): """View voting and cast a vote view.""" user = request.user poll = get_object_or_404(Poll, slug=slug) # If the user does not belong to a valid poll group if not (user.groups.filter(Q(id=poll.valid_groups.id) | Q(name='Admin')).exists()): messages.error(request, ('You do not have the permissions to ' 'vote on this voting.')) return redirect('voting_list_votings') range_poll_choice_forms = {} radio_poll_choice_forms = {} data = {'poll': poll} # if the voting period has ended, display the results if now_utc() > poll.end: return render(request, 'view_voting.html', data) if now_utc() < poll.start: # Admin can edit future votings if user.groups.filter(name='Admin').exists(): return redirect('voting_edit_voting', slug=poll.slug) else: messages.warning(request, ('This vote has not yet begun. ' 'You can cast your vote on %s UTC.' % poll.start.strftime('%Y %B %d, %H:%M'))) return redirect('voting_list_votings') # avoid multiple votes from the same user if Vote.objects.filter(poll=poll, user=user).exists(): 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') # pack the forms for rendering for item in poll.range_polls.all(): range_poll_choice_forms[item] = forms.RangePollChoiceVoteForm( data=request.POST or None, choices=item.choices.all()) for item in poll.radio_polls.all(): radio_poll_choice_forms[item] = forms.RadioPollChoiceVoteForm( data=request.POST or None, radio_poll=item) poll_comment = PollComment(poll=poll, user=request.user) poll_comment_form = forms.PollCommentForm(data=request.POST or None, instance=poll_comment) if request.method == 'POST': 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 poll.automated_poll and not poll_comment_form.is_valid(): forms_valid = False if forms_valid: 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() if poll.automated_poll: poll_comment_form.save() Vote.objects.create(user=user, poll=poll) messages.success(request, ('Your vote has been ' 'successfully registered.')) return redirect('voting_list_votings') data['range_poll_choice_forms'] = range_poll_choice_forms data['radio_poll_choice_forms'] = radio_poll_choice_forms data['poll_comment_form'] = poll_comment_form return render(request, 'vote_voting.html', data)
def is_current_voting(self): if self.start < now_utc() and self.end > now_utc(): return True return False
def is_future_voting(self): if self.start > now_utc(): return True return False
def view_voting(request, slug): """View voting and cast a vote view.""" user = request.user poll = get_object_or_404(Poll, slug=slug) # If the user does not belong to a valid poll group if not (user.groups.filter(Q(id=poll.valid_groups.id) | Q(name='Admin')).exists()): messages.error(request, ('You do not have the permissions to ' 'vote on this voting.')) return redirect('voting_list_votings') range_poll_choice_forms = {} radio_poll_choice_forms = {} data = {'poll': poll} # if the voting period has ended, display the results if now_utc() > poll.end: return render(request, 'view_voting.html', data) if now_utc() < poll.start: # Admin can edit future votings if user.groups.filter(name='Admin').exists(): return redirect('voting_edit_voting', slug=poll.slug) else: messages.warning(request, ('This vote has not yet begun. ' 'You can cast your vote on %s UTC.' % poll.start.strftime('%Y %B %d, %H:%M'))) return redirect('voting_list_votings') # avoid multiple votes from the same user if Vote.objects.filter(poll=poll, user=user).exists(): 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') # pack the forms for rendering for item in poll.range_polls.all(): range_poll_choice_forms[item] = forms.RangePollChoiceVoteForm( data=request.POST or None, choices=item.choices.all()) for item in poll.radio_polls.all(): radio_poll_choice_forms[item] = forms.RadioPollChoiceVoteForm( data=request.POST or None, radio_poll=item) poll_comment = PollComment(poll=poll, user=request.user) poll_comment_form = forms.PollCommentForm(data=request.POST or None, instance=poll_comment) if request.method == 'POST': 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 poll.automated_poll and not poll_comment_form.is_valid(): forms_valid = False if forms_valid: 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() if poll.automated_poll: poll_comment_form.save() statsd.incr('voting.create_automated_poll_comment') Vote.objects.create(user=user, poll=poll) messages.success(request, ('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 data['poll_comment_form'] = poll_comment_form return render(request, 'vote_voting.html', data)
from django.utils.timezone import now as now_utc import factory from factory import fuzzy from remo.profiles.tests import UserFactory from remo.voting.models import (Poll, RadioPoll, RadioPollChoice, RangePoll, RangePollChoice, Vote) VALID_GROUPS = [Group.objects.get(name='Admin'), Group.objects.get(name='Council'), Group.objects.get(name='Mentor'), Group.objects.get(name='Rep'), Group.objects.get(name='Mozillians')] POLL_END_DT = now_utc() class PollFactory(factory.django.DjangoModelFactory): """Factory_Boy model for the voting_poll db table.""" FACTORY_FOR = Poll name = factory.Sequence(lambda n: 'Voting{0} example'.format(n)) start = fuzzy.FuzzyDateTime(datetime(2011, 1, 1, tzinfo=pytz.UTC)) end = fuzzy.FuzzyDateTime(POLL_END_DT + timedelta(days=2), POLL_END_DT + timedelta(days=365*2)) valid_groups = fuzzy.FuzzyChoice(VALID_GROUPS) description = factory.Sequence(lambda n: ('This is a description {0}' .format(n))) created_by = factory.SubFactory(UserFactory)
import factory from factory import fuzzy from remo.profiles.tests import UserFactory from remo.voting.models import (Poll, RadioPoll, RadioPollChoice, RangePoll, RangePollChoice, Vote) VALID_GROUPS = [ Group.objects.get(name='Admin'), Group.objects.get(name='Council'), Group.objects.get(name='Mentor'), Group.objects.get(name='Rep'), Group.objects.get(name='Mozillians') ] POLL_END_DT = now_utc() class PollFactory(factory.django.DjangoModelFactory): """Factory_Boy model for the voting_poll db table.""" FACTORY_FOR = Poll name = factory.Sequence(lambda n: 'Voting{0} example'.format(n)) start = fuzzy.FuzzyDateTime(datetime(2011, 1, 1, tzinfo=pytz.UTC)) end = fuzzy.FuzzyDateTime(POLL_END_DT + timedelta(days=2), POLL_END_DT + timedelta(days=365 * 2)) valid_groups = fuzzy.FuzzyChoice(VALID_GROUPS) description = factory.Sequence(lambda n: ('This is a description {0}'.format(n))) created_by = factory.SubFactory(UserFactory)