Mercurial > public > madeira
diff email_list/forms.py @ 71:e2868ad47a1e
For Django 1.4, using the new manage.py.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 14 Apr 2012 16:40:29 -0500 |
parents | madeira/email_list/forms.py@9b40a8d300a4 |
children | 0a8942306b04 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email_list/forms.py Sat Apr 14 16:40:29 2012 -0500 @@ -0,0 +1,155 @@ +""" +Forms for the email_list application. + +""" +from django import forms +from django.conf import settings +from django.core.urlresolvers import reverse +from django.core.mail import send_mail, send_mass_mail +from django.template.loader import render_to_string + +from email_list.models import Subscriber + + +SUBSCRIBE_OPTS = [('sub', 'Subscribe'), ('unsub', 'Unsubscribe')] + +ALREADY_SUBSCRIBED = "This email address is already subscribed." +NOT_SUBSCRIBED = "This email address is not on our list." + + +class SubscriberForm(forms.Form): + name = forms.CharField(max_length=64, required=False) + email = forms.EmailField() + location = forms.CharField(max_length=64, required=False) + option = forms.ChoiceField(choices=SUBSCRIBE_OPTS) + + def clean(self): + """ + This method ensures the appropriate action can be carried out and raises + a validation error if not. + + """ + email = self.cleaned_data['email'] + + if self.cleaned_data['option'] == 'sub': + # is the user already subscribed (active)? + try: + subscriber = Subscriber.objects.get(email=email) + except Subscriber.DoesNotExist: + subscriber = Subscriber(email=email, + name=self.cleaned_data['name'], + location=self.cleaned_data['location']) + else: + if subscriber.is_active(): + raise forms.ValidationError(ALREADY_SUBSCRIBED) + else: + # is the user already unsubscribed or not subscribed? + try: + subscriber = Subscriber.objects.get(email=email) + except Subscriber.DoesNotExist: + raise forms.ValidationError(NOT_SUBSCRIBED) + + # save the subscriber away for a future process() call + self.subscriber = subscriber + + return self.cleaned_data + + def is_subscribe(self): + """ + This function can be called after an is_valid() call to determine if the + request was for a subscribe or unsubscribe. + + """ + return self.cleaned_data['option'] == 'sub' + + def process(self): + """ + Call this function if is_valid() returns True. It carries out the user's + subscription request. + + """ + if self.is_subscribe(): + self.subscriber.set_pending() + else: + self.subscriber.set_leaving() + + self.subscriber.save() + send_email(self.subscriber) + + +class AdminEmailForm(forms.Form): + subject = forms.CharField(max_length=255, required=True, label='Subject:', + widget=forms.TextInput(attrs={'class': 'vTextField required', + 'size': '120'})) + message = forms.CharField(label='Message:', + widget=forms.Textarea(attrs={'class': 'vLargeTextField required'})) + + def __init__(self, *args, **kwargs): + initial = kwargs.pop('initial', {}) + if 'subject' not in initial: + initial['subject'] = '[%s] ' % settings.BAND_CONFIG['BAND_NAME'] + kwargs['initial'] = initial + + super(AdminEmailForm, self).__init__(*args, **kwargs) + + def save(self): + """ + Call this function if is_valid() to send the mass email. + Returns the number of mails sent. + + """ + subject = self.cleaned_data['subject'] + message = self.cleaned_data['message'] + return send_mail_to_subscribers(subject, message) + + +def send_email(subscriber): + """ + This function sends out the appropriate email for the given subscriber. + + """ + config = settings.BAND_CONFIG + band = config['BAND_NAME'] + from_email = config['BAND_EMAIL'] + + url = "http://%s%s" % (config['BAND_DOMAIN'], + reverse('email_list-confirm', kwargs={'key': subscriber.key})) + + if subscriber.is_pending(): + email_template = 'email_list/email_subscribe.txt' + else: + email_template = 'email_list/email_unsubscribe.txt' + + msg = render_to_string(email_template, { + 'band': band, + 'url': url, + 'band_domain': config['BAND_DOMAIN'], + }) + + subject = "[%s] Mailing List Confirmation" % band + + send_mail(subject, msg, from_email, [subscriber.email]) + + +def send_mail_to_subscribers(subject, message): + """ + Send an email to each mailing list subscriber with the given subject and + message. + Returns the number of messages sent. + + """ + config = settings.BAND_CONFIG + unsubscribe_url = "http://%s%s" % (config['BAND_DOMAIN'], + reverse('email_list-main')) + + msg = render_to_string('email_list/mailing_list.txt', { + 'band': config['BAND_NAME'], + 'unsubscribe_url': unsubscribe_url, + 'message': message, + }) + + mail_data = [(subject, msg, config['BAND_EMAIL'], [subscriber]) for + subscriber in Subscriber.objects.values_list('email', flat=True)] + + send_mass_mail(mail_data) + return len(mail_data)