auth stuff.
This commit is contained in:
@@ -5,6 +5,7 @@ import logging
|
|||||||
from babel.dates import format_date
|
from babel.dates import format_date
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
|
from django.contrib.auth import forms as auth_forms, password_validation
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.utils.translation import get_language, ugettext, ugettext_lazy as _
|
from django.utils.translation import get_language, ugettext, ugettext_lazy as _
|
||||||
from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget
|
from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget
|
||||||
@@ -18,6 +19,67 @@ logger = logging.getLogger(__name__)
|
|||||||
DEVELOPMENT_INIT_FORMS = True
|
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):
|
class ChainedForm(forms.Form):
|
||||||
_next_form_name = None
|
_next_form_name = None
|
||||||
|
|
||||||
@@ -722,6 +784,7 @@ class ChargesForm(EventCreateForm):
|
|||||||
additional_costs = forms.CharField(required=False,
|
additional_costs = forms.CharField(required=False,
|
||||||
max_length=config.ADDITIONAL_COSTS_MAX_LENGTH,
|
max_length=config.ADDITIONAL_COSTS_MAX_LENGTH,
|
||||||
label=_(u'Zusätzliche Kosten (Text)'),
|
label=_(u'Zusätzliche Kosten (Text)'),
|
||||||
|
help_text=_(u'Kann freigelassen werden'),
|
||||||
)
|
)
|
||||||
|
|
||||||
def _proceed_session_data(self, session_data):
|
def _proceed_session_data(self, session_data):
|
||||||
@@ -823,7 +886,7 @@ class ChargesForm(EventCreateForm):
|
|||||||
participation_fee = 25
|
participation_fee = 25
|
||||||
participation_day_fee = 25
|
participation_day_fee = 25
|
||||||
|
|
||||||
additional_costs_text = ugettext(u'zzgl. Fahrtkosten')
|
additional_costs_text = ugettext(u'Fahrtkosten')
|
||||||
|
|
||||||
if last_day:
|
if last_day:
|
||||||
timedelta = last_day - first_day
|
timedelta = last_day - first_day
|
||||||
@@ -844,6 +907,9 @@ class ChargesForm(EventCreateForm):
|
|||||||
trainer_reward += orga_day_fee / 2
|
trainer_reward += orga_day_fee / 2
|
||||||
charge += participation_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['charge_key'].initial = charge_key
|
||||||
self.fields['orga_fee'].initial = orga_fee
|
self.fields['orga_fee'].initial = orga_fee
|
||||||
self.fields['pre_meeting_fee'].initial = pre_meeting_fee
|
self.fields['pre_meeting_fee'].initial = pre_meeting_fee
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ class Event(models.Model):
|
|||||||
try:
|
try:
|
||||||
owner = user_model.objects.get(username=self.trainer_email)
|
owner = user_model.objects.get(username=self.trainer_email)
|
||||||
except user_model.DoesNotExist:
|
except user_model.DoesNotExist:
|
||||||
owner = user_model(username=self.trainer_email,
|
owner = user_model(username=self.trainer_email.lower(),
|
||||||
first_name=self.trainer_firstname,
|
first_name=self.trainer_firstname,
|
||||||
last_name=self.trainer_familyname,
|
last_name=self.trainer_familyname,
|
||||||
email=self.trainer_email,
|
email=self.trainer_email,
|
||||||
|
|||||||
29
dav_events/templates/dav_events/auth/login_form.html
Normal file
29
dav_events/templates/dav_events/auth/login_form.html
Normal file
@@ -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 %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<h2>{% trans 'Login' %}</h2>
|
||||||
|
<div class="well">
|
||||||
|
<form action="" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% bootstrap_form form %}
|
||||||
|
{% buttons %}
|
||||||
|
<button type="submit" class="btn btn-success">{% trans 'Login' %}</button>
|
||||||
|
<a class="btn btn-danger" href="{% url 'dav_events:home' %}">{% trans 'Abbrechen' %}</a>
|
||||||
|
{% endbuttons %}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock page-container %}
|
||||||
29
dav_events/templates/dav_events/auth/set_password_form.html
Normal file
29
dav_events/templates/dav_events/auth/set_password_form.html
Normal file
@@ -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 %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<h2>{% trans 'Neues Passwort setzen' %}</h2>
|
||||||
|
<div class="well">
|
||||||
|
<form action="" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% bootstrap_form form %}
|
||||||
|
{% buttons %}
|
||||||
|
<button type="submit" class="btn btn-success">{% trans 'Neues Passwort setzen' %}</button>
|
||||||
|
<a class="btn btn-danger" href="{% url 'dav_events:home' %}">{% trans 'Abbrechen' %}</a>
|
||||||
|
{% endbuttons %}
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock page-container %}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
{% load i18n %}
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<button type="button" id="user_dropdown_button" class="btn btn-default btn-sm dropdown-toggle"
|
<button type="button" id="user_dropdown_button" class="btn btn-default btn-sm dropdown-toggle"
|
||||||
@@ -5,9 +6,10 @@
|
|||||||
{{ user }} <span class="caret"></span>
|
{{ user }} <span class="caret"></span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="user_dropdown_button">
|
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="user_dropdown_button">
|
||||||
<li><a href="">Logout</a></li>
|
<li><a href="{% url 'dav_events:set_password' %}">{% trans 'Passwort ändern' %}</a></li>
|
||||||
|
<li><a href="{% url 'dav_events:logout' %}">{% trans 'Logout' %}</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a class="btn btn-default btn-sm" disabled="disabled" href="">Login</a>
|
<a class="btn btn-default btn-sm" href="{% url 'dav_events:login' %}">{% trans 'Login' %}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ from . import views
|
|||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^$', views.HomeView.as_view(), name='home'),
|
url(r'^$', views.HomeView.as_view(), name='home'),
|
||||||
url(r'^imprint$', views.ImprintView.as_view(), name='imprint'),
|
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$', views.EventListView.as_view(), name='event_list'),
|
||||||
url(r'^events/create$', views.EventCreateView.as_view(), name='event_create'),
|
url(r'^events/create$', views.EventCreateView.as_view(), name='event_create'),
|
||||||
url(r'^events/(?P<pk>\d+)/accept', views.EventAcceptView.as_view(), name='event_accept'),
|
url(r'^events/(?P<pk>\d+)/accept', views.EventAcceptView.as_view(), name='event_accept'),
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
import logging
|
import logging
|
||||||
import os
|
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.core.exceptions import SuspiciousOperation
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.urls import reverse, reverse_lazy
|
from django.urls import reverse, reverse_lazy
|
||||||
|
from django.utils.decorators import method_decorator
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
|
||||||
from . import forms
|
from . import forms
|
||||||
@@ -21,6 +23,26 @@ class ImprintView(generic.TemplateView):
|
|||||||
template_name = 'dav_events/imprint.html'
|
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):
|
class EventListView(generic.ListView):
|
||||||
model = models.Event
|
model = models.Event
|
||||||
queryset = models.Event.objects.all()
|
queryset = models.Event.objects.all()
|
||||||
@@ -90,15 +112,13 @@ class EventCreateView(generic.FormView):
|
|||||||
event.save()
|
event.save()
|
||||||
owner = event.owner
|
owner = event.owner
|
||||||
self.clean_session_data()
|
self.clean_session_data()
|
||||||
if self.request.user.is_authenticated():
|
if self.request.user.is_authenticated:
|
||||||
next_url = reverse('dav_events:event_list')
|
next_url = reverse('dav_events:event_list')
|
||||||
elif owner.has_usable_password():
|
elif owner.has_usable_password():
|
||||||
next_url = reverse('dav_events:event_list')
|
next_url = reverse('dav_events:event_list')
|
||||||
else:
|
else:
|
||||||
# owner has no usable password, so he must be new.
|
|
||||||
# let him set his password.
|
|
||||||
login(self.request, owner)
|
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)
|
return HttpResponseRedirect(next_url)
|
||||||
|
|
||||||
def clean_session_data(self, session=None):
|
def clean_session_data(self, session=None):
|
||||||
|
|||||||
Reference in New Issue
Block a user