+
|
+
{% blocktrans %}Dear {{ username }},{% endblocktrans %}
+{% blocktrans with domain=site.domain %}You -- or someone pretending to be you -- has requested a password reset on {{ domain }}.{% endblocktrans %}
+{% trans "You can set your new password by following this link:" %} http{% if secure %}s{% endif %}://{{ site.domain }}{% url "password_reset_reset" token %}
+{% trans "If you don't want to reset your password, simply ignore this email and it will stay unchanged." %}
+{% endblock content %} \ No newline at end of file diff --git a/password_reset/templates/password_reset/recovery_email.txt b/password_reset/templates/password_reset/recovery_email.txt index 9c4af9cc..70b1af2a 100644 --- a/password_reset/templates/password_reset/recovery_email.txt +++ b/password_reset/templates/password_reset/recovery_email.txt @@ -7,3 +7,7 @@ http{% if secure %}s{% endif %}://{{ site.domain }}{% url "password_reset_reset" token %} {% trans "If you don't want to reset your password, simply ignore this email and it will stay unchanged." %} + +{% trans "Yours Truly" %}, +{% trans "Administrator" %} +{{ site.domain }} diff --git a/password_reset/templates/password_reset/recovery_form.html b/password_reset/templates/password_reset/recovery_form.html index e0aff0ca..4e152c0f 100644 --- a/password_reset/templates/password_reset/recovery_form.html +++ b/password_reset/templates/password_reset/recovery_form.html @@ -4,9 +4,42 @@ {% block title %}{% trans "Password recovery" %}{% endblock %} {% block content %} - -{% endblock %} +{% blocktrans with ago=timestamp|timesince %}An email was sent to {{ email }} {{ ago }} ago. Use the link in it to set a new password.{% endblocktrans %}
+{% trans "The email for this registered user is invalid, password reset information cannot be sent. Please contact our administrator for assistance." %}
+ +{% trans "Return to Main Page" %} + +{% endblock %} diff --git a/password_reset/tests/settings.py b/password_reset/tests/settings.py index 42b01387..c68658b1 100644 --- a/password_reset/tests/settings.py +++ b/password_reset/tests/settings.py @@ -9,12 +9,12 @@ }, } -INSTALLED_APPS = ( +INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'password_reset', 'password_reset.tests', -) +] MIDDLEWARE = [] diff --git a/password_reset/tests/tests.py b/password_reset/tests/tests.py index cad8ddaa..7af52569 100644 --- a/password_reset/tests/tests.py +++ b/password_reset/tests/tests.py @@ -1,15 +1,26 @@ -from unittest import SkipTest - -from django.contrib.auth import get_user_model +import django from django.core import mail -from django.core.urlresolvers import reverse +from password_reset.compat.urls import reverse from django.test import TestCase from django.test.utils import override_settings from django.utils import timezone from django.utils.six import with_metaclass +try: + from django.utils.unittest import SkipTest +except ImportError: + from unittest import SkipTest -from ..forms import PasswordRecoveryForm, PasswordResetForm +from ..forms import PasswordRecoveryForm, PasswordResetForm, error_messages from .models import CustomUser, ExtensionUser +from ..compat import get_user_model + +if django.VERSION < (1, 6): + COLON_SUFFIX = '' # Django 1.5 or lower do NOT auto add colon suffix +else: + COLON_SUFFIX = ':' # Django 1.6 or higher auto add colon suffix + +# Test manually via ./manage.py test --settings password_reset.tests.settings +# password_test.tests class CustomUserVariants(type): @@ -50,7 +61,7 @@ def test_username_input(self): form = PasswordRecoveryForm(data={'username_or_email': 'inexisting'}) self.assertFalse(form.is_valid()) self.assertEqual(form.errors['username_or_email'], - ["Sorry, this user doesn't exist."]) + [error_messages['not_found']]) create_user() @@ -122,7 +133,7 @@ def test_form_custom_search(self): }, search_fields=['email']) self.assertFalse(form.is_valid()) self.assertEqual(form.errors['username_or_email'], - ["Sorry, this user doesn't exist."]) + [error_messages['not_found']]) user = create_user() @@ -131,7 +142,7 @@ def test_form_custom_search(self): }, search_fields=['email']) self.assertFalse(form.is_valid()) self.assertEqual(form.errors['username_or_email'], - ["Sorry, this user doesn't exist."]) + [error_messages['not_found']]) # Search by actual email works form = PasswordRecoveryForm(data={ @@ -151,7 +162,7 @@ def test_form_custom_search(self): }, search_fields=['username']) self.assertFalse(form.is_valid()) self.assertEqual(form.errors['username_or_email'], - ["Sorry, this user doesn't exist."]) + [error_messages['not_found']]) form = PasswordRecoveryForm(data={ 'username_or_email': 'username', @@ -270,7 +281,8 @@ def test_email_recover(self): url = reverse('email_recover') response = self.client.get(url) self.assertNotContains(response, "Username or Email") - self.assertContains(response, "Email:") + + self.assertContains(response, "Email%s" % COLON_SUFFIX) response = self.client.post(url, {'username_or_email': 'foo'}) try: @@ -286,6 +298,8 @@ def test_email_recover(self): url, {'username_or_email': 'bar@example.com'}, follow=True, ) self.assertEqual(len(mail.outbox), 1) + self.assertEqual(len(mail.outbox[0].alternatives), 1) + self.assertEqual(mail.outbox[0].alternatives[0][1], 'text/html') self.assertEqual(len(response.redirect_chain), 1) self.assertContains(response, 'bar@example.com') @@ -297,7 +311,7 @@ def test_username_recover(self): response = self.client.get(url) self.assertNotContains(response, "Username or Email") - self.assertContains(response, "Username:") + self.assertContains(response, "Username%s" % COLON_SUFFIX) response = self.client.post(url, {'username_or_email': 'bar@example.com'}) diff --git a/password_reset/tests/urls.py b/password_reset/tests/urls.py index 25832f3d..edc07682 100644 --- a/password_reset/tests/urls.py +++ b/password_reset/tests/urls.py @@ -1,8 +1,13 @@ -from django.conf.urls import url +from django.conf.urls import url, include from ..urls import urlpatterns from . import views +try: + import captcha as captcha_installed +except: + captcha_installed = None + urlpatterns += [ url(r'^email_recover/$', views.email_recover, name='email_recover'), url(r'^username_recover/$', views.username_recover, @@ -10,3 +15,8 @@ url(r'^insensitive_recover/$', views.insensitive_recover, name='insensitive_recover'), ] + +if captcha_installed: + urlpatterns += [ + url(r'^captcha/', include('captcha.urls')), + ] diff --git a/password_reset/urls.py b/password_reset/urls.py index eedad198..7b4817d9 100644 --- a/password_reset/urls.py +++ b/password_reset/urls.py @@ -6,6 +6,8 @@ urlpatterns = [ url(r'^recover/(?P