Files
django-dav-events/dav_auth/views.py
Jens Kleineheismann d7e2acff34 Replaced ugettext and ugettext_lazy with gettext and gettext_lazy
ugettext and ugettext_lazy were deprecated in Django 3 and will be
removed in Django 4.
2025-04-10 11:33:06 +02:00

106 lines
4.2 KiB
Python

# -*- coding: utf-8 -*-
import logging
from django.apps import apps
from django.core.exceptions import ValidationError
from django.contrib import messages
from django.contrib.auth import views as auth_views, get_user_model
from django.contrib.auth.password_validation import validate_password
from django.http import HttpResponseRedirect
from django.shortcuts import resolve_url
from django.urls import reverse_lazy, reverse
from django.utils.safestring import mark_safe
from django.utils.translation import gettext as _
from django.views import generic
from . import emails
from . import forms
app_config = apps.get_containing_app_config(__package__)
logger = logging.getLogger(__name__)
class LoginView(auth_views.LoginView):
form_class = forms.LoginForm
template_name = 'dav_auth/forms/login.html'
def get_redirect_url(self):
url = super().get_redirect_url()
if not url and app_config.settings.login_redirect_url:
url = resolve_url(app_config.settings.login_redirect_url)
return url
def form_valid(self, form):
r = super().form_valid(form)
messages.success(self.request, _('Benutzer angemeldet: %(username)s') % {'username': form.get_user()})
try:
validate_password(form.cleaned_data['password'])
except ValidationError as e:
logger.warning('Weak password (%d): %s', self.request.user.pk, e)
message = '<br />\n<p>\n'
message += 'Dein Passwort entspricht nicht mehr den aktuellen Passwortrichtlinien.<br />\n'
message += 'Bitte hilf uns die Daten deiner Teilnehmer zu schützen und ändere dein Passwort.<br />\n'
message += '</p>\n'
message += '<p>\n'
message += '<a href="%(href)s">Passwort ändern</a>\n' % {'href': reverse('dav_auth:set_password')}
message += '</p>\n<br />\n'
messages.warning(self.request, mark_safe(message))
return r
class LogoutView(auth_views.LogoutView):
def get_next_page(self):
url = super().get_next_page()
if not url and app_config.settings.logout_redirect_url:
url = resolve_url(app_config.settings.logout_redirect_url)
return url
def dispatch(self, request, *args, **kwargs):
r = super().dispatch(request, *args, **kwargs)
messages.success(self.request, _('Benutzer abgemeldet.'))
return r
class SetPasswordView(auth_views.PasswordChangeView):
form_class = forms.SetPasswordForm
template_name = 'dav_auth/forms/set_password.html'
def get_success_url(self):
return resolve_url(app_config.settings.login_redirect_url)
def form_valid(self, form):
r = super().form_valid(form)
messages.success(self.request, _('Passwort gespeichert.'))
logger.info('Changed Password for user \'%s\'', self.request.user)
if form.cleaned_data.get('send_password_mail', False):
email = emails.PasswordSetEmail(self.request.user, form.cleaned_data['new_password'])
email.send()
return r
class CreateAndSendPasswordView(generic.FormView):
form_class = forms.CreateAndSendPasswordForm
template_name = 'dav_auth/forms/recreate_password.html'
success_url = reverse_lazy('dav_auth:login')
def form_valid(self, form):
username = form.cleaned_data.get('username')
user_model = get_user_model()
try:
user = user_model.objects.get(username=username)
random_password = user_model.objects.make_random_password(length=32)
user.set_password(random_password)
user.save()
email = emails.PasswordSetEmail(user, random_password)
email.send()
messages.success(self.request, _('Neues Passwort versendet.'))
logger.info('Password recreated for user \'%s\'', username)
except user_model.DoesNotExist:
logger.warning('Password recreated for unknown user \'%s\'', username)
return super().form_valid(form)
def get(self, request, *args, **kwargs):
if request.user.is_authenticated:
return HttpResponseRedirect(reverse('dav_auth:set_password'))
return super().get(request, *args, **kwargs)