forked from jazzband/django-newsletter
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathforms.py
More file actions
165 lines (120 loc) · 4.42 KB
/
forms.py
File metadata and controls
165 lines (120 loc) · 4.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
from django import forms
from django.forms.utils import ValidationError
from django.utils.translation import gettext_lazy as _
from .models import Subscription
from .validators import validate_email_nouser
class NewsletterForm(forms.ModelForm):
""" This is the base class for all forms managing subscriptions. """
class Meta:
model = Subscription
fields = ('name_field', 'email_field')
def __init__(self, *args, **kwargs):
assert 'newsletter' in kwargs, 'No newsletter specified'
newsletter = kwargs.pop('newsletter')
if 'ip' in kwargs:
ip = kwargs['ip']
del kwargs['ip']
else:
ip = None
super(NewsletterForm, self).__init__(*args, **kwargs)
self.instance.newsletter = newsletter
if ip:
self.instance.ip = ip
class SubscribeRequestForm(NewsletterForm):
"""
Request subscription to the newsletter. Will result in an activation email
being sent with a link where one can edit, confirm and activate one's
subscription.
"""
email_field = forms.EmailField(
label=_("e-mail"), validators=[validate_email_nouser]
)
def clean_email_field(self):
data = self.cleaned_data['email_field']
# Check whether we have already been subscribed to
try:
subscription = Subscription.objects.get(
email_field__exact=data,
newsletter=self.instance.newsletter
)
if subscription.subscribed and not subscription.unsubscribed:
raise ValidationError(
_("Your e-mail address has already been subscribed to.")
)
else:
self.instance = subscription
self.instance = subscription
except Subscription.DoesNotExist:
pass
return data
class UpdateRequestForm(NewsletterForm):
"""
Request updating or activating subscription. Will result in an activation
email being sent.
"""
email_field = forms.EmailField(
label=_("e-mail"), validators=[validate_email_nouser]
)
class Meta(NewsletterForm.Meta):
fields = ('email_field',)
def clean(self):
if not self.instance.subscribed:
raise ValidationError(
_("This subscription has not yet been activated.")
)
return super(UpdateRequestForm, self).clean()
def clean_email_field(self):
data = self.cleaned_data['email_field']
# Set our instance on the basis of the email field, or raise
# a validationerror
try:
self.instance = Subscription.objects.get(
newsletter=self.instance.newsletter,
email_field__exact=data
)
except Subscription.DoesNotExist:
raise ValidationError(
_("This e-mail address has not been subscribed to.")
)
return data
class UnsubscribeRequestForm(UpdateRequestForm):
"""
Similar to previous form but checks if we have not
already been unsubscribed.
"""
def clean(self):
if self.instance.unsubscribed:
raise ValidationError(
_("This subscription has already been unsubscribed from.")
)
return super(UnsubscribeRequestForm, self).clean()
class UpdateForm(NewsletterForm):
"""
This form allows one to actually update to or unsubscribe from the
newsletter. To do this, a correct activation code is required.
"""
email_field = forms.EmailField(
label=_("e-mail"), validators=[validate_email_nouser], disabled=True
)
def clean_user_activation_code(self):
data = self.cleaned_data['user_activation_code']
if data != self.instance.activation_code:
raise ValidationError(
_('The validation code supplied by you does not match.')
)
return data
user_activation_code = forms.CharField(
label=_("Activation code"), max_length=40
)
class UserUpdateForm(forms.ModelForm):
"""
Form for updating subscription information/unsubscribing as a logged-in
user.
"""
class Meta:
model = Subscription
fields = ('subscribed',)
# Newsletter here should become a read only field,
# once this is supported by Django.
# For now, use a hidden field.
hidden_fields = ('newsletter',)