escape user-provided strings used in regular expressions
[wolnelektury.git] / src / newsletter / forms.py
1 # -*- coding: utf-8 -*-
2 from django.core.exceptions import ValidationError
3 from django.core.validators import validate_email
4 from django.forms import Form, BooleanField
5 from django.forms.fields import EmailField
6 from django.template.loader import render_to_string
7 from django.utils.translation import ugettext_lazy as _, ugettext
8
9 from newsletter.models import Subscription
10 from wolnelektury.utils import send_noreply_mail
11
12
13 class NewsletterForm(Form):
14     email_field = 'email'
15     agree_newsletter = BooleanField(
16         required=False, initial=True, label=_(u'I want to receive Wolne Lektury\'s newsletter.'), help_text='''\
17 Oświadczam, że wyrażam zgodę na przetwarzanie moich danych osobowych zawartych \
18 w niniejszym formularzu zgłoszeniowym przez Fundację Nowoczesna Polska (administratora danych) z siedzibą \
19 w Warszawie (00-514) przy ul. Marszałkowskiej 84/92 lok. 125 w celu otrzymywania newslettera Wolnych Lektur. \
20 Jednocześnie oświadczam, że zostałam/em poinformowana/y o tym, że mam prawo wglądu w treść swoich danych i \
21 możliwość ich poprawiania oraz że ich podanie jest dobrowolne, ale niezbędne do dokonania zgłoszenia.''')
22
23     def save(self):
24         try:
25             # multiple inheritance mode
26             super(NewsletterForm, self).save()
27         except AttributeError:
28             pass
29         if not self.cleaned_data.get('agree_newsletter'):
30             return
31         email = self.cleaned_data[self.email_field]
32         try:
33             validate_email(email)
34         except ValidationError:
35             pass
36         else:
37             subscription, created = Subscription.objects.get_or_create(email=email, defaults={'active': False})
38             send_noreply_mail(
39                 ugettext(u'Confirm your subscription to Wolne Lektury newsletter'),
40                 render_to_string('newsletter/subscribe_email.html', {'subscription': subscription}), [email])
41
42
43 class SubscribeForm(NewsletterForm):
44     email = EmailField(label=_('email address'))
45
46     def __init__(self, *args, **kwargs):
47         super(SubscribeForm, self).__init__(*args, **kwargs)
48         self.fields['agree_newsletter'].required = True
49
50
51 class UnsubscribeForm(Form):
52     email = EmailField(label=_('email address'))
53
54     def clean(self):
55         email = self.cleaned_data.get('email')
56         try:
57             subscription = Subscription.objects.get(email=email)
58         except Subscription.DoesNotExist:
59             raise ValidationError(ugettext(u'Email address not found.'))
60         self.cleaned_data['subscription'] = subscription
61
62     def save(self):
63         subscription = self.cleaned_data['subscription']
64         subscription.active = False
65         subscription.save()
66
67         context = {'subscription': subscription}
68         # refactor to send_noreply_mail
69         send_noreply_mail(
70             ugettext(u'Unsubscribe from Wolne Lektury\'s newsletter.'),
71             render_to_string('newsletter/unsubscribe_email.html', context),
72             [subscription.email], fail_silently=True)