Skip to content
Snippets Groups Projects
Unverified Commit ddb46b8f authored by Todd Dembrey's avatar Todd Dembrey Committed by GitHub
Browse files

Merge pull request #20 from OpenTechFund/feature/21-22-user-login-password-reset

User: login, password change and reset
parents b59259be 4e0b82c1
No related branches found
No related tags found
No related merge requests found
Showing with 191 additions and 11 deletions
......@@ -5,5 +5,5 @@ from .users import urls as users_urls
urlpatterns = [
url(r'^apply/', include(funds_urls)),
url(r'^user/', include(users_urls))
url(r'^account/', include(users_urls, namespace='users')),
]
{% extends 'base.html' %}
{% load i18n %}
{% block title %}Account{% endblock %}
{% block content %}
<h2>Welcome {{ user }}</h2>
{% if show_change_password %}
<a href="{% url 'users:password_change' %}">{% trans "Change password" %}</a>
{% endif %}
{% endblock %}
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Change password" %}{% endblock %}
{% block content %}
{% if form.non_field_errors %}
<div class="messages">
<ul>
{% for error in form.non_field_errors %}
<li class="error">{{ error }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% if form.errors %}
<div class="messages">
{% blocktrans count counter=form.errors.items|length %}
Please correct the error below.
{% plural %}
Please correct the errors below.
{% endblocktrans %}
</div>
{% endif %}
<form action="{% url 'users:password_change' %}" method="POST" novalidate>
{% csrf_token %}
{% for field in form %}
{{ field.errors }}
{{ field.label_tag }}
{{ field }}
{% endfor %}
<button type="submit">{% trans 'Reset password' %}</button>
</form>
{% endblock %}
{% extends "base.html" %}
{% load i18n %}
{% block title %}{% trans "Reset password" %}{% endblock %} {% block content %}
<h1>{% trans "Password change successful" %}</h1>
<p>
<a href="{% url 'users:login' %}">{% trans "Log in" %}</a>
</p>
{% endblock %}
{% extends "base.html" %}
{% load i18n %}
{% block content %}
<form method="post" novalidate>
{% csrf_token %}
<h1>{% trans "Set your new password" %}</h1>
<ul class="fields">
<li>
<div class="field">
{{ form.new_password1.label_tag }} {{ form.new_password1 }}
</div>
</li>
<li>
<div class="field">
{{ form.new_password2.label_tag }} {{ form.new_password2 }}
</div>
</li>
<li class="submit">
<button type="submit">{% trans 'Reset password' %}</button>
</li>
</ul>
</form>
{% endblock %}
{% extends "base.html" %}
{% load i18n %}
{% block title %}{% trans "Reset password" %}{% endblock %}
{% block content %}
<h1>{% trans "Check your email" %}</h1>
<p>{% trans "A link to reset your password has been emailed to you." %}</p>
{% endblock %}
{% load i18n wagtailadmin_tags %}{% base_url_setting as base_url %}
{% trans "Please follow the link below to reset your password:" %}
{% if base_url %}{{ base_url }}{% else %}{{ protocol }}://{{ domain }}{% endif %}{% url 'users:password_reset_confirm' uidb64=uid token=token %}
{% if user.USERNAME_FIELD != "email" %}
{% trans "Your username (in case you've forgotten):" %} {{ user.get_username }}
{% endif %}
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Reset password" %}{% endblock %}
{% block content %}
{% if form.non_field_errors %}
<div class="messages">
<ul>
{% for error in form.non_field_errors %}
<li class="error">{{ error }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<form method="post">
{% csrf_token %}
{{ form.email.label_tag }}
{{ form.email }}
<button type="submit">{% trans 'Reset password' %}</button>
</form>
{% endblock %}
from django.conf.urls import url
from django.contrib.auth import views as auth_views
from django.urls import reverse_lazy
from opentech.apply.users.views import account
urlpatterns = [
# TODO replace with dashboard view with a login_required decorator
url(r'^$', auth_views.login, {
'template_name': 'users/login.html'
}, name='user'),
url(r'^login$', auth_views.login, {
'template_name': 'users/login.html'
}, name='login'),
url(r'^$', account, name='account'),
url(
r'^login/$',
auth_views.LoginView.as_view(
template_name='users/login.html',
redirect_authenticated_user=True
),
name='login'
),
# Log out
url(r'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'),
url(r'^logout/$', auth_views.LogoutView.as_view(next_page='/'), name='logout'),
# Password change
url(
r'^password/$',
auth_views.PasswordChangeView.as_view(
template_name="users/change_password.html",
success_url=reverse_lazy('users:account')
),
name='password_change',
),
# Password reset
url(r'^reset/$', auth_views.PasswordResetView.as_view(
template_name='users/password_reset/form.html',
email_template_name='users/password_reset/email.txt',
success_url=reverse_lazy('users:password_reset_done')
)),
url(
r'^reset/done/$',
auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset/done.html'),
name='password_reset_done'
),
url(
r'^reset/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
auth_views.PasswordResetConfirmView.as_view(
template_name='users/password_reset/confirm.html',
post_reset_login=True,
success_url=reverse_lazy('users:account')
),
name='password_reset_confirm'
),
url(
r'^reset/complete/$',
auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset/complete.html'),
name='password_reset_complete'
),
]
# Views placeholder.
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.urls import reverse_lazy
from wagtail.wagtailadmin.views.account import password_management_enabled
@login_required(login_url=reverse_lazy('users:login'))
def account(request):
"Account page placeholder view"
return render(request, 'users/account.html', {
'show_change_password': password_management_enabled() and request.user.has_usable_password(),
})
......@@ -181,6 +181,7 @@ MEDIA_URL = '/media/'
AUTH_USER_MODEL = 'users.User'
# TODO populate me with the dashboard URL when ready
LOGIN_URL = 'users:login'
LOGIN_REDIRECT_URL = '/'
# Logging
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment