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