11import json
2- from builtins import object
32
43from django import forms
54from django .conf import settings
65from django .contrib .auth .forms import PasswordResetForm
76from django .contrib .auth .forms import UserChangeForm
87from django .contrib .auth .forms import UserCreationForm
98from django .core import signing
9+ from django .core .exceptions import ValidationError
1010from django .db .models import Q
1111from django .template .loader import render_to_string
1212
1616REGISTRATION_SALT = getattr (settings , 'REGISTRATION_SALT' , 'registration' )
1717
1818
19- class ExtraFormMixin (object ):
20-
21- def check_field (self , field , error ):
22- if not self .cleaned_data .get (field ):
23- self .errors [field ] = self .error_class ()
24- self .add_error (field , error )
25- return False
26- return self .cleaned_data .get (field )
27-
28-
2919# LOGIN/REGISTRATION FORMS
3020#################################################################
31- class RegistrationForm (UserCreationForm , ExtraFormMixin ):
21+ class RegistrationForm (UserCreationForm ):
22+ CODE_ACCOUNT_ACTIVE = 'account_active'
23+ CODE_ACCOUNT_INACTIVE = 'account_inactive'
24+
3225 first_name = forms .CharField (required = True )
3326 last_name = forms .CharField (required = True )
34- email = forms .CharField (required = True )
35- password1 = forms .CharField (required = True )
27+ email = forms .EmailField (required = True )
28+ password1 = forms .CharField (required = True , min_length = 8 )
3629 password2 = forms .CharField (required = True )
3730 uses = forms .CharField (required = True )
3831 other_use = forms .CharField (required = False )
@@ -45,22 +38,18 @@ class RegistrationForm(UserCreationForm, ExtraFormMixin):
4538 locations = forms .CharField (required = True )
4639
4740 def clean_email (self ):
48- email = self .cleaned_data ['email' ].strip ().lower ()
49- if User .objects .filter (Q (is_active = True ) | Q (deleted = True ), email__iexact = email ).exists ():
50- raise UserWarning
41+ # ensure email is lower case
42+ email = self .cleaned_data ["email" ].strip ().lower ()
43+ user_qs = User .objects .filter (email__iexact = email )
44+ if user_qs .exists ():
45+ if user_qs .filter (Q (is_active = True ) | Q (deleted = True )).exists ():
46+ raise ValidationError ("Account already active" , code = self .CODE_ACCOUNT_ACTIVE )
47+ else :
48+ raise ValidationError ("Already registered." , code = self .CODE_ACCOUNT_INACTIVE )
5149 return email
5250
53- def clean (self ):
54- super (RegistrationForm , self ).clean ()
55-
56- # Errors should be caught on the frontend
57- # or a warning should be thrown if the account exists
58- self .errors .clear ()
59- return self .cleaned_data
60-
6151 def save (self , commit = True ):
62- user = super (RegistrationForm , self ).save (commit = commit )
63- user .set_password (self .cleaned_data ["password1" ])
52+ user = super (RegistrationForm , self ).save (commit = False )
6453 user .first_name = self .cleaned_data ["first_name" ]
6554 user .last_name = self .cleaned_data ["last_name" ]
6655 user .information = {
@@ -165,7 +154,7 @@ def save(self, user):
165154 return user
166155
167156
168- class StorageRequestForm (forms .Form , ExtraFormMixin ):
157+ class StorageRequestForm (forms .Form ):
169158 # Nature of content
170159 storage = forms .CharField (required = True )
171160 kind = forms .CharField (required = True )
@@ -194,7 +183,7 @@ class Meta:
194183 "audience" , "import_count" , "location" , "uploading_for" , "organization_type" , "time_constraint" , "message" )
195184
196185
197- class IssueReportForm (forms .Form , ExtraFormMixin ):
186+ class IssueReportForm (forms .Form ):
198187 operating_system = forms .CharField (required = True )
199188 browser = forms .CharField (required = True )
200189 channel = forms .CharField (required = False )
@@ -204,7 +193,7 @@ class Meta:
204193 fields = ("operating_system" , "browser" , "channel" , "description" )
205194
206195
207- class DeleteAccountForm (forms .Form , ExtraFormMixin ):
196+ class DeleteAccountForm (forms .Form ):
208197 email = forms .CharField (required = True )
209198
210199 def __init__ (self , user , * args , ** kwargs ):
@@ -214,5 +203,5 @@ def __init__(self, user, *args, **kwargs):
214203 def clean_email (self ):
215204 email = self .cleaned_data ['email' ].strip ().lower ()
216205 if self .user .is_admin or self .user .email .lower () != self .cleaned_data ['email' ]:
217- raise UserWarning
206+ raise ValidationError ( "Not allowed" )
218207 return email
0 commit comments