From 1039bab157a170d4cfbb0d3938381e284fc6fe9c Mon Sep 17 00:00:00 2001 From: Sofia Papagiannaki Date: Tue, 31 Jul 2012 16:38:15 +0300 Subject: [PATCH] Optionally renew token on password reset Refs: #2612 --- snf-astakos-app/astakos/im/forms.py | 22 +++++++++++++++++++++- snf-astakos-app/astakos/im/urls.py | 5 +++-- snf-astakos-app/astakos/im/views.py | 4 +++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/snf-astakos-app/astakos/im/forms.py b/snf-astakos-app/astakos/im/forms.py index f1152f4..78cd01f 100644 --- a/snf-astakos-app/astakos/im/forms.py +++ b/snf-astakos-app/astakos/im/forms.py @@ -35,7 +35,8 @@ from datetime import datetime from django import forms from django.utils.translation import ugettext as _ -from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, PasswordResetForm +from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, \ + PasswordResetForm, PasswordChangeForm from django.core.mail import send_mail from django.contrib.auth.tokens import default_token_generator from django.template import Context, loader @@ -466,3 +467,22 @@ class InvitationForm(forms.ModelForm): except Invitation.DoesNotExist: pass return username + +class ExtendedPasswordChangeForm(PasswordChangeForm): + """ + Extends PasswordChangeForm by enabling user + to optionally renew also the token. + """ + renew = forms.BooleanField(label='Renew token', required=False) + + def __init__(self, user, *args, **kwargs): + super(ExtendedPasswordChangeForm, self).__init__(user, *args, **kwargs) + print self.fields.keyOrder + + def save(self, commit=True): + user = super(ExtendedPasswordChangeForm, self).save(commit=False) + if self.cleaned_data.get('renew'): + user.renew_token() + if commit: + user.save() + return user \ No newline at end of file diff --git a/snf-astakos-app/astakos/im/urls.py b/snf-astakos-app/astakos/im/urls.py index 99386a0..69b07bb 100644 --- a/snf-astakos-app/astakos/im/urls.py +++ b/snf-astakos-app/astakos/im/urls.py @@ -34,7 +34,7 @@ from django.conf.urls.defaults import patterns, include, url from django.contrib.auth.views import password_change -from astakos.im.forms import ExtendedPasswordResetForm, LoginForm +from astakos.im.forms import ExtendedPasswordResetForm, ExtendedPasswordChangeForm, LoginForm from astakos.im.settings import IM_MODULES, INVITATIONS_ENABLED, EMAILCHANGE_ENABLED urlpatterns = patterns('astakos.im.views', @@ -73,7 +73,8 @@ if 'local' in IM_MODULES: url(r'^local/reset/confirm/(?P[0-9A-Za-z]+)-(?P.+)/?$', 'password_reset_confirm'), url(r'^local/password/reset/complete/?$', 'password_reset_complete'), - url(r'^password_change/?$', 'password_change', {'post_change_redirect':'profile'}) + url(r'^password_change/?$', 'password_change', {'post_change_redirect':'profile', + 'password_change_form':ExtendedPasswordChangeForm}) ) if INVITATIONS_ENABLED: diff --git a/snf-astakos-app/astakos/im/views.py b/snf-astakos-app/astakos/im/views.py index b2f7763..904b821 100644 --- a/snf-astakos-app/astakos/im/views.py +++ b/snf-astakos-app/astakos/im/views.py @@ -532,7 +532,9 @@ def approval_terms(request, term_id=None, template_name='im/approval_terms.html' @signed_terms_required def change_password(request): - return password_change(request, post_change_redirect=reverse('astakos.im.views.edit_profile')) + return password_change(request, + post_change_redirect=reverse('astakos.im.views.edit_profile'), + password_change_form=ExtendedPasswordChangeForm) @transaction.commit_manually def change_email(request, activation_key=None, -- 1.7.10.4