From aa19dc9347e8ea61eaa9d2a8594582e58c95a0c4 Mon Sep 17 00:00:00 2001 From: heinzel Date: Thu, 18 Jan 2018 23:02:03 +0100 Subject: [PATCH] auth stuff. --- dav_events/forms.py | 68 ++++++++++++++++++- dav_events/models.py | 2 +- .../templates/dav_events/auth/login_form.html | 29 ++++++++ .../dav_events/auth/set_password_form.html | 29 ++++++++ .../dav_events/includes/login_widget.html | 6 +- dav_events/urls.py | 3 + dav_events/views.py | 30 ++++++-- 7 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 dav_events/templates/dav_events/auth/login_form.html create mode 100644 dav_events/templates/dav_events/auth/set_password_form.html diff --git a/dav_events/forms.py b/dav_events/forms.py index e705f28..18b2637 100644 --- a/dav_events/forms.py +++ b/dav_events/forms.py @@ -5,6 +5,7 @@ import logging from babel.dates import format_date from django import forms +from django.contrib.auth import forms as auth_forms, password_validation from django.core.exceptions import ImproperlyConfigured from django.utils.translation import get_language, ugettext, ugettext_lazy as _ from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget @@ -18,6 +19,67 @@ logger = logging.getLogger(__name__) DEVELOPMENT_INIT_FORMS = True +class LoginForm(auth_forms.AuthenticationForm): + username = auth_forms.UsernameField( + max_length=254, + label=_(u'E-Mail-Adresse'), + widget=forms.TextInput(attrs={'autofocus': True, + 'placeholder': ''}), + ) + password = forms.CharField( + label=_(u'Passwort'), + widget=forms.PasswordInput(attrs={'placeholder': ''}), + ) + + error_messages = { + 'invalid_login': _(u'Benutzername oder Passwort falsch.'), + 'inactive': _("This account is inactive."), + } + + def clean_username(self): + username = self.cleaned_data.get('username') + return username.lower() + + +class SetPasswordForm(forms.Form): + new_password = forms.CharField(max_length=12, + label=_(u'Neues Passwort'), + widget=forms.PasswordInput(attrs={'placeholder': ''})) + new_password_repeat = forms.CharField(max_length=12, + label=_(u'Neues Passwort wiederholen'), + widget=forms.PasswordInput(attrs={'placeholder': ''})) + send_password_mail = forms.BooleanField(required=False, + label=_(u'Neues Passwort per E-Mail zusenden'), + ) + + def __init__(self, user, *args, **kwargs): + self.user = user + super(SetPasswordForm, self).__init__(*args, **kwargs) + + def clean_new_password(self): + password = self.cleaned_data.get('new_password') + password_validation.validate_password(password, self.user) + return password + + def clean_new_password_repeat(self): + password1 = self.cleaned_data.get('new_password') + password2 = self.cleaned_data.get('new_password_repeat') + if password1 and password2: + if password1 != password2: + raise forms.ValidationError( + ugettext(u'Passwörter stimmen nicht überein'), + code='password_mismatch', + ) + return password2 + + def save(self, commit=True): + new_password = self.cleaned_data.get('new_password') + self.user.set_password(new_password) + if commit: + self.user.save() + return self.user + + class ChainedForm(forms.Form): _next_form_name = None @@ -722,6 +784,7 @@ class ChargesForm(EventCreateForm): additional_costs = forms.CharField(required=False, max_length=config.ADDITIONAL_COSTS_MAX_LENGTH, label=_(u'Zusätzliche Kosten (Text)'), + help_text=_(u'Kann freigelassen werden'), ) def _proceed_session_data(self, session_data): @@ -823,7 +886,7 @@ class ChargesForm(EventCreateForm): participation_fee = 25 participation_day_fee = 25 - additional_costs_text = ugettext(u'zzgl. Fahrtkosten') + additional_costs_text = ugettext(u'Fahrtkosten') if last_day: timedelta = last_day - first_day @@ -844,6 +907,9 @@ class ChargesForm(EventCreateForm): trainer_reward += orga_day_fee / 2 charge += participation_day_fee / 2 + if charge > 0: + additional_costs_text = u'%s %s' % (ugettext(u'zzgl.'), additional_costs_text) + self.fields['charge_key'].initial = charge_key self.fields['orga_fee'].initial = orga_fee self.fields['pre_meeting_fee'].initial = pre_meeting_fee diff --git a/dav_events/models.py b/dav_events/models.py index 0696c1e..fdb3cfa 100644 --- a/dav_events/models.py +++ b/dav_events/models.py @@ -144,7 +144,7 @@ class Event(models.Model): try: owner = user_model.objects.get(username=self.trainer_email) except user_model.DoesNotExist: - owner = user_model(username=self.trainer_email, + owner = user_model(username=self.trainer_email.lower(), first_name=self.trainer_firstname, last_name=self.trainer_familyname, email=self.trainer_email, diff --git a/dav_events/templates/dav_events/auth/login_form.html b/dav_events/templates/dav_events/auth/login_form.html new file mode 100644 index 0000000..7ade341 --- /dev/null +++ b/dav_events/templates/dav_events/auth/login_form.html @@ -0,0 +1,29 @@ +{% extends "dav_events/base.html" %} +{% load i18n %} +{% load bootstrap3 %} + +{% block head-title %}{% trans 'Login' %} - {{ block.super }}{% endblock head-title %} + +{% block page-container %} +
+
+   +
+
+

{% trans 'Login' %}

+
+
+ {% csrf_token %} + {% bootstrap_form form %} + {% buttons %} + + {% trans 'Abbrechen' %} + {% endbuttons %} +
+
+
+
+   +
+
+{% endblock page-container %} diff --git a/dav_events/templates/dav_events/auth/set_password_form.html b/dav_events/templates/dav_events/auth/set_password_form.html new file mode 100644 index 0000000..7eebb46 --- /dev/null +++ b/dav_events/templates/dav_events/auth/set_password_form.html @@ -0,0 +1,29 @@ +{% extends "dav_events/base.html" %} +{% load i18n %} +{% load bootstrap3 %} + +{% block head-title %}{% trans 'Neues Passwort setzen' %} - {{ user }} - {{ block.super }}{% endblock head-title %} + +{% block page-container %} +
+
+   +
+
+

{% trans 'Neues Passwort setzen' %}

+
+
+ {% csrf_token %} + {% bootstrap_form form %} + {% buttons %} + + {% trans 'Abbrechen' %} + {% endbuttons %} +
+
+
+
+   +
+
+{% endblock page-container %} diff --git a/dav_events/templates/dav_events/includes/login_widget.html b/dav_events/templates/dav_events/includes/login_widget.html index 3b23645..0d757db 100644 --- a/dav_events/templates/dav_events/includes/login_widget.html +++ b/dav_events/templates/dav_events/includes/login_widget.html @@ -1,3 +1,4 @@ +{% load i18n %} {% if user.is_authenticated %} {% else %} -Login +{% trans 'Login' %} {% endif %} diff --git a/dav_events/urls.py b/dav_events/urls.py index 2767f7c..f56ce9c 100644 --- a/dav_events/urls.py +++ b/dav_events/urls.py @@ -5,6 +5,9 @@ from . import views urlpatterns = [ url(r'^$', views.HomeView.as_view(), name='home'), url(r'^imprint$', views.ImprintView.as_view(), name='imprint'), + url(r'^user/login$', views.LoginView.as_view(), name='login'), + url(r'^user/logout$', views.LogoutView.as_view(), name='logout'), + url(r'^user/password$', views.SetPasswordView.as_view(), name='set_password'), url(r'^events$', views.EventListView.as_view(), name='event_list'), url(r'^events/create$', views.EventCreateView.as_view(), name='event_create'), url(r'^events/(?P\d+)/accept', views.EventAcceptView.as_view(), name='event_accept'), diff --git a/dav_events/views.py b/dav_events/views.py index 93f00bf..50623d9 100644 --- a/dav_events/views.py +++ b/dav_events/views.py @@ -1,10 +1,12 @@ import logging import os -from django.contrib.auth import login +from django.contrib.auth import login, views as auth_views +from django.contrib.auth.decorators import login_required from django.core.exceptions import SuspiciousOperation from django.http import HttpResponseRedirect from django.urls import reverse, reverse_lazy +from django.utils.decorators import method_decorator from django.views import generic from . import forms @@ -21,6 +23,26 @@ class ImprintView(generic.TemplateView): template_name = 'dav_events/imprint.html' +class LoginView(auth_views.LoginView): + form_class = forms.LoginForm + next_page = reverse_lazy('dav_events:event_list') + template_name = 'dav_events/auth/login_form.html' + + def get_success_url(self): + url = self.get_redirect_url() + return url or self.next_page + + +class LogoutView(auth_views.LogoutView): + next_page = reverse_lazy('dav_events:home') + + +class SetPasswordView(auth_views.PasswordChangeView): + form_class = forms.SetPasswordForm + template_name = 'dav_events/auth/set_password_form.html' + success_url = reverse_lazy('dav_events:event_list') + + class EventListView(generic.ListView): model = models.Event queryset = models.Event.objects.all() @@ -90,15 +112,13 @@ class EventCreateView(generic.FormView): event.save() owner = event.owner self.clean_session_data() - if self.request.user.is_authenticated(): + if self.request.user.is_authenticated: next_url = reverse('dav_events:event_list') elif owner.has_usable_password(): next_url = reverse('dav_events:event_list') else: - # owner has no usable password, so he must be new. - # let him set his password. login(self.request, owner) - next_url = reverse('dav_events:home') + next_url = reverse('dav_events:set_password', kwargs={'pk': owner.pk}) return HttpResponseRedirect(next_url) def clean_session_data(self, session=None):