f508ab505eea2c082bbf1fbfd8c3dceaf9001ce6
[wolnelektury.git] / src / newsletter / forms.py
1 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
3 #
4 from django.core.exceptions import ValidationError
5 from django.core.validators import validate_email
6 from django.forms import Form, BooleanField
7 from django.forms.fields import EmailField
8 from django.utils.safestring import mark_safe
9 from django.utils.translation import gettext_lazy as _
10 from newsletter.subscribe import subscribe
11 from .models import Newsletter
12
13
14 class NewsletterForm(Form):
15     email_field = 'email'
16     agree_newsletter = BooleanField(
17         required=False, initial=False, label=_('Chcę otrzymywać newsletter Wolnych Lektur'), label_suffix=False)
18     mailing = False
19     mailing_field = 'agree_newsletter'
20     newsletter = None
21
22     data_processing_part1 = _('''\
23 Administratorem danych osobowych jest Fundacja Wolne Lektury (ul. Marszałkowska 84/92 lok. 125, 00-514 Warszawa).
24 Podanie danych osobowych jest dobrowolne.''')
25     data_processing_part2 = _('''Dane są przetwarzane w zakresie niezbędnym do wysyłania newslettera odbiorcom.''')
26     data_processing_part3 = _('''\
27 Osobom, których dane są zbierane, przysługuje prawo dostępu do treści swoich danych oraz ich poprawiania.
28 Więcej informacji w <a href="%(url)s">polityce prywatności.</a>''') % {
29     'url': 'https://fundacja.wolnelektury.pl/prywatnosc/'
30     }
31
32     def __init__(self, *args, **kwargs):
33         super().__init__(*args, **kwargs)
34         # Move the newsletter field to the end.
35         if 'agree_newsletter' in self.fields:
36             f = self.fields['agree_newsletter']
37             del self.fields['agree_newsletter']
38             self.fields['agree_newsletter'] = f
39     
40     @property
41     def data_processing(self):
42         return mark_safe('%s %s %s' % (self.data_processing_part1, self.data_processing_part2, self.data_processing_part3))
43
44     def save(self, *args, **kwargs):
45         newsletter = self.newsletter or Newsletter.objects.filter(slug='').first()
46         if not newsletter:
47             return
48
49         if not (self.mailing or self.cleaned_data.get(self.mailing_field)):
50             return
51         email = self.cleaned_data[self.email_field]
52         try:
53             validate_email(email)
54         except ValidationError:
55             pass
56         else:
57             subscribe(email, newsletter=newsletter)
58
59
60 class SubscribeForm(NewsletterForm):
61     mailing = True
62     agree_newsletter = None
63     required_css_class = 'required'
64
65     email = EmailField(label=_('adres e-mail'))
66
67     def __init__(self, newsletter, *args, **kwargs):
68         self.newsletter = newsletter
69         super(SubscribeForm, self).__init__(*args, **kwargs)
70