Skip to content

Commit 7207329

Browse files
committed
Add the 'new account' link in the left sidebar.
Change urls from registration to account. Fixes ietf-tools#719 - Legacy-Id: 3553
1 parent c370ad0 commit 7207329

16 files changed

Lines changed: 223 additions & 175 deletions
Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from django import forms
66
from django.conf import settings
77
from django.contrib.auth.models import User
8-
from django.contrib.auth.forms import PasswordResetForm
98
from django.contrib.sites.models import Site
109
from django.utils.translation import ugettext, ugettext_lazy as _
1110

@@ -35,10 +34,10 @@ def send_email(self):
3534
'today': today,
3635
'realm': self.realm,
3736
'auth': auth,
38-
'to_email': to_email,
37+
'username': to_email,
3938
'expire': settings.DAYS_TO_EXPIRE_REGISTRATION_LINK,
4039
}
41-
send_mail(None, to_email, from_email, subject, 'registration/register_email.txt', context)
40+
send_mail(None, to_email, from_email, subject, 'registration/creation_email.txt', context)
4241

4342
def clean_email(self):
4443
email = self.cleaned_data.get('email', '')
@@ -49,26 +48,29 @@ def clean_email(self):
4948
return email
5049

5150

52-
class RecoverPasswordForm(PasswordResetForm):
51+
class RecoverPasswordForm(RegistrationForm):
5352

5453
realm = 'IETF'
5554

56-
def save(self):
55+
def send_email(self):
5756
domain = Site.objects.get_current().domain
5857
subject = 'Password recovery at %s' % domain
5958
from_email = settings.DEFAULT_FROM_EMAIL
6059
today = datetime.date.today().strftime('%Y%m%d')
61-
for user in self.users_cache:
62-
to_email = self.cleaned_data["email"]
63-
recovery_hash = hashlib.md5('%s%s%s%s%s' % (settings.SECRET_KEY, today, user.username, user.password, self.realm)).hexdigest()
64-
context = {'domain': domain,
65-
'username': user.username,
66-
'recovery_hash': recovery_hash,
67-
'today': today,
68-
'realm': self.realm,
69-
'expire': settings.DAYS_TO_EXPIRE_RECOVER_LINK,
70-
}
71-
send_mail(None, to_email, from_email, subject, 'registration/password_recovery_email.txt', context)
60+
to_email = self.cleaned_data["email"]
61+
auth = hashlib.md5('%s%s%s%s' % (settings.SECRET_KEY, today, to_email, self.realm)).hexdigest()
62+
context = {'domain': domain,
63+
'today': today,
64+
'realm': self.realm,
65+
'auth': auth,
66+
'username': to_email,
67+
'expire': settings.DAYS_TO_EXPIRE_REGISTRATION_LINK,
68+
}
69+
send_mail(None, to_email, from_email, subject, 'registration/password_reset_email.txt', context)
70+
71+
def clean_email(self):
72+
email = self.cleaned_data.get('email', '')
73+
return email
7274

7375

7476
class PasswordForm(forms.Form):

ietf/ietfauth/urls.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
# Copyright The IETF Trust 2007, 2009, All Rights Reserved
22

3-
from django.conf.urls.defaults import patterns
3+
from django.conf.urls.defaults import patterns, url
44
from ietf.ietfauth import views
55

66
urlpatterns = patterns('',
7+
(r'^$', views.index, None, 'account_index'),
78
(r'^login/$', views.ietf_login),
89
(r'^loggedin/$', views.ietf_loggedin),
910
(r'^profile/$', views.profile),
1011
# (r'^login/(?P<user>[a-z0-9.@]+)/(?P<passwd>.+)$', views.url_login),
1112
)
13+
14+
urlpatterns += patterns('ietf.ietfauth.views',
15+
url(r'^create/$', 'create_account', name='create_account'),
16+
url(r'^confirm/(?P<username>[\w.@+-]+)/(?P<date>[\d]+)/(?P<realm>[\w]+)/(?P<registration_hash>[a-f0-9]+)/$', 'confirm_account', name='confirm_account'),
17+
url(r'^reset/$', 'password_reset_view', name='password_reset'),
18+
url(r'^reset/confirm/(?P<username>[\w.@+-]+)/(?P<date>[\d]+)/(?P<realm>[\w]+)/(?P<reset_hash>[a-f0-9]+)/$', 'confirm_password_reset', name='confirm_password_reset'),
19+
url(r'^ajax/check_username/$', 'ajax_check_username', name='ajax_check_username'),
20+
)

ietf/ietfauth/views.py

Lines changed: 102 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,36 @@
3232

3333
# Copyright The IETF Trust 2007, All Rights Reserved
3434

35-
from django.template import RequestContext
36-
from django.shortcuts import render_to_response
37-
from django.contrib.auth.decorators import login_required
38-
from django.http import HttpResponseRedirect, HttpResponse
35+
import datetime
36+
import hashlib
37+
38+
from django.conf import settings
3939
from django.contrib.auth import REDIRECT_FIELD_NAME, authenticate, login
40+
from django.contrib.auth.decorators import login_required
4041
from django.contrib.auth.models import User
41-
from django.conf import settings
42+
from django.http import HttpResponseRedirect, HttpResponse, Http404
43+
from django.shortcuts import render_to_response
44+
from django.template import RequestContext
45+
from django.utils import simplejson
4246
from django.utils.http import urlquote
4347

48+
from ietf.ietfauth.forms import (RegistrationForm, PasswordForm,
49+
RecoverPasswordForm)
50+
51+
52+
def index(request):
53+
return render_to_response('registration/index.html', context_instance=RequestContext(request))
54+
55+
4456
def url_login(request, user, passwd):
4557
user = authenticate(username=user, password=passwd)
4658
redirect_to = request.REQUEST.get(REDIRECT_FIELD_NAME, '')
4759
if user is not None:
4860
if user.is_active:
4961
login(request, user)
5062
return HttpResponseRedirect('/accounts/loggedin/?%s=%s' % (REDIRECT_FIELD_NAME, urlquote(redirect_to)))
51-
return HttpResponse("Not authenticated?", status=500)
63+
return HttpResponse("Not authenticated?", status=500)
64+
5265

5366
def ietf_login(request):
5467
if not request.user.is_authenticated():
@@ -58,6 +71,7 @@ def ietf_login(request):
5871
request.session.set_test_cookie()
5972
return HttpResponseRedirect('/accounts/loggedin/?%s=%s' % (REDIRECT_FIELD_NAME, urlquote(redirect_to)))
6073

74+
6175
def ietf_loggedin(request):
6276
if not request.session.test_cookie_worked():
6377
return HttpResponse("You need to enable cookies")
@@ -66,24 +80,102 @@ def ietf_loggedin(request):
6680
if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
6781
redirect_to = settings.LOGIN_REDIRECT_URL
6882
return HttpResponseRedirect(redirect_to)
69-
83+
84+
7085
@login_required
7186
def profile(request):
7287
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
7388
from person.models import Person
7489
from group.models import Role
75-
90+
7691
roles = []
7792
person = None
7893
try:
7994
person = request.user.get_profile()
8095
roles = Role.objects.filter(email__person=person).distinct()
8196
except Person.DoesNotExist:
8297
pass
83-
98+
8499
return render_to_response('registration/profileREDESIGN.html',
85100
dict(roles=roles,
86101
person=person),
87102
context_instance=RequestContext(request))
88-
103+
89104
return render_to_response('registration/profile.html', context_instance=RequestContext(request))
105+
106+
107+
def create_account(request):
108+
success = False
109+
if request.method == 'POST':
110+
form = RegistrationForm(request.POST)
111+
if form.is_valid():
112+
form.save()
113+
success = True
114+
else:
115+
form = RegistrationForm()
116+
return render_to_response('registration/create.html',
117+
{'form': form,
118+
'success': success},
119+
context_instance=RequestContext(request))
120+
121+
122+
def confirm_account(request, username, date, realm, registration_hash):
123+
valid = hashlib.md5('%s%s%s%s' % (settings.SECRET_KEY, date, username, realm)).hexdigest() == registration_hash
124+
if not valid:
125+
raise Http404
126+
request_date = datetime.date(int(date[:4]), int(date[4:6]), int(date[6:]))
127+
if datetime.date.today() > (request_date + datetime.timedelta(days=settings.DAYS_TO_EXPIRE_REGISTRATION_LINK)):
128+
raise Http404
129+
success = False
130+
if request.method == 'POST':
131+
form = PasswordForm(request.POST, username=username)
132+
if form.is_valid():
133+
form.save()
134+
success = True
135+
else:
136+
form = PasswordForm(username=username)
137+
return render_to_response('registration/confirm.html',
138+
{'form': form, 'email': username, 'success': success},
139+
context_instance=RequestContext(request))
140+
141+
142+
def password_reset_view(request):
143+
success = False
144+
if request.method == 'POST':
145+
form = RecoverPasswordForm(request.POST)
146+
if form.is_valid():
147+
form.save()
148+
success = True
149+
else:
150+
form = RecoverPasswordForm()
151+
return render_to_response('registration/password_reset.html',
152+
{'form': form,
153+
'success': success},
154+
context_instance=RequestContext(request))
155+
156+
157+
def confirm_password_reset(request, username, date, realm, reset_hash):
158+
valid = hashlib.md5('%s%s%s%s' % (settings.SECRET_KEY, date, username, realm)).hexdigest() == reset_hash
159+
if not valid:
160+
raise Http404
161+
success = False
162+
if request.method == 'POST':
163+
form = PasswordForm(request.POST, update_user=True, username=username)
164+
if form.is_valid():
165+
form.save()
166+
success = True
167+
else:
168+
form = PasswordForm(username=username)
169+
return render_to_response('registration/change_password.html',
170+
{'form': form,
171+
'success': success,
172+
'username': username},
173+
context_instance=RequestContext(request))
174+
175+
176+
def ajax_check_username(request):
177+
username = request.GET.get('username', '')
178+
error = False
179+
if User.objects.filter(username=username).count():
180+
error = 'This email is already in use'
181+
return HttpResponse(simplejson.dumps({'error': error}), mimetype='text/plain')

ietf/registration/__init__.py

Whitespace-only changes.

ietf/registration/urls.py

Lines changed: 0 additions & 10 deletions
This file was deleted.

ietf/registration/views.py

Lines changed: 0 additions & 91 deletions
This file was deleted.

ietf/templates/base_leftmenu.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
{% load wg_menu %}
3636
{% load ietf_filters community_tags %}
3737
<ul>
38+
<li class="sect first">Accounts</li>
39+
<li><a href="{% url account_index %}">New Account</a></li>
3840
{% if user|in_group:"Area_Director" %}
3941
<li class="sect first">AD Dashboard</li>
4042
<li><a href="{% url doc_search_by_ad name=user.get_profile.person.full_name_as_key %}">My Documents</a></li>

ietf/templates/registration/confirm_register.html renamed to ietf/templates/registration/confirm.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@
66
<div id="confirm_register_page">
77
<h1>Confirm registration</h1>
88
{% if success %}
9-
<p>Your email {{ email }} has been registered using the password you have select.</p>
9+
<p>Your account with login name '{{ email }}' has been created, using the password you have select.</p>
1010
<p>Now you can <a href="{% url ietfauth.views.ietf_login %}">sign in</a></p>
1111
{% else %}
12-
<p>Hello, the registration for {{ email }} is almost complete. Please, select a password.</p>
12+
<p>In order to complete the setup of your account with login name '{{ email }}', please, set a password:</p>
1313
<form action="" method="POST">
1414
<table class="register-form">
1515
{{ form }}
1616
</table>
1717
<div class="submit_row">
18-
<input type="submit" value="Register" />
18+
<input type="submit" value="Set Password" />
1919
</div>
2020
</form>
2121
{% endif %}

0 commit comments

Comments
 (0)