Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / forms.py @ 8788aa17

History | View | Annotate | Download (15.6 kB)

1 aba1e498 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 18ffbee1 Sofia Papagiannaki
#
3 64cd4730 Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 64cd4730 Antony Chazapis
# without modification, are permitted provided that the following
5 64cd4730 Antony Chazapis
# conditions are met:
6 18ffbee1 Sofia Papagiannaki
#
7 64cd4730 Antony Chazapis
#   1. Redistributions of source code must retain the above
8 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
9 64cd4730 Antony Chazapis
#      disclaimer.
10 18ffbee1 Sofia Papagiannaki
#
11 64cd4730 Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
13 64cd4730 Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 64cd4730 Antony Chazapis
#      provided with the distribution.
15 18ffbee1 Sofia Papagiannaki
#
16 64cd4730 Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 64cd4730 Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 64cd4730 Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 64cd4730 Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 64cd4730 Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 64cd4730 Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 64cd4730 Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 64cd4730 Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 64cd4730 Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 64cd4730 Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 64cd4730 Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 64cd4730 Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 18ffbee1 Sofia Papagiannaki
#
29 64cd4730 Antony Chazapis
# The views and conclusions contained in the software and
30 64cd4730 Antony Chazapis
# documentation are those of the authors and should not be
31 64cd4730 Antony Chazapis
# interpreted as representing official policies, either expressed
32 64cd4730 Antony Chazapis
# or implied, of GRNET S.A.
33 8f378756 Sofia Papagiannaki
from urlparse import urljoin
34 270dd48d Sofia Papagiannaki
from datetime import datetime
35 64cd4730 Antony Chazapis
36 64cd4730 Antony Chazapis
from django import forms
37 64cd4730 Antony Chazapis
from django.utils.translation import ugettext as _
38 e2125441 Sofia Papagiannaki
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, PasswordResetForm
39 e2125441 Sofia Papagiannaki
from django.core.mail import send_mail
40 e2125441 Sofia Papagiannaki
from django.contrib.auth.tokens import default_token_generator
41 e2125441 Sofia Papagiannaki
from django.template import Context, loader
42 e2125441 Sofia Papagiannaki
from django.utils.http import int_to_base36
43 374611bc Sofia Papagiannaki
from django.core.urlresolvers import reverse
44 270dd48d Sofia Papagiannaki
from django.utils.functional import lazy
45 18ffbee1 Sofia Papagiannaki
from django.utils.safestring import mark_safe
46 5ed6816e Sofia Papagiannaki
47 8f5a3a06 Sofia Papagiannaki
from astakos.im.models import AstakosUser, Invitation
48 4e30244e Sofia Papagiannaki
from astakos.im.settings import INVITATIONS_PER_LEVEL, DEFAULT_FROM_EMAIL, SITENAME, RECAPTCHA_PRIVATE_KEY, DEFAULT_CONTACT_EMAIL, RECAPTCHA_ENABLED
49 270dd48d Sofia Papagiannaki
from astakos.im.widgets import DummyWidget, RecaptchaWidget, ApprovalTermsWidget
50 270dd48d Sofia Papagiannaki
51 270dd48d Sofia Papagiannaki
# since Django 1.4 use django.core.urlresolvers.reverse_lazy instead
52 d8f63346 Sofia Papagiannaki
from astakos.im.util import reverse_lazy, get_latest_terms
53 64cd4730 Antony Chazapis
54 3bf924ec Sofia Papagiannaki
import logging
55 db7fecd9 Sofia Papagiannaki
import recaptcha.client.captcha as captcha
56 64cd4730 Antony Chazapis
57 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
58 e015e9e6 Sofia Papagiannaki
59 15efc749 Sofia Papagiannaki
class LocalUserCreationForm(UserCreationForm):
60 890b0eaf Sofia Papagiannaki
    """
61 890b0eaf Sofia Papagiannaki
    Extends the built in UserCreationForm in several ways:
62 18ffbee1 Sofia Papagiannaki

63 8316698a Sofia Papagiannaki
    * Adds email, first_name, last_name, recaptcha_challenge_field, recaptcha_response_field field.
64 5ed6816e Sofia Papagiannaki
    * The username field isn't visible and it is assigned a generated id.
65 18ffbee1 Sofia Papagiannaki
    * User created is not active.
66 890b0eaf Sofia Papagiannaki
    """
67 db7fecd9 Sofia Papagiannaki
    recaptcha_challenge_field = forms.CharField(widget=DummyWidget)
68 db7fecd9 Sofia Papagiannaki
    recaptcha_response_field = forms.CharField(widget=RecaptchaWidget, label='')
69 18ffbee1 Sofia Papagiannaki
70 794852f2 Sofia Papagiannaki
    class Meta:
71 794852f2 Sofia Papagiannaki
        model = AstakosUser
72 270dd48d Sofia Papagiannaki
        fields = ("email", "first_name", "last_name", "has_signed_terms")
73 270dd48d Sofia Papagiannaki
        widgets = {"has_signed_terms":ApprovalTermsWidget(terms_uri=reverse_lazy('latest_terms'))}
74 18ffbee1 Sofia Papagiannaki
75 64cd4730 Antony Chazapis
    def __init__(self, *args, **kwargs):
76 64cd4730 Antony Chazapis
        """
77 890b0eaf Sofia Papagiannaki
        Changes the order of fields, and removes the username field.
78 64cd4730 Antony Chazapis
        """
79 db7fecd9 Sofia Papagiannaki
        if 'ip' in kwargs:
80 db7fecd9 Sofia Papagiannaki
            self.ip = kwargs['ip']
81 db7fecd9 Sofia Papagiannaki
            kwargs.pop('ip')
82 15efc749 Sofia Papagiannaki
        super(LocalUserCreationForm, self).__init__(*args, **kwargs)
83 890b0eaf Sofia Papagiannaki
        self.fields.keyOrder = ['email', 'first_name', 'last_name',
84 d8f63346 Sofia Papagiannaki
                                'password1', 'password2']
85 d8f63346 Sofia Papagiannaki
        if get_latest_terms():
86 d8f63346 Sofia Papagiannaki
            self.fields.keyOrder.append('has_signed_terms')
87 53bf2659 Sofia Papagiannaki
        if RECAPTCHA_ENABLED:
88 53bf2659 Sofia Papagiannaki
            self.fields.keyOrder.extend(['recaptcha_challenge_field',
89 53bf2659 Sofia Papagiannaki
                                         'recaptcha_response_field',])
90 18ffbee1 Sofia Papagiannaki
91 18ffbee1 Sofia Papagiannaki
        if 'has_signed_terms' in self.fields:
92 18ffbee1 Sofia Papagiannaki
            # Overriding field label since we need to apply a link
93 18ffbee1 Sofia Papagiannaki
            # to the terms within the label
94 18ffbee1 Sofia Papagiannaki
            terms_link_html = '<a href="%s" target="_blank">%s</a>' \
95 18ffbee1 Sofia Papagiannaki
                    % (reverse('latest_terms'), _("the terms"))
96 18ffbee1 Sofia Papagiannaki
            self.fields['has_signed_terms'].label = \
97 18ffbee1 Sofia Papagiannaki
                    mark_safe("I agree with %s" % terms_link_html)
98 18ffbee1 Sofia Papagiannaki
99 af4eb974 Sofia Papagiannaki
    def clean_email(self):
100 af4eb974 Sofia Papagiannaki
        email = self.cleaned_data['email']
101 881c856c Sofia Papagiannaki
        if not email:
102 881c856c Sofia Papagiannaki
            raise forms.ValidationError(_("This field is required"))
103 af4eb974 Sofia Papagiannaki
        try:
104 af4eb974 Sofia Papagiannaki
            AstakosUser.objects.get(email = email)
105 c37263ea Sofia Papagiannaki
            raise forms.ValidationError(_("This email is already used"))
106 af4eb974 Sofia Papagiannaki
        except AstakosUser.DoesNotExist:
107 af4eb974 Sofia Papagiannaki
            return email
108 18ffbee1 Sofia Papagiannaki
109 270dd48d Sofia Papagiannaki
    def clean_has_signed_terms(self):
110 270dd48d Sofia Papagiannaki
        has_signed_terms = self.cleaned_data['has_signed_terms']
111 270dd48d Sofia Papagiannaki
        if not has_signed_terms:
112 270dd48d Sofia Papagiannaki
            raise forms.ValidationError(_('You have to agree with the terms'))
113 270dd48d Sofia Papagiannaki
        return has_signed_terms
114 18ffbee1 Sofia Papagiannaki
115 db7fecd9 Sofia Papagiannaki
    def clean_recaptcha_response_field(self):
116 db7fecd9 Sofia Papagiannaki
        if 'recaptcha_challenge_field' in self.cleaned_data:
117 db7fecd9 Sofia Papagiannaki
            self.validate_captcha()
118 db7fecd9 Sofia Papagiannaki
        return self.cleaned_data['recaptcha_response_field']
119 db7fecd9 Sofia Papagiannaki
120 db7fecd9 Sofia Papagiannaki
    def clean_recaptcha_challenge_field(self):
121 db7fecd9 Sofia Papagiannaki
        if 'recaptcha_response_field' in self.cleaned_data:
122 db7fecd9 Sofia Papagiannaki
            self.validate_captcha()
123 db7fecd9 Sofia Papagiannaki
        return self.cleaned_data['recaptcha_challenge_field']
124 db7fecd9 Sofia Papagiannaki
125 db7fecd9 Sofia Papagiannaki
    def validate_captcha(self):
126 db7fecd9 Sofia Papagiannaki
        rcf = self.cleaned_data['recaptcha_challenge_field']
127 db7fecd9 Sofia Papagiannaki
        rrf = self.cleaned_data['recaptcha_response_field']
128 db7fecd9 Sofia Papagiannaki
        check = captcha.submit(rcf, rrf, RECAPTCHA_PRIVATE_KEY, self.ip)
129 db7fecd9 Sofia Papagiannaki
        if not check.is_valid:
130 db7fecd9 Sofia Papagiannaki
            raise forms.ValidationError(_('You have not entered the correct words'))
131 18ffbee1 Sofia Papagiannaki
132 890b0eaf Sofia Papagiannaki
    def save(self, commit=True):
133 64cd4730 Antony Chazapis
        """
134 890b0eaf Sofia Papagiannaki
        Saves the email, first_name and last_name properties, after the normal
135 890b0eaf Sofia Papagiannaki
        save behavior is complete.
136 890b0eaf Sofia Papagiannaki
        """
137 15efc749 Sofia Papagiannaki
        user = super(LocalUserCreationForm, self).save(commit=False)
138 3bf924ec Sofia Papagiannaki
        user.renew_token()
139 9fb8e808 Sofia Papagiannaki
        if commit:
140 9fb8e808 Sofia Papagiannaki
            user.save()
141 e015e9e6 Sofia Papagiannaki
        logger.info('Created user %s', user)
142 890b0eaf Sofia Papagiannaki
        return user
143 64cd4730 Antony Chazapis
144 15efc749 Sofia Papagiannaki
class InvitedLocalUserCreationForm(LocalUserCreationForm):
145 890b0eaf Sofia Papagiannaki
    """
146 15efc749 Sofia Papagiannaki
    Extends the LocalUserCreationForm: adds an inviter readonly field.
147 890b0eaf Sofia Papagiannaki
    """
148 18ffbee1 Sofia Papagiannaki
149 3bf924ec Sofia Papagiannaki
    inviter = forms.CharField(widget=forms.TextInput(), label=_('Inviter Real Name'))
150 18ffbee1 Sofia Papagiannaki
151 794852f2 Sofia Papagiannaki
    class Meta:
152 794852f2 Sofia Papagiannaki
        model = AstakosUser
153 270dd48d Sofia Papagiannaki
        fields = ("email", "first_name", "last_name", "has_signed_terms")
154 270dd48d Sofia Papagiannaki
        widgets = {"has_signed_terms":ApprovalTermsWidget(terms_uri=reverse_lazy('latest_terms'))}
155 18ffbee1 Sofia Papagiannaki
156 64cd4730 Antony Chazapis
    def __init__(self, *args, **kwargs):
157 64cd4730 Antony Chazapis
        """
158 3bf924ec Sofia Papagiannaki
        Changes the order of fields, and removes the username field.
159 64cd4730 Antony Chazapis
        """
160 15efc749 Sofia Papagiannaki
        super(InvitedLocalUserCreationForm, self).__init__(*args, **kwargs)
161 18ffbee1 Sofia Papagiannaki
162 64cd4730 Antony Chazapis
        #set readonly form fields
163 4e30244e Sofia Papagiannaki
        ro = ('inviter', 'email', 'username',)
164 4e30244e Sofia Papagiannaki
        for f in ro:
165 4e30244e Sofia Papagiannaki
            self.fields[f].widget.attrs['readonly'] = True
166 4e30244e Sofia Papagiannaki
        
167 18ffbee1 Sofia Papagiannaki
168 9fb8e808 Sofia Papagiannaki
    def save(self, commit=True):
169 15efc749 Sofia Papagiannaki
        user = super(InvitedLocalUserCreationForm, self).save(commit=False)
170 881c856c Sofia Papagiannaki
        level = user.invitation.inviter.level + 1
171 881c856c Sofia Papagiannaki
        user.level = level
172 8316698a Sofia Papagiannaki
        user.invitations = INVITATIONS_PER_LEVEL.get(level, 0)
173 8316698a Sofia Papagiannaki
        user.email_verified = True
174 9fb8e808 Sofia Papagiannaki
        if commit:
175 9fb8e808 Sofia Papagiannaki
            user.save()
176 9fb8e808 Sofia Papagiannaki
        return user
177 5ed6816e Sofia Papagiannaki
178 18ffbee1 Sofia Papagiannaki
class ThirdPartyUserCreationForm(forms.ModelForm):
179 8f5a3a06 Sofia Papagiannaki
    class Meta:
180 8f5a3a06 Sofia Papagiannaki
        model = AstakosUser
181 18ffbee1 Sofia Papagiannaki
        fields = ("email", "first_name", "last_name", "third_party_identifier",
182 18ffbee1 Sofia Papagiannaki
                  "has_signed_terms", "provider")
183 8f5a3a06 Sofia Papagiannaki
        widgets = {"has_signed_terms":ApprovalTermsWidget(terms_uri=reverse_lazy('latest_terms'))}
184 8f5a3a06 Sofia Papagiannaki
    
185 8f5a3a06 Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
186 8f5a3a06 Sofia Papagiannaki
        """
187 8f5a3a06 Sofia Papagiannaki
        Changes the order of fields, and removes the username field.
188 8f5a3a06 Sofia Papagiannaki
        """
189 8f5a3a06 Sofia Papagiannaki
        if 'ip' in kwargs:
190 8f5a3a06 Sofia Papagiannaki
            kwargs.pop('ip')
191 8f5a3a06 Sofia Papagiannaki
        super(ThirdPartyUserCreationForm, self).__init__(*args, **kwargs)
192 18ffbee1 Sofia Papagiannaki
        self.fields.keyOrder = ['email', 'first_name', 'last_name',
193 18ffbee1 Sofia Papagiannaki
                                'provider', 'third_party_identifier']
194 8f5a3a06 Sofia Papagiannaki
        if get_latest_terms():
195 8f5a3a06 Sofia Papagiannaki
            self.fields.keyOrder.append('has_signed_terms')
196 18ffbee1 Sofia Papagiannaki
        #set readonly form fields
197 18ffbee1 Sofia Papagiannaki
        ro = ["provider", "third_party_identifier", "first_name", "last_name"]
198 18ffbee1 Sofia Papagiannaki
        for f in ro:
199 18ffbee1 Sofia Papagiannaki
            self.fields[f].widget.attrs['readonly'] = True
200 18ffbee1 Sofia Papagiannaki
        
201 18ffbee1 Sofia Papagiannaki
        if 'has_signed_terms' in self.fields:
202 18ffbee1 Sofia Papagiannaki
            # Overriding field label since we need to apply a link
203 18ffbee1 Sofia Papagiannaki
            # to the terms within the label
204 18ffbee1 Sofia Papagiannaki
            terms_link_html = '<a href="%s" target="_blank">%s</a>' \
205 18ffbee1 Sofia Papagiannaki
                    % (reverse('latest_terms'), _("the terms"))
206 18ffbee1 Sofia Papagiannaki
            self.fields['has_signed_terms'].label = \
207 18ffbee1 Sofia Papagiannaki
                    mark_safe("I agree with %s" % terms_link_html)
208 18ffbee1 Sofia Papagiannaki
    
209 18ffbee1 Sofia Papagiannaki
    def clean_email(self):
210 18ffbee1 Sofia Papagiannaki
        email = self.cleaned_data['email']
211 18ffbee1 Sofia Papagiannaki
        if not email:
212 18ffbee1 Sofia Papagiannaki
            raise forms.ValidationError(_("This field is required"))
213 18ffbee1 Sofia Papagiannaki
        try:
214 18ffbee1 Sofia Papagiannaki
            AstakosUser.objects.get(email = email)
215 18ffbee1 Sofia Papagiannaki
            raise forms.ValidationError(_("This email is already used"))
216 18ffbee1 Sofia Papagiannaki
        except AstakosUser.DoesNotExist:
217 18ffbee1 Sofia Papagiannaki
            return email
218 18ffbee1 Sofia Papagiannaki
    
219 18ffbee1 Sofia Papagiannaki
    def clean_has_signed_terms(self):
220 18ffbee1 Sofia Papagiannaki
        has_signed_terms = self.cleaned_data['has_signed_terms']
221 18ffbee1 Sofia Papagiannaki
        if not has_signed_terms:
222 18ffbee1 Sofia Papagiannaki
            raise forms.ValidationError(_('You have to agree with the terms'))
223 18ffbee1 Sofia Papagiannaki
        return has_signed_terms
224 8f5a3a06 Sofia Papagiannaki
    
225 8f5a3a06 Sofia Papagiannaki
    def save(self, commit=True):
226 8f5a3a06 Sofia Papagiannaki
        user = super(ThirdPartyUserCreationForm, self).save(commit=False)
227 8f5a3a06 Sofia Papagiannaki
        user.set_unusable_password()
228 18ffbee1 Sofia Papagiannaki
        user.renew_token()
229 8f5a3a06 Sofia Papagiannaki
        if commit:
230 8f5a3a06 Sofia Papagiannaki
            user.save()
231 8f5a3a06 Sofia Papagiannaki
        logger.info('Created user %s', user)
232 8f5a3a06 Sofia Papagiannaki
        return user
233 8f5a3a06 Sofia Papagiannaki
234 4e30244e Sofia Papagiannaki
#class InvitedThirdPartyUserCreationForm(ThirdPartyUserCreationForm):
235 4e30244e Sofia Papagiannaki
#    def __init__(self, *args, **kwargs):
236 4e30244e Sofia Papagiannaki
#        super(InvitedThirdPartyUserCreationForm, self).__init__(*args, **kwargs)
237 4e30244e Sofia Papagiannaki
#        #set readonly form fields
238 4e30244e Sofia Papagiannaki
#        self.fields['email'].widget.attrs['readonly'] = True
239 4e30244e Sofia Papagiannaki
240 8f5a3a06 Sofia Papagiannaki
class InvitedThirdPartyUserCreationForm(ThirdPartyUserCreationForm):
241 4e30244e Sofia Papagiannaki
    """
242 4e30244e Sofia Papagiannaki
    Extends the LocalUserCreationForm: adds an inviter readonly field.
243 4e30244e Sofia Papagiannaki
    """
244 4e30244e Sofia Papagiannaki
    inviter = forms.CharField(widget=forms.TextInput(), label=_('Inviter Real Name'))
245 4e30244e Sofia Papagiannaki
    
246 8f5a3a06 Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
247 4e30244e Sofia Papagiannaki
        """
248 4e30244e Sofia Papagiannaki
        Changes the order of fields, and removes the username field.
249 4e30244e Sofia Papagiannaki
        """
250 8f5a3a06 Sofia Papagiannaki
        super(InvitedThirdPartyUserCreationForm, self).__init__(*args, **kwargs)
251 4e30244e Sofia Papagiannaki
252 8f5a3a06 Sofia Papagiannaki
        #set readonly form fields
253 4e30244e Sofia Papagiannaki
        ro = ('inviter', 'email',)
254 4e30244e Sofia Papagiannaki
        for f in ro:
255 4e30244e Sofia Papagiannaki
            self.fields[f].widget.attrs['readonly'] = True
256 4e30244e Sofia Papagiannaki
    
257 4e30244e Sofia Papagiannaki
    def save(self, commit=True):
258 4e30244e Sofia Papagiannaki
        user = super(InvitedThirdPartyUserCreationForm, self).save(commit=False)
259 4e30244e Sofia Papagiannaki
        level = user.invitation.inviter.level + 1
260 4e30244e Sofia Papagiannaki
        user.level = level
261 4e30244e Sofia Papagiannaki
        user.invitations = INVITATIONS_PER_LEVEL.get(level, 0)
262 4e30244e Sofia Papagiannaki
        user.email_verified = True
263 4e30244e Sofia Papagiannaki
        if commit:
264 4e30244e Sofia Papagiannaki
            user.save()
265 4e30244e Sofia Papagiannaki
        return user
266 8f5a3a06 Sofia Papagiannaki
267 18ffbee1 Sofia Papagiannaki
class ShibbolethUserCreationForm(ThirdPartyUserCreationForm):
268 18ffbee1 Sofia Papagiannaki
    def clean_email(self):
269 18ffbee1 Sofia Papagiannaki
        email = self.cleaned_data['email']
270 18ffbee1 Sofia Papagiannaki
        if not email:
271 18ffbee1 Sofia Papagiannaki
            raise forms.ValidationError(_("This field is required"))
272 18ffbee1 Sofia Papagiannaki
        try:
273 18ffbee1 Sofia Papagiannaki
            user = AstakosUser.objects.get(email = email)
274 18ffbee1 Sofia Papagiannaki
            if user.provider == 'local':
275 18ffbee1 Sofia Papagiannaki
                self.instance = user
276 18ffbee1 Sofia Papagiannaki
                return email
277 18ffbee1 Sofia Papagiannaki
            else:
278 18ffbee1 Sofia Papagiannaki
                raise forms.ValidationError(_("This email is already associated with another shibboleth account."))
279 18ffbee1 Sofia Papagiannaki
        except AstakosUser.DoesNotExist:
280 18ffbee1 Sofia Papagiannaki
            return email
281 4e30244e Sofia Papagiannaki
282 4e30244e Sofia Papagiannaki
class InvitedShibbolethUserCreationForm(InvitedThirdPartyUserCreationForm):
283 4e30244e Sofia Papagiannaki
    pass
284 18ffbee1 Sofia Papagiannaki
    
285 5ed6816e Sofia Papagiannaki
class LoginForm(AuthenticationForm):
286 5ed6816e Sofia Papagiannaki
    username = forms.EmailField(label=_("Email"))
287 64cd4730 Antony Chazapis
288 890b0eaf Sofia Papagiannaki
class ProfileForm(forms.ModelForm):
289 890b0eaf Sofia Papagiannaki
    """
290 890b0eaf Sofia Papagiannaki
    Subclass of ``ModelForm`` for permiting user to edit his/her profile.
291 890b0eaf Sofia Papagiannaki
    Most of the fields are readonly since the user is not allowed to change them.
292 18ffbee1 Sofia Papagiannaki

293 890b0eaf Sofia Papagiannaki
    The class defines a save method which sets ``is_verified`` to True so as the user
294 890b0eaf Sofia Papagiannaki
    during the next login will not to be redirected to profile page.
295 890b0eaf Sofia Papagiannaki
    """
296 c301698f Sofia Papagiannaki
    renew = forms.BooleanField(label='Renew token', required=False)
297 18ffbee1 Sofia Papagiannaki
298 890b0eaf Sofia Papagiannaki
    class Meta:
299 890b0eaf Sofia Papagiannaki
        model = AstakosUser
300 18ffbee1 Sofia Papagiannaki
        fields = ('email', 'first_name', 'last_name', 'auth_token', 'auth_token_expires', 'groups')
301 18ffbee1 Sofia Papagiannaki
302 64cd4730 Antony Chazapis
    def __init__(self, *args, **kwargs):
303 890b0eaf Sofia Papagiannaki
        super(ProfileForm, self).__init__(*args, **kwargs)
304 890b0eaf Sofia Papagiannaki
        instance = getattr(self, 'instance', None)
305 18ffbee1 Sofia Papagiannaki
        ro_fields = ('auth_token', 'auth_token_expires', 'groups')
306 890b0eaf Sofia Papagiannaki
        if instance and instance.id:
307 890b0eaf Sofia Papagiannaki
            for field in ro_fields:
308 890b0eaf Sofia Papagiannaki
                self.fields[field].widget.attrs['readonly'] = True
309 18ffbee1 Sofia Papagiannaki
310 890b0eaf Sofia Papagiannaki
    def save(self, commit=True):
311 890b0eaf Sofia Papagiannaki
        user = super(ProfileForm, self).save(commit=False)
312 890b0eaf Sofia Papagiannaki
        user.is_verified = True
313 c301698f Sofia Papagiannaki
        if self.cleaned_data.get('renew'):
314 c301698f Sofia Papagiannaki
            user.renew_token()
315 890b0eaf Sofia Papagiannaki
        if commit:
316 890b0eaf Sofia Papagiannaki
            user.save()
317 890b0eaf Sofia Papagiannaki
        return user
318 64cd4730 Antony Chazapis
319 890b0eaf Sofia Papagiannaki
class FeedbackForm(forms.Form):
320 890b0eaf Sofia Papagiannaki
    """
321 890b0eaf Sofia Papagiannaki
    Form for writing feedback.
322 890b0eaf Sofia Papagiannaki
    """
323 8f5a3a06 Sofia Papagiannaki
    feedback_msg = forms.CharField(widget=forms.TextInput(), label=u'Message')
324 8f5a3a06 Sofia Papagiannaki
    feedback_data = forms.CharField(widget=forms.HiddenInput(), label='',
325 8f5a3a06 Sofia Papagiannaki
                                    required=False)
326 5ed6816e Sofia Papagiannaki
327 5ed6816e Sofia Papagiannaki
class SendInvitationForm(forms.Form):
328 5ed6816e Sofia Papagiannaki
    """
329 5ed6816e Sofia Papagiannaki
    Form for sending an invitations
330 5ed6816e Sofia Papagiannaki
    """
331 18ffbee1 Sofia Papagiannaki
332 5ed6816e Sofia Papagiannaki
    email = forms.EmailField(required = True, label = 'Email address')
333 5ed6816e Sofia Papagiannaki
    first_name = forms.EmailField(label = 'First name')
334 5ed6816e Sofia Papagiannaki
    last_name = forms.EmailField(label = 'Last name')
335 e2125441 Sofia Papagiannaki
336 e2125441 Sofia Papagiannaki
class ExtendedPasswordResetForm(PasswordResetForm):
337 e2125441 Sofia Papagiannaki
    """
338 e2125441 Sofia Papagiannaki
    Extends PasswordResetForm by overriding save method:
339 e2125441 Sofia Papagiannaki
    passes a custom from_email in send_mail.
340 18ffbee1 Sofia Papagiannaki

341 e2125441 Sofia Papagiannaki
    Since Django 1.3 this is useless since ``django.contrib.auth.views.reset_password``
342 e2125441 Sofia Papagiannaki
    accepts a from_email argument.
343 e2125441 Sofia Papagiannaki
    """
344 e2125441 Sofia Papagiannaki
    def save(self, domain_override=None, email_template_name='registration/password_reset_email.html',
345 e2125441 Sofia Papagiannaki
             use_https=False, token_generator=default_token_generator, request=None):
346 e2125441 Sofia Papagiannaki
        """
347 e2125441 Sofia Papagiannaki
        Generates a one-use only link for resetting password and sends to the user.
348 e2125441 Sofia Papagiannaki
        """
349 e2125441 Sofia Papagiannaki
        for user in self.users_cache:
350 18ffbee1 Sofia Papagiannaki
            url = reverse('django.contrib.auth.views.password_reset_confirm',
351 18ffbee1 Sofia Papagiannaki
                          kwargs={'uidb36':int_to_base36(user.id),
352 18ffbee1 Sofia Papagiannaki
                                  'token':token_generator.make_token(user)})
353 18ffbee1 Sofia Papagiannaki
            url = request.build_absolute_uri(url)
354 e2125441 Sofia Papagiannaki
            t = loader.get_template(email_template_name)
355 e2125441 Sofia Papagiannaki
            c = {
356 e2125441 Sofia Papagiannaki
                'email': user.email,
357 8f378756 Sofia Papagiannaki
                'url': url,
358 374611bc Sofia Papagiannaki
                'site_name': SITENAME,
359 e2125441 Sofia Papagiannaki
                'user': user,
360 4e30244e Sofia Papagiannaki
                'baseurl': request.build_absolute_uri(),
361 09122dd8 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL
362 e2125441 Sofia Papagiannaki
            }
363 d552ecb7 Antony Chazapis
            from_email = DEFAULT_FROM_EMAIL
364 4abc7b29 Sofia Papagiannaki
            send_mail(_("Password reset on %s alpha2 testing") % SITENAME,
365 e2125441 Sofia Papagiannaki
                t.render(Context(c)), from_email, [user.email])
366 270dd48d Sofia Papagiannaki
367 270dd48d Sofia Papagiannaki
class SignApprovalTermsForm(forms.ModelForm):
368 270dd48d Sofia Papagiannaki
    class Meta:
369 270dd48d Sofia Papagiannaki
        model = AstakosUser
370 270dd48d Sofia Papagiannaki
        fields = ("has_signed_terms",)
371 18ffbee1 Sofia Papagiannaki
372 270dd48d Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
373 270dd48d Sofia Papagiannaki
        super(SignApprovalTermsForm, self).__init__(*args, **kwargs)
374 18ffbee1 Sofia Papagiannaki
375 270dd48d Sofia Papagiannaki
    def clean_has_signed_terms(self):
376 270dd48d Sofia Papagiannaki
        has_signed_terms = self.cleaned_data['has_signed_terms']
377 270dd48d Sofia Papagiannaki
        if not has_signed_terms:
378 270dd48d Sofia Papagiannaki
            raise forms.ValidationError(_('You have to agree with the terms'))
379 270dd48d Sofia Papagiannaki
        return has_signed_terms
380 8f5a3a06 Sofia Papagiannaki
381 8f5a3a06 Sofia Papagiannaki
class InvitationForm(forms.ModelForm):
382 8f5a3a06 Sofia Papagiannaki
    username = forms.EmailField(label=_("Email"))
383 8f5a3a06 Sofia Papagiannaki
    
384 18ffbee1 Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
385 18ffbee1 Sofia Papagiannaki
        super(InvitationForm, self).__init__(*args, **kwargs)
386 18ffbee1 Sofia Papagiannaki
    
387 8f5a3a06 Sofia Papagiannaki
    class Meta:
388 8f5a3a06 Sofia Papagiannaki
        model = Invitation
389 8f5a3a06 Sofia Papagiannaki
        fields = ('username', 'realname')
390 8f5a3a06 Sofia Papagiannaki
    
391 8f5a3a06 Sofia Papagiannaki
    def clean_username(self):
392 8f5a3a06 Sofia Papagiannaki
        username = self.cleaned_data['username']
393 8f5a3a06 Sofia Papagiannaki
        try:
394 8f5a3a06 Sofia Papagiannaki
            Invitation.objects.get(username = username)
395 8f5a3a06 Sofia Papagiannaki
            raise forms.ValidationError(_('There is already invitation for this email.'))
396 8f5a3a06 Sofia Papagiannaki
        except Invitation.DoesNotExist:
397 8f5a3a06 Sofia Papagiannaki
            pass
398 18ffbee1 Sofia Papagiannaki
        return username