annotate email_list/forms.py @ 83:4a64d34019af

Credit Jonpaul Balak with the Tiki Magazine quote on home page.
author Brian Neal <bgneal@gmail.com>
date Sat, 15 Dec 2012 12:26:14 -0600
parents e2868ad47a1e
children 0a8942306b04
rev   line source
bgneal@51 1 """
bgneal@51 2 Forms for the email_list application.
bgneal@51 3
bgneal@51 4 """
bgneal@51 5 from django import forms
bgneal@51 6 from django.conf import settings
bgneal@51 7 from django.core.urlresolvers import reverse
bgneal@53 8 from django.core.mail import send_mail, send_mass_mail
bgneal@51 9 from django.template.loader import render_to_string
bgneal@51 10
bgneal@51 11 from email_list.models import Subscriber
bgneal@51 12
bgneal@51 13
bgneal@51 14 SUBSCRIBE_OPTS = [('sub', 'Subscribe'), ('unsub', 'Unsubscribe')]
bgneal@51 15
bgneal@51 16 ALREADY_SUBSCRIBED = "This email address is already subscribed."
bgneal@51 17 NOT_SUBSCRIBED = "This email address is not on our list."
bgneal@51 18
bgneal@51 19
bgneal@51 20 class SubscriberForm(forms.Form):
bgneal@51 21 name = forms.CharField(max_length=64, required=False)
bgneal@51 22 email = forms.EmailField()
bgneal@51 23 location = forms.CharField(max_length=64, required=False)
bgneal@51 24 option = forms.ChoiceField(choices=SUBSCRIBE_OPTS)
bgneal@51 25
bgneal@51 26 def clean(self):
bgneal@51 27 """
bgneal@51 28 This method ensures the appropriate action can be carried out and raises
bgneal@51 29 a validation error if not.
bgneal@51 30
bgneal@51 31 """
bgneal@51 32 email = self.cleaned_data['email']
bgneal@51 33
bgneal@51 34 if self.cleaned_data['option'] == 'sub':
bgneal@51 35 # is the user already subscribed (active)?
bgneal@51 36 try:
bgneal@51 37 subscriber = Subscriber.objects.get(email=email)
bgneal@51 38 except Subscriber.DoesNotExist:
bgneal@51 39 subscriber = Subscriber(email=email,
bgneal@51 40 name=self.cleaned_data['name'],
bgneal@51 41 location=self.cleaned_data['location'])
bgneal@51 42 else:
bgneal@51 43 if subscriber.is_active():
bgneal@51 44 raise forms.ValidationError(ALREADY_SUBSCRIBED)
bgneal@51 45 else:
bgneal@51 46 # is the user already unsubscribed or not subscribed?
bgneal@51 47 try:
bgneal@51 48 subscriber = Subscriber.objects.get(email=email)
bgneal@51 49 except Subscriber.DoesNotExist:
bgneal@51 50 raise forms.ValidationError(NOT_SUBSCRIBED)
bgneal@51 51
bgneal@51 52 # save the subscriber away for a future process() call
bgneal@51 53 self.subscriber = subscriber
bgneal@51 54
bgneal@51 55 return self.cleaned_data
bgneal@51 56
bgneal@51 57 def is_subscribe(self):
bgneal@51 58 """
bgneal@51 59 This function can be called after an is_valid() call to determine if the
bgneal@51 60 request was for a subscribe or unsubscribe.
bgneal@51 61
bgneal@51 62 """
bgneal@51 63 return self.cleaned_data['option'] == 'sub'
bgneal@51 64
bgneal@51 65 def process(self):
bgneal@51 66 """
bgneal@51 67 Call this function if is_valid() returns True. It carries out the user's
bgneal@51 68 subscription request.
bgneal@51 69
bgneal@51 70 """
bgneal@51 71 if self.is_subscribe():
bgneal@51 72 self.subscriber.set_pending()
bgneal@51 73 else:
bgneal@51 74 self.subscriber.set_leaving()
bgneal@51 75
bgneal@51 76 self.subscriber.save()
bgneal@51 77 send_email(self.subscriber)
bgneal@51 78
bgneal@51 79
bgneal@53 80 class AdminEmailForm(forms.Form):
bgneal@53 81 subject = forms.CharField(max_length=255, required=True, label='Subject:',
bgneal@53 82 widget=forms.TextInput(attrs={'class': 'vTextField required',
bgneal@53 83 'size': '120'}))
bgneal@53 84 message = forms.CharField(label='Message:',
bgneal@53 85 widget=forms.Textarea(attrs={'class': 'vLargeTextField required'}))
bgneal@53 86
bgneal@53 87 def __init__(self, *args, **kwargs):
bgneal@53 88 initial = kwargs.pop('initial', {})
bgneal@53 89 if 'subject' not in initial:
bgneal@53 90 initial['subject'] = '[%s] ' % settings.BAND_CONFIG['BAND_NAME']
bgneal@53 91 kwargs['initial'] = initial
bgneal@53 92
bgneal@53 93 super(AdminEmailForm, self).__init__(*args, **kwargs)
bgneal@53 94
bgneal@53 95 def save(self):
bgneal@53 96 """
bgneal@53 97 Call this function if is_valid() to send the mass email.
bgneal@53 98 Returns the number of mails sent.
bgneal@53 99
bgneal@53 100 """
bgneal@53 101 subject = self.cleaned_data['subject']
bgneal@53 102 message = self.cleaned_data['message']
bgneal@53 103 return send_mail_to_subscribers(subject, message)
bgneal@53 104
bgneal@53 105
bgneal@51 106 def send_email(subscriber):
bgneal@51 107 """
bgneal@51 108 This function sends out the appropriate email for the given subscriber.
bgneal@51 109
bgneal@51 110 """
bgneal@51 111 config = settings.BAND_CONFIG
bgneal@51 112 band = config['BAND_NAME']
bgneal@51 113 from_email = config['BAND_EMAIL']
bgneal@51 114
bgneal@51 115 url = "http://%s%s" % (config['BAND_DOMAIN'],
bgneal@51 116 reverse('email_list-confirm', kwargs={'key': subscriber.key}))
bgneal@51 117
bgneal@51 118 if subscriber.is_pending():
bgneal@51 119 email_template = 'email_list/email_subscribe.txt'
bgneal@51 120 else:
bgneal@51 121 email_template = 'email_list/email_unsubscribe.txt'
bgneal@51 122
bgneal@51 123 msg = render_to_string(email_template, {
bgneal@51 124 'band': band,
bgneal@51 125 'url': url,
bgneal@51 126 'band_domain': config['BAND_DOMAIN'],
bgneal@51 127 })
bgneal@51 128
bgneal@51 129 subject = "[%s] Mailing List Confirmation" % band
bgneal@51 130
bgneal@51 131 send_mail(subject, msg, from_email, [subscriber.email])
bgneal@53 132
bgneal@53 133
bgneal@53 134 def send_mail_to_subscribers(subject, message):
bgneal@53 135 """
bgneal@53 136 Send an email to each mailing list subscriber with the given subject and
bgneal@53 137 message.
bgneal@53 138 Returns the number of messages sent.
bgneal@53 139
bgneal@53 140 """
bgneal@53 141 config = settings.BAND_CONFIG
bgneal@53 142 unsubscribe_url = "http://%s%s" % (config['BAND_DOMAIN'],
bgneal@53 143 reverse('email_list-main'))
bgneal@53 144
bgneal@53 145 msg = render_to_string('email_list/mailing_list.txt', {
bgneal@53 146 'band': config['BAND_NAME'],
bgneal@53 147 'unsubscribe_url': unsubscribe_url,
bgneal@53 148 'message': message,
bgneal@53 149 })
bgneal@53 150
bgneal@53 151 mail_data = [(subject, msg, config['BAND_EMAIL'], [subscriber]) for
bgneal@53 152 subscriber in Subscriber.objects.values_list('email', flat=True)]
bgneal@53 153
bgneal@53 154 send_mass_mail(mail_data)
bgneal@53 155 return len(mail_data)