LIL-70 Added reset password

remotes/origin/hasaccess
Sergey G 8 years ago
parent ff306d2378
commit 702418b1d6
  1. 2
      apps/auth/templates/auth/password_reset.html
  2. 12
      apps/auth/templates/auth/password_reset_confirm.html
  3. 1
      apps/auth/templates/auth/password_reset_subject.txt
  4. 20
      apps/auth/tests/test_password_reset.py
  5. 4
      apps/auth/urls.py
  6. 39
      apps/auth/views.py

@ -0,0 +1,2 @@
Someone asked for password reset for email {{ email }}. Follow the link below:
{{ protocol}}://{{ domain }}{% url 'lilcity:password_reset_confirm' uidb64=uid token=token %}

@ -0,0 +1,12 @@
{% if validlink %}
<h3>Change password</h3>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Change password</button>
</form>
{% else %}
<p>
The password reset link was invalid, possibly because it has already been used.
Please request a new password reset.
</p>

@ -0,0 +1,20 @@
from django.test import TestCase, Client
from django.urls import reverse
from django.core import mail
from django.contrib.auth import get_user_model
User = get_user_model()
class PasswordResetTest(TestCase):
def setUp(self):
self.url = reverse("lilcity:password_reset")
self.user = User.objects.create_user(username='Alice', email="example@example.com", password='1234')
self.client = Client()
def test_send_email_when_password_reset(self):
response = self.client.post(self.url, {"email": "example@example.com"})
self.assertEqual(True, response.json()["success"])
self.assertEqual(len(mail.outbox), 1)

@ -7,4 +7,8 @@ urlpatterns = [
path('logout/', views.LogoutView.as_view(), name="logout"), path('logout/', views.LogoutView.as_view(), name="logout"),
path('login/', views.LoginView.as_view(), name="login"), path('login/', views.LoginView.as_view(), name="login"),
path('verification-email/<slug:token>/', views.VerificationEmailView.as_view(), name="verification-email"), path('verification-email/<slug:token>/', views.VerificationEmailView.as_view(), name="verification-email"),
path('password_reset/', views.PasswordResetView.as_view(), name="password_reset"),
path('password_reset_confirm/<slug:uidb64>/<slug:token>/', views.PasswordResetConfirmView.as_view(), name="password_reset_confirm"),
path('password_reset_complete/', views.PasswordResetComplete.as_view(), name='password_reset_complete'),
] ]

@ -1,7 +1,9 @@
from django.contrib.auth import get_user_model, logout, login from django.contrib.auth import get_user_model, logout, login, views
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
from django.http import JsonResponse from django.http import JsonResponse
from django.views.generic import FormView, View from django.views.generic import FormView, View
from django.views.generic.edit import BaseFormView
from django.urls import reverse_lazy
from .forms import LearnerRegistrationForm from .forms import LearnerRegistrationForm
from .tokens import verification_email_token from .tokens import verification_email_token
@ -63,3 +65,38 @@ class VerificationEmailView(View):
return JsonResponse({"success": True}) return JsonResponse({"success": True})
else: else:
return JsonResponse({"success": False}, status=400) return JsonResponse({"success": False}, status=400)
class PasswordResetView(views.PasswordContextMixin, BaseFormView):
email_template_name = "auth/password_reset.html"
subject_template_name = "auth/password_reset_subject.txt"
form_class = views.PasswordResetForm
extra_email_context = None
from_email = None
html_email_template_name = None
title = 'Password reset'
token_generator = views.default_token_generator
def form_valid(self, form):
opts = {
'use_https': self.request.is_secure(),
'token_generator': self.token_generator,
'from_email': self.from_email,
'email_template_name': self.email_template_name,
'subject_template_name': self.subject_template_name,
'request': self.request,
'html_email_template_name': self.html_email_template_name,
'extra_email_context': self.extra_email_context,
}
form.save(**opts)
return JsonResponse({"success": True})
class PasswordResetConfirmView(views.PasswordResetConfirmView):
template_name = "auth/password_reset_confirm.html"
success_url = reverse_lazy('lilcity:password_reset_complete')
class PasswordResetComplete(views.PasswordResetCompleteView):
pass

Loading…
Cancel
Save