Revision 0a569195 snf-astakos-app/astakos/im/forms.py

b/snf-astakos-app/astakos/im/forms.py
43 43
from django.core.urlresolvers import reverse
44 44
from django.utils.functional import lazy
45 45
from django.utils.safestring import mark_safe
46
from django.contrib import messages
46 47

  
47 48
from astakos.im.models import AstakosUser, Invitation
48 49
from astakos.im.settings import INVITATIONS_PER_LEVEL, DEFAULT_FROM_EMAIL, SITENAME, RECAPTCHA_PRIVATE_KEY, DEFAULT_CONTACT_EMAIL, RECAPTCHA_ENABLED
49 50
from astakos.im.widgets import DummyWidget, RecaptchaWidget, ApprovalTermsWidget
50 51

  
51 52
# since Django 1.4 use django.core.urlresolvers.reverse_lazy instead
52
from astakos.im.util import reverse_lazy, get_latest_terms
53
from astakos.im.util import reverse_lazy, get_latest_terms, reserved_email, get_query
53 54

  
54 55
import logging
55 56
import recaptcha.client.captcha as captcha
......
103 104
        email = self.cleaned_data['email']
104 105
        if not email:
105 106
            raise forms.ValidationError(_("This field is required"))
106
        try:
107
            AstakosUser.objects.get(email = email)
107
        if reserved_email(email):
108 108
            raise forms.ValidationError(_("This email is already used"))
109
        except AstakosUser.DoesNotExist:
110
            return email
109
        return email
111 110

  
112 111
    def clean_has_signed_terms(self):
113 112
        has_signed_terms = self.cleaned_data['has_signed_terms']
......
181 180
class ThirdPartyUserCreationForm(forms.ModelForm):
182 181
    class Meta:
183 182
        model = AstakosUser
184
        fields = ("email", "first_name", "last_name", "third_party_identifier",
185
                  "has_signed_terms", "provider")
183
        fields = ("email", "first_name", "last_name", "third_party_identifier")
186 184
        widgets = {"has_signed_terms":ApprovalTermsWidget(terms_uri=reverse_lazy('latest_terms'))}
187 185
    
188 186
    def __init__(self, *args, **kwargs):
189 187
        """
190 188
        Changes the order of fields, and removes the username field.
191 189
        """
190
        self.request = kwargs.get('request', None)
191
        if self.request:
192
            kwargs.pop('request')
192 193
        super(ThirdPartyUserCreationForm, self).__init__(*args, **kwargs)
193
        self.fields.keyOrder = ['email', 'first_name', 'last_name',
194
                                'provider', 'third_party_identifier']
194
        self.fields.keyOrder = ['email', 'first_name', 'last_name', 'third_party_identifier']
195 195
        if get_latest_terms():
196 196
            self.fields.keyOrder.append('has_signed_terms')
197 197
        #set readonly form fields
198
        ro = ["provider", "third_party_identifier", "first_name", "last_name"]
198
        ro = ["third_party_identifier", "first_name", "last_name"]
199 199
        for f in ro:
200 200
            self.fields[f].widget.attrs['readonly'] = True
201 201
        
......
211 211
        email = self.cleaned_data['email']
212 212
        if not email:
213 213
            raise forms.ValidationError(_("This field is required"))
214
        try:
215
            AstakosUser.objects.get(email = email)
214
        if reserved_email(email):
216 215
            raise forms.ValidationError(_("This email is already used"))
217
        except AstakosUser.DoesNotExist:
218
            return email
216
        return email
219 217
    
220 218
    def clean_has_signed_terms(self):
221 219
        has_signed_terms = self.cleaned_data['has_signed_terms']
......
227 225
        user = super(ThirdPartyUserCreationForm, self).save(commit=False)
228 226
        user.set_unusable_password()
229 227
        user.renew_token()
228
        user.provider = get_query(self.request).get('provider')
230 229
        if commit:
231 230
            user.save()
232 231
        logger.info('Created user %s', user)
233 232
        return user
234 233

  
235
#class InvitedThirdPartyUserCreationForm(ThirdPartyUserCreationForm):
236
#    def __init__(self, *args, **kwargs):
237
#        super(InvitedThirdPartyUserCreationForm, self).__init__(*args, **kwargs)
238
#        #set readonly form fields
239
#        self.fields['email'].widget.attrs['readonly'] = True
240

  
241 234
class InvitedThirdPartyUserCreationForm(ThirdPartyUserCreationForm):
242 235
    """
243 236
    Extends the LocalUserCreationForm: adds an inviter readonly field.
......
270 263
        email = self.cleaned_data['email']
271 264
        if not email:
272 265
            raise forms.ValidationError(_("This field is required"))
273
        try:
274
            user = AstakosUser.objects.get(email = email)
275
            if user.provider == 'local':
276
                self.instance = user
277
                return email
278
            else:
266
        for user in AstakosUser.objects.filter(email = email):
267
            if user.provider == 'shibboleth':
279 268
                raise forms.ValidationError(_("This email is already associated with another shibboleth account."))
280
        except AstakosUser.DoesNotExist:
281
            return email
269
        return email
282 270

  
283
class InvitedShibbolethUserCreationForm(InvitedThirdPartyUserCreationForm):
271
class InvitedShibbolethUserCreationForm(ShibbolethUserCreationForm, InvitedThirdPartyUserCreationForm):
284 272
    pass
285 273
    
286 274
class LoginForm(AuthenticationForm):
......
335 323

  
336 324
    class Meta:
337 325
        model = AstakosUser
338
        fields = ('email', 'first_name', 'last_name', 'auth_token', 'auth_token_expires', 'groups')
326
        fields = ('email', 'first_name', 'last_name', 'auth_token', 'auth_token_expires')
339 327

  
340 328
    def __init__(self, *args, **kwargs):
341 329
        super(ProfileForm, self).__init__(*args, **kwargs)
342 330
        instance = getattr(self, 'instance', None)
343
        ro_fields = ('auth_token', 'auth_token_expires', 'groups')
331
        ro_fields = ('email', 'auth_token', 'auth_token_expires')
344 332
        if instance and instance.id:
345 333
            for field in ro_fields:
346 334
                self.fields[field].widget.attrs['readonly'] = True
......
358 346
    """
359 347
    Form for writing feedback.
360 348
    """
361
    feedback_msg = forms.CharField(widget=forms.TextInput(), label=u'Message')
349
    feedback_msg = forms.CharField(widget=forms.Textarea, label=u'Message')
362 350
    feedback_data = forms.CharField(widget=forms.HiddenInput(), label='',
363 351
                                    required=False)
364 352

  
......
382 370
    def clean_email(self):
383 371
        email = super(ExtendedPasswordResetForm, self).clean_email()
384 372
        try:
385
            user = AstakosUser.objects.get(email=email)
373
            user = AstakosUser.objects.get(email=email, is_active=True)
386 374
            if not user.has_usable_password():
387 375
                raise forms.ValidationError(_("This account has not a usable password."))
388 376
        except AstakosUser.DoesNotExist, e:

Also available in: Unified diff