From 094fe62c11afbfbb87af0c320935f816ef8a758e Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 7 Jul 2023 16:08:55 +0200 Subject: đŸ’„ update password form: improve layout - redirect to start page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ishtar_common/forms_common.py | 35 +++++++++++++++++++-- .../registration/password_change_done.html | 8 ----- .../registration/password_change_form.html | 36 +++++++++++++++++----- ishtar_common/urls_registration.py | 4 --- ishtar_common/views.py | 7 ++++- 5 files changed, 66 insertions(+), 24 deletions(-) delete mode 100644 ishtar_common/templates/registration/password_change_done.html (limited to 'ishtar_common') diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index ce7f81f34..9e29f35e1 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2010-2016 Étienne Loks @@ -31,9 +31,12 @@ import zipfile from django import forms from django.conf import settings +from django.contrib.auth import password_validation from django.contrib.auth.models import User -from django.contrib.auth.forms import AuthenticationForm as AuthAuthenticationForm, \ - UsernameField +from django.contrib.auth.forms import UsernameField, \ + AuthenticationForm as AuthAuthenticationForm, \ + PasswordChangeForm as AuthPasswordChangeForm, \ + SetPasswordForm as AuthSetPasswordForm from django.contrib.contenttypes.models import ContentType from django.core import validators from django.core.cache import cache @@ -149,6 +152,32 @@ class AuthenticationForm(AuthAuthenticationForm): ) +class SetPasswordForm(AuthSetPasswordForm): + new_password1 = forms.CharField( + label=_("New password"), + strip=False, + help_text=password_validation.password_validators_help_text_html(), + widget=forms.PasswordInput(attrs={'autocomplete': 'off', + 'data-toggle': 'password'}), + ) + new_password2 = forms.CharField( + label=_("New password confirmation"), + strip=False, + widget=forms.PasswordInput(attrs={'autocomplete': 'off', + 'data-toggle': 'password'}), + ) + + +class PasswordChangeForm(SetPasswordForm, AuthPasswordChangeForm): + old_password = forms.CharField( + label=_("Old password"), + strip=False, + widget=forms.PasswordInput(attrs={'autofocus': True, 'autocomplete': 'off', + 'data-toggle': 'password'}), + + ) + + class NewItemForm(forms.Form): def __init__(self, *args, **kwargs): self.limits = {} diff --git a/ishtar_common/templates/registration/password_change_done.html b/ishtar_common/templates/registration/password_change_done.html deleted file mode 100644 index 9d442360c..000000000 --- a/ishtar_common/templates/registration/password_change_done.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} - -{% block content %} -
-

{% trans "Password changed" %}

-
-{% endblock %} diff --git a/ishtar_common/templates/registration/password_change_form.html b/ishtar_common/templates/registration/password_change_form.html index 84d915eaa..deb7af503 100644 --- a/ishtar_common/templates/registration/password_change_form.html +++ b/ishtar_common/templates/registration/password_change_form.html @@ -2,13 +2,33 @@ {% load i18n %} {% block content %} -
-
{% csrf_token %} - - {{ form.as_table }} +
+
+
+

{% trans "Change password" %}

+ {% csrf_token %} + {% if form.non_field_errors %} +
+ {% for error in form.non_field_errors %} +
+ {{error}} +
+ {% endfor %} +
+ {% endif %} + {% with force_large_col=True %} + {% for field in form %} + {% include "blocks/bs_field_snippet.html" %} + {% endfor %} + {% endwith %} -
-
-
-

+
+
+ +
+
+ +
+ + {% endblock %} diff --git a/ishtar_common/urls_registration.py b/ishtar_common/urls_registration.py index 29d0055d7..085af2f87 100644 --- a/ishtar_common/urls_registration.py +++ b/ishtar_common/urls_registration.py @@ -40,12 +40,8 @@ urlpatterns = [ # url("^accounts/", include('django.contrib.auth.urls')), path('accounts/login/', views.LoginView.as_view(), name='login'), path('accounts/logout/', views.LogoutView.as_view(), name='logout'), - path('accounts/password_change/', views.PasswordChangeView.as_view(), name='password_change'), - path('accounts/password_change/done/', auth_views.PasswordChangeDoneView.as_view(), - name='password_change_done'), - path('accounts/password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'), path('accounts/password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'), diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 3f060f2e1..c10da588a 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -30,6 +30,7 @@ import urllib.parse from django.apps import apps from django.conf import settings +from django.contrib import messages from django.contrib.auth import logout from django.contrib.auth.decorators import login_required from django.contrib.auth.views import redirect_to_login, LoginView as AuthLoginView, \ @@ -67,7 +68,7 @@ from archaeological_warehouse.models import Warehouse from ishtar_common import forms_common as forms from ishtar_common import wizards from ishtar_common.data_importer import ImporterError -from ishtar_common.forms import FinalForm, FinalDeleteForm +from ishtar_common.forms import FinalForm, FinalDeleteForm, reverse_lazy from ishtar_common.models import get_current_profile from ishtar_common.templatetags.link_to_window import simple_link_to_window from ishtar_common.utils import ( @@ -200,9 +201,13 @@ def update_password_last_update(user): class PasswordChangeView(AuthPasswordChangeView): + form_class = forms.PasswordChangeForm + success_url = reverse_lazy('start') + def form_valid(self, form): returned = super().form_valid(form) update_password_last_update(form.user) + messages.add_message(self.request, messages.INFO, _("Password changed")) return returned -- cgit v1.2.3