def handle(self, *args, **options): event = viewutil.get_event(options['event']) prizeWinners = prizemail.prize_winners_with_email_pending(event) emailTemplate = options['template'] or event.prizewinneremailtemplate if emailTemplate == None: print("No default prize winner email template specified on event {0}, cannot send e-mails.".format(event.short)) else: prizemail.automail_prize_winners(event, prizeWinners, emailTemplate)
def handle(self, *args, **options): super(Command, self).handle(*args, **options) event = options['event'] prizeWinners = prizemail.prize_winners_with_email_pending(event) emailTemplate = options['template'] or event.prizewinneremailtemplate dryRun = options['dry_run'] if emailTemplate == None: self.message("No default prize winner email template specified on event {0}, cannot send e-mails.".format(event.short)) else: prizemail.automail_prize_winners(event, prizeWinners, emailTemplate, verbosity=self.verbosity, dry_run=dryRun)
def automail_prize_winners(request): currentEvent = viewutil.get_selected_event(request) if currentEvent == None: return HttpResponse("Please select an event first") prizewinners = prizemail.prize_winners_with_email_pending(currentEvent) if request.method == 'POST': form = forms.AutomailPrizeWinnersForm(prizewinners=prizewinners, data=request.POST) if form.is_valid(): prizemail.automail_prize_winners(currentEvent, form.cleaned_data['prizewinners'], form.cleaned_data['emailtemplate'], sender=form.cleaned_data['fromaddress'], replyTo=form.cleaned_data['replyaddress']) viewutil.tracker_log(u'prize', u'Mailed prize notifications', event=currentEvent, user=request.user) return render(request, 'admin/automail_prize_winners_post.html', { 'prizewinners': form.cleaned_data['prizewinners'] }) else: form = forms.AutomailPrizeWinnersForm(prizewinners=prizewinners) return render(request, 'admin/automail_prize_winners.html', { 'form': form })
def testAutoMail(self): models.Prize.objects.update(state='ACCEPTED') donors = list(models.Donor.objects.all()) prizes = list(models.Prize.objects.all()) fullWinnerList = [] donorWins = {} for prize in prizes: if self.rand.getrandbits(1) == 0: winners = [] while len(winners) < prize.maxwinners: d = donors[self.rand.randrange(len(donors))] if d not in winners: winners.append(d) for winner in winners: fullWinnerList.append( models.PrizeWinner.objects.create( winner=winner, prize=prize, pendingcount=1 ) ) donorPrizeList = donorWins.get(winner.id, None) if donorPrizeList is None: donorPrizeList = [] donorWins[winner.id] = donorPrizeList donorPrizeList.append(prize) self.assertSetEqual( {pw.id for pw in prizemail.prize_winners_with_email_pending(self.event)}, {pw.id for pw in fullWinnerList}, ) prizemail.automail_prize_winners( self.event, fullWinnerList, self.templateEmail, sender='*****@*****.**' ) for prizeWinner in fullWinnerList: self.assertTrue(prizeWinner.emailsent) for donor in donors: wonPrizes = donorWins.get(donor.id, []) donorMail = post_office.models.Email.objects.filter(to=donor.email) if len(wonPrizes) == 0: self.assertEqual(0, donorMail.count()) else: self.assertEqual(1, donorMail.count()) eventId, winnerId, prizeIds = self._parseMail(donorMail[0]) self.assertEqual(self.event.id, eventId) self.assertEqual(donor.id, winnerId) self.assertEqual(len(wonPrizes), len(prizeIds)) for prize in wonPrizes: self.assertTrue(prize.id in prizeIds)
def automail_prize_winners(request): if not hasattr(settings, 'EMAIL_HOST'): return HttpResponse("Email not enabled on this server.") currentEvent = viewutil.get_selected_event(request) if currentEvent == None: return HttpResponse("Please select an event first") prizewinners = prizemail.prize_winners_with_email_pending(currentEvent) if request.method == 'POST': form = forms.AutomailPrizeWinnersForm(prizewinners=prizewinners, data=request.POST) if form.is_valid(): for prizeWinner in form.cleaned_data['prizewinners']: prizeWinner.acceptdeadline = form.cleaned_data['acceptdeadline'] prizeWinner.save() prizemail.automail_prize_winners(currentEvent, form.cleaned_data['prizewinners'], form.cleaned_data['emailtemplate'], sender=form.cleaned_data['fromaddress'], replyTo=form.cleaned_data['replyaddress']) viewutil.tracker_log(u'prize', u'Mailed prize winner notifications', event=currentEvent, user=request.user) return render(request, 'admin/automail_prize_winners_post.html', { 'prizewinners': form.cleaned_data['prizewinners'] }) else: form = forms.AutomailPrizeWinnersForm(prizewinners=prizewinners) return render(request, 'admin/automail_prize_winners.html', { 'form': form })
def testAutoMail(self): models.Prize.objects.update(state='ACCEPTED') donors = list(models.Donor.objects.all()) prizes = list(models.Prize.objects.all()) fullWinnerList = [] donorWins = {} for prize in prizes: if self.rand.getrandbits(1) == 0: winners = [] while len(winners) < prize.maxwinners: d = donors[self.rand.randrange(len(donors))] if d not in winners: winners.append(d) for winner in winners: fullWinnerList.append( models.PrizeWinner.objects.create(winner=winner, prize=prize, pendingcount=1)) donorPrizeList = donorWins.get(winner.id, None) if donorPrizeList == None: donorPrizeList = [] donorWins[winner.id] = donorPrizeList donorPrizeList.append(prize) self.assertItemsEqual( prizemail.prize_winners_with_email_pending(self.event), fullWinnerList) prizemail.automail_prize_winners( self.event, fullWinnerList, self.templateEmail, sender='*****@*****.**') for prizeWinner in fullWinnerList: self.assertTrue(prizeWinner.emailsent) for donor in donors: wonPrizes = donorWins.get(donor.id, []) donorMail = post_office.models.Email.objects.filter(to=donor.email) if len(wonPrizes) == 0: self.assertEqual(0, donorMail.count()) else: self.assertEqual(1, donorMail.count()) eventId, winnerId, prizeIds = self._parseMail(donorMail[0]) self.assertEqual(self.event.id, eventId) self.assertEqual(donor.id, winnerId) self.assertEqual(len(wonPrizes), len(prizeIds)) for prize in wonPrizes: self.assertTrue(prize.id in prizeIds)
def automail_prize_winners(request): if not hasattr(settings, 'EMAIL_HOST'): return HttpResponse('Email not enabled on this server.') currentEvent = viewutil.get_selected_event(request) if currentEvent is None: return HttpResponse('Please select an event first') prizewinners = prizemail.prize_winners_with_email_pending(currentEvent) if request.method == 'POST': form = forms.AutomailPrizeWinnersForm(prizewinners=prizewinners, data=request.POST) if form.is_valid(): for prizeWinner in form.cleaned_data['prizewinners']: prizeWinner.acceptdeadline = form.cleaned_data[ 'acceptdeadline'] prizeWinner.save() prizemail.automail_prize_winners( currentEvent, form.cleaned_data['prizewinners'], form.cleaned_data['emailtemplate'], sender=form.cleaned_data['fromaddress'], replyTo=form.cleaned_data['replyaddress'], ) viewutil.tracker_log( 'prize', 'Mailed prize winner notifications', event=currentEvent, user=request.user, ) return render( request, 'admin/automail_prize_winners_post.html', {'prizewinners': form.cleaned_data['prizewinners']}, ) else: form = forms.AutomailPrizeWinnersForm(prizewinners=prizewinners) return render(request, 'admin/automail_prize_winners.html', {'form': form})
def automail_prize_winners(request, event=None): if not hasattr(settings, 'EMAIL_HOST'): return HttpResponse('Email not enabled on this server.') event = viewutil.get_event(event) if not event.id: return render( request, 'tracker/eventlist.html', { 'events': models.Event.objects.all(), 'pattern': 'admin:automail_prize_winners', 'subheading': 'Mail Prize Winners', }, ) import post_office.mail prizewinners = prizemail.prize_winners_with_email_pending(event) if request.method == 'POST': form = forms.AutomailPrizeWinnersForm(prizewinners=prizewinners, data=request.POST) if form.is_valid(): for winner, prizewins in groupby( sorted(form.cleaned_data['prizewinners'], key=lambda p: p.winner.id), lambda p: p.winner, ): prizewins = list(prizewins) for prizewin in prizewins: prizewin.create_claim_url(request) format_context = { 'event': event, 'winner': winner, 'prize_wins': prizewins, 'multi': len(prizewins) > 1, 'prize_count': len(prizewins), 'reply_address': form.cleaned_data['replyaddress'], 'accept_deadline': form.cleaned_data['acceptdeadline'], } post_office.mail.send( recipients=[winner.email], sender=form.cleaned_data['fromaddress'], template=form.cleaned_data['emailtemplate'], context=format_context, headers={ 'Reply-to': form.cleaned_data['replyaddress'] }, ) for prizewin in prizewins: prizewin.emailsent = True # "anywhere on earth" Time Zone is GMT-12 prizewin.acceptdeadline = datetime.datetime.combine( form.cleaned_data['acceptdeadline'] + datetime.timedelta(days=1), datetime.time(0, 0), ).replace(tzinfo=pytz.timezone('Etc/GMT-12')) prizewin.save() viewutil.tracker_log( 'prize', 'Mailed prize winner notifications', event=event, user=request.user, ) return render( request, 'admin/tracker/automail_prize_winners_post.html', {'prizewinners': form.cleaned_data['prizewinners']}, ) else: form = forms.AutomailPrizeWinnersForm(prizewinners=prizewinners) return render(request, 'admin/tracker/automail_prize_winners.html', {'form': form})