users can update their password in their profile

This commit is contained in:
Élie Bouttier 2014-09-04 21:51:22 -07:00
parent f420dd98ac
commit 2f3d75fc3e
4 changed files with 72 additions and 11 deletions

View file

@ -19,13 +19,38 @@ class TestViews(TestCase):
response = self.client.get(reverse('profile')) response = self.client.get(reverse('profile'))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.client.post(reverse('profile'), { response = self.client.post(reverse('profile'), {
'update-profile': '',
'first_name': 'newfirstname', 'first_name': 'newfirstname',
'notifications': User.NOTIFICATIONS_OTHERS, 'notifications': User.NOTIFICATIONS_OTHERS,
}, follow=True) }, follow=True)
self.assertRedirects(response, reverse('profile')) self.assertRedirects(response, reverse('profile'))
self.assertContains(response, 'successfully') self.assertContains(response, 'Profile updated successfully')
user = User.objects.get(username='admin') user = User.objects.get(username='admin')
self.assertEqual(user.first_name, 'newfirstname') self.assertEqual(user.first_name, 'newfirstname')
with self.settings(EXTERNAL_AUTH=True):
response = self.client.get(reverse('profile'))
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, 'update-password')
response = self.client.post(reverse('profile'), {
'update-password': '',
'old_password': 'admin',
'new_password1': 'newpassword',
'new_password2': 'newpassword',
}, follow=True)
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, 'successfully')
user = User.objects.get(username='admin')
self.assertFalse(user.check_password('newpassword'))
response = self.client.post(reverse('profile'), {
'update-password': '',
'old_password': 'admin',
'new_password1': 'newpassword',
'new_password2': 'newpassword',
}, follow=True)
self.assertRedirects(response, reverse('login')+'?next='+reverse('profile'))
self.assertContains(response, 'Password updated successfully')
user = User.objects.get(username='admin')
self.assertTrue(user.check_password('newpassword'))
# Users # Users

View file

@ -3,7 +3,7 @@ from django.conf.urls import url, include
urlpatterns = [ urlpatterns = [
# Profile # Profile
url(r'^profile$', 'accounts.views.profile', name='profile'), url(r'^profile/$', 'accounts.views.profile', name='profile'),
# Users # Users
url(r'^admin/users/$', 'accounts.views.user_list', name='list-user'), url(r'^admin/users/$', 'accounts.views.user_list', name='list-user'),
url(r'^admin/users/add/$', 'accounts.views.user_edit', name='add-user'), url(r'^admin/users/add/$', 'accounts.views.user_edit', name='add-user'),

View file

@ -6,6 +6,7 @@ from django.contrib import messages
from django.db.models import Q from django.db.models import Q
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.conf import settings from django.conf import settings
from django.contrib.auth.forms import PasswordChangeForm
from django.http import Http404, HttpResponse, JsonResponse from django.http import Http404, HttpResponse, JsonResponse
@ -21,13 +22,31 @@ from accounts.forms import *
@login_required @login_required
def profile(request): def profile(request):
form = ProfileForm(request.POST or None, instance=request.user) profileform = None
if request.method == 'POST' and form.is_valid(): passwordform = None
form.save()
if request.method == 'POST':
if 'update-profile' in request.POST:
profileform = ProfileForm(request.POST, instance=request.user)
if profileform.is_valid():
profileform.save()
messages.success(request, 'Profile updated successfully.') messages.success(request, 'Profile updated successfully.')
return redirect('profile') return redirect('profile')
elif 'update-password' in request.POST and not settings.EXTERNAL_AUTH:
passwordform = PasswordChangeForm(user=request.user, data=request.POST)
if passwordform.is_valid():
passwordform.save()
messages.success(request, 'Password updated successfully.')
return redirect('profile')
if not profileform:
profileform = ProfileForm(None, instance=request.user)
if not passwordform and not settings.EXTERNAL_AUTH:
passwordform = PasswordChangeForm(None)
return render(request, 'accounts/profile.html', { return render(request, 'accounts/profile.html', {
'form': form, 'profileform': profileform,
'passwordform': passwordform,
}) })

View file

@ -13,19 +13,36 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3>Your profile</h3> <h3>Update profile</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<form method="post" class="col-md-4" role="form"> <form method="post" class="col-md-4" role="form">
{% csrf_token %} {% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form profileform %}
<div class="form-group"> <div class="form-group">
<button type="submit" class="btn btn-primary">Update</button> <button type="submit" name='update-profile' class="btn btn-primary">Update</button>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
{% if passwordform %}
<div class="panel panel-default">
<div class="panel-heading">
<h3>Update password</h3>
</div>
<div class="panel-body">
<form method="post" class="col-md-4" role="form">
{% csrf_token %}
{% bootstrap_form passwordform %}
<div class="form-group">
<button type="submit" name='update-password' class="btn btn-primary">Update</button>
</div>
</form>
</div>
</div>
{% endif %}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3>Your groups</h3> <h3>Your groups</h3>