3
3
from django .contrib .sites .models import Site
4
4
from django .template import Context , loader
5
5
from django .core import validators
6
- from django import oldforms
6
+ from django import newforms as forms
7
7
from django .utils .translation import ugettext as _
8
8
9
- class UserCreationForm (oldforms .Manipulator ):
10
- "A form that creates a user, with no privileges, from the given username and password."
11
- def __init__ (self ):
12
- self .fields = (
13
- oldforms .TextField (field_name = 'username' , length = 30 , max_length = 30 , is_required = True ,
14
- validator_list = [validators .isAlphaNumeric , self .isValidUsername ]),
15
- oldforms .PasswordField (field_name = 'password1' , length = 30 , max_length = 60 , is_required = True ),
16
- oldforms .PasswordField (field_name = 'password2' , length = 30 , max_length = 60 , is_required = True ,
17
- validator_list = [validators .AlwaysMatchesOtherField ('password1' , _ ("The two password fields didn't match." ))]),
18
- )
19
-
20
- def isValidUsername (self , field_data , all_data ):
9
+ class UserCreationForm (forms .ModelForm ):
10
+ """
11
+ A form that creates a user, with no privileges, from the given username and password.
12
+ """
13
+ username = forms .RegexField (label = _ ("Username" ), max_length = 30 , regex = r'^\w+$' ,
14
+ help_text = _ ("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)." ),
15
+ error_message = _ ("This value must contain only letters, numbers and underscores." ))
16
+ password1 = forms .CharField (label = _ ("Password" ), max_length = 60 , widget = forms .PasswordInput )
17
+ password2 = forms .CharField (label = _ ("Password confirmation" ), max_length = 60 , widget = forms .PasswordInput )
18
+
19
+ class Meta :
20
+ model = User
21
+ fields = ("username" ,)
22
+
23
+ def clean_username (self ):
24
+ username = self .cleaned_data ["username" ]
21
25
try :
22
- User .objects .get (username = field_data )
26
+ User .objects .get (username = username )
23
27
except User .DoesNotExist :
24
- return
25
- raise validators .ValidationError , _ ('A user with that username already exists.' )
26
-
27
- def save (self , new_data ):
28
- "Creates the user."
29
- return User .objects .create_user (new_data ['username' ], '' , new_data ['password1' ])
28
+ return username
29
+ raise forms .ValidationError (_ ("A user with that username already exists." ))
30
+
31
+ def clean_password2 (self ):
32
+ password1 = self .cleaned_data ["password1" ]
33
+ password2 = self .cleaned_data ["password2" ]
34
+ if password1 != password2 :
35
+ raise forms .ValidationError (_ ("The two password fields didn't match." ))
36
+ return password2
37
+
38
+ def save (self , commit = True ):
39
+ user = super (UserCreationForm , self ).save (commit = False )
40
+ user .set_password (self .cleaned_data ["password1" ])
41
+ if commit :
42
+ user .save ()
43
+ return user
30
44
31
- class AuthenticationForm (oldforms . Manipulator ):
45
+ class AuthenticationForm (forms . Form ):
32
46
"""
33
47
Base class for authenticating users. Extend this to get a form that accepts
34
48
username/password logins.
35
49
"""
36
- def __init__ (self , request = None ):
50
+ username = forms .CharField (max_length = 30 )
51
+ password = forms .CharField (max_length = 30 , widget = forms .PasswordInput )
52
+
53
+ def __init__ (self , request = None , * args , ** kwargs ):
37
54
"""
38
- If request is passed in, the manipulator will validate that cookies are
55
+ If request is passed in, the form will validate that cookies are
39
56
enabled. Note that the request (a HttpRequest object) must have set a
40
57
cookie with the key TEST_COOKIE_NAME and value TEST_COOKIE_VALUE before
41
- running this validator .
58
+ running this validation .
42
59
"""
43
60
self .request = request
44
- self .fields = [
45
- oldforms .TextField (field_name = "username" , length = 15 , max_length = 30 , is_required = True ,
46
- validator_list = [self .isValidUser , self .hasCookiesEnabled ]),
47
- oldforms .PasswordField (field_name = "password" , length = 15 , max_length = 30 , is_required = True ),
48
- ]
49
61
self .user_cache = None
50
-
51
- def hasCookiesEnabled (self , field_data , all_data ):
52
- if self .request and not self .request .session .test_cookie_worked ():
53
- raise validators .ValidationError , _ ("Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in." )
54
-
55
- def isValidUser (self , field_data , all_data ):
56
- username = field_data
57
- password = all_data .get ('password' , None )
58
- self .user_cache = authenticate (username = username , password = password )
59
- if self .user_cache is None :
60
- raise validators .ValidationError , _ ("Please enter a correct username and password. Note that both fields are case-sensitive." )
61
- elif not self .user_cache .is_active :
62
- raise validators .ValidationError , _ ("This account is inactive." )
63
-
62
+ super (AuthenticationForm , self ).__init__ (* args , ** kwargs )
63
+
64
+ def clean (self ):
65
+ username = self .cleaned_data .get ('username' )
66
+ password = self .cleaned_data .get ('password' )
67
+
68
+ if username and password :
69
+ self .user_cache = authenticate (username = username , password = password )
70
+ if self .user_cache is None :
71
+ raise forms .ValidationError (_ ("Please enter a correct username and password. Note that both fields are case-sensitive." ))
72
+ elif not self .user_cache .is_active :
73
+ raise forms .ValidationError (_ ("This account is inactive." ))
74
+
75
+ # TODO: determine whether this should move to its own method.
76
+ if self .request :
77
+ if not self .request .session .test_cookie_worked ():
78
+ raise forms .ValidationError (_ ("Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in." ))
79
+
80
+ return self .cleaned_data
81
+
64
82
def get_user_id (self ):
65
83
if self .user_cache :
66
84
return self .user_cache .id
67
85
return None
68
-
86
+
69
87
def get_user (self ):
70
88
return self .user_cache
71
89
72
- class PasswordResetForm (oldforms .Manipulator ):
73
- "A form that lets a user request a password reset"
74
- def __init__ (self ):
75
- self .fields = (
76
- oldforms .EmailField (field_name = "email" , length = 40 , is_required = True ,
77
- validator_list = [self .isValidUserEmail ]),
78
- )
79
-
80
- def isValidUserEmail (self , new_data , all_data ):
81
- "Validates that a user exists with the given e-mail address"
82
- self .users_cache = list (User .objects .filter (email__iexact = new_data ))
90
+ class PasswordResetForm (forms .Form ):
91
+ email = forms .EmailField (max_length = 40 )
92
+
93
+ def clean_email (self ):
94
+ """
95
+ Validates that a user exists with the given e-mail address.
96
+ """
97
+ email = self .cleaned_data ["email" ]
98
+ self .users_cache = User .objects .filter (email__iexact = email )
83
99
if len (self .users_cache ) == 0 :
84
- raise validators .ValidationError , _ ("That e-mail address doesn't have an associated user account. Are you sure you've registered?" )
85
-
100
+ raise forms .ValidationError ( _ ("That e-mail address doesn't have an associated user account. Are you sure you've registered?" ) )
101
+
86
102
def save (self , domain_override = None , email_template_name = 'registration/password_reset_email.html' ):
87
- "Calculates a new password randomly and sends it to the user"
103
+ """
104
+ Calculates a new password randomly and sends it to the user.
105
+ """
88
106
from django .core .mail import send_mail
89
107
for user in self .users_cache :
90
108
new_pass = User .objects .make_random_password ()
@@ -103,42 +121,69 @@ def save(self, domain_override=None, email_template_name='registration/password_
103
121
'domain' : domain ,
104
122
'site_name' : site_name ,
105
123
'user' : user ,
106
- }
107
- send_mail (_ ('Password reset on %s' ) % site_name , t .render (Context (c )), None , [user .email ])
124
+ }
125
+ send_mail (_ ("Password reset on %s" ) % site_name ,
126
+ t .render (Context (c )), None , [user .email ])
108
127
109
- class PasswordChangeForm (oldforms .Manipulator ):
110
- "A form that lets a user change his password."
111
- def __init__ (self , user ):
128
+ class PasswordChangeForm (forms .Form ):
129
+ """
130
+ A form that lets a user change his/her password.
131
+ """
132
+ old_password = forms .CharField (max_length = 30 , widget = forms .PasswordInput )
133
+ new_password1 = forms .CharField (max_length = 30 , widget = forms .PasswordInput )
134
+ new_password2 = forms .CharField (max_length = 30 , widget = forms .PasswordInput )
135
+
136
+ def __init__ (self , user , * args , ** kwargs ):
112
137
self .user = user
113
- self .fields = (
114
- oldforms .PasswordField (field_name = "old_password" , length = 30 , max_length = 30 , is_required = True ,
115
- validator_list = [self .isValidOldPassword ]),
116
- oldforms .PasswordField (field_name = "new_password1" , length = 30 , max_length = 30 , is_required = True ,
117
- validator_list = [validators .AlwaysMatchesOtherField ('new_password2' , _ ("The two 'new password' fields didn't match." ))]),
118
- oldforms .PasswordField (field_name = "new_password2" , length = 30 , max_length = 30 , is_required = True ),
119
- )
120
-
121
- def isValidOldPassword (self , new_data , all_data ):
122
- "Validates that the old_password field is correct."
123
- if not self .user .check_password (new_data ):
124
- raise validators .ValidationError , _ ("Your old password was entered incorrectly. Please enter it again." )
125
-
126
- def save (self , new_data ):
127
- "Saves the new password."
128
- self .user .set_password (new_data ['new_password1' ])
129
- self .user .save ()
130
-
131
- class AdminPasswordChangeForm (oldforms .Manipulator ):
132
- "A form used to change the password of a user in the admin interface."
133
- def __init__ (self , user ):
138
+ super (PasswordChangeForm , self ).__init__ (* args , ** kwargs )
139
+
140
+ def clean_old_password (self ):
141
+ """
142
+ Validates that the old_password field is correct.
143
+ """
144
+ old_password = self .cleaned_data ["old_password" ]
145
+ if not self .user .check_password (old_password ):
146
+ raise forms .ValidationError (_ ("Your old password was entered incorrectly. Please enter it again." ))
147
+ return old_password
148
+
149
+ def clean_new_password2 (self ):
150
+ password1 = self .cleaned_data .get ('new_password1' )
151
+ password2 = self .cleaned_data .get ('new_password2' )
152
+ if password1 and password2 :
153
+ if password1 != password2 :
154
+ raise forms .ValidationError (_ ("The two password fields didn't match." ))
155
+ return password2
156
+
157
+ def save (self , commit = True ):
158
+ self .user .set_password (self .cleaned_data ['new_password1' ])
159
+ if commit :
160
+ self .user .save ()
161
+ return self .user
162
+
163
+ class AdminPasswordChangeForm (forms .Form ):
164
+ """
165
+ A form used to change the password of a user in the admin interface.
166
+ """
167
+ password1 = forms .CharField (max_length = 60 , widget = forms .PasswordInput )
168
+ password2 = forms .CharField (max_length = 60 , widget = forms .PasswordInput )
169
+
170
+ def __init__ (self , user , * args , ** kwargs ):
134
171
self .user = user
135
- self .fields = (
136
- oldforms .PasswordField (field_name = 'password1' , length = 30 , max_length = 60 , is_required = True ),
137
- oldforms .PasswordField (field_name = 'password2' , length = 30 , max_length = 60 , is_required = True ,
138
- validator_list = [validators .AlwaysMatchesOtherField ('password1' , _ ("The two password fields didn't match." ))]),
139
- )
140
-
141
- def save (self , new_data ):
142
- "Saves the new password."
143
- self .user .set_password (new_data ['password1' ])
144
- self .user .save ()
172
+ super (AdminPasswordChangeForm , self ).__init__ (* args , ** kwargs )
173
+
174
+ def clean_password2 (self ):
175
+ password1 = self .cleaned_data .get ('password1' )
176
+ password2 = self .cleaned_data .get ('password2' )
177
+ if password1 and password2 :
178
+ if password1 != password2 :
179
+ raise forms .ValidationError (_ ("The two password fields didn't match." ))
180
+ return password2
181
+
182
+ def save (self , commit = True ):
183
+ """
184
+ Saves the new password.
185
+ """
186
+ self .user .set_password (self .cleaned_data ["password1" ])
187
+ if commit :
188
+ self .user .save ()
189
+ return self .user
0 commit comments