mostly auth stuff.

This commit is contained in:
2018-01-19 16:16:39 +01:00
parent b72b5a519f
commit 3f9cc11dbd
9 changed files with 174 additions and 48 deletions

View File

@@ -1,5 +1,14 @@
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
# Auth Config
MANAGE_ALL_GROUP = 'Tourenreferenten'
MANAGE_W_GROUP = 'Wanderreferenten'
MANAGE_S_GROUP = 'Skireferenten'
MANAGE_M_GROUP = 'MTBReferenten'
MANAGE_K_GROUP = 'Kletterreferenten'
MANAGE_B_GROUP = 'Bergsteigerreferenten'
# Form Config
COMMON_CHAR_FIELD_LENGTH = 250 COMMON_CHAR_FIELD_LENGTH = 250
TITLE_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH TITLE_MAX_LENGTH = COMMON_CHAR_FIELD_LENGTH

View File

@@ -23,6 +23,8 @@ STATIC_ROOT = os.path.join(BASE_VAR_DIR, 'www', 'static')
LANGUAGE_CODE = 'de' LANGUAGE_CODE = 'de'
LOGIN_URL = 'dav_events:login'
BOOTSTRAP3 = { BOOTSTRAP3 = {
'set_placeholder': False, 'set_placeholder': False,
} }

View File

@@ -635,8 +635,8 @@ class RegistrationForm(EventCreateForm):
label=_(u'Anmeldeschluss'), label=_(u'Anmeldeschluss'),
widget=forms.RadioSelect()) widget=forms.RadioSelect())
deadline_month = forms.CharField(widget=forms.HiddenInput()) deadline_month = forms.DateField(widget=forms.HiddenInput())
deadline_quarter = forms.CharField(widget=forms.HiddenInput()) deadline_quarter = forms.DateField(widget=forms.HiddenInput())
deadline_other = forms.DateField(required=False, deadline_other = forms.DateField(required=False,
label=_(u'Anderer Anmeldeschluss'), label=_(u'Anderer Anmeldeschluss'),
@@ -793,6 +793,8 @@ class ChargesForm(EventCreateForm):
first_day = session_data.get('first_day', None) first_day = session_data.get('first_day', None)
arrival_previous_day = session_data.get('arrival_previous_day', False) arrival_previous_day = session_data.get('arrival_previous_day', False)
last_day = session_data.get('last_day', None) last_day = session_data.get('last_day', None)
transport = session_data.get('transport', None)
accommodation = session_data.get('accommodation', None)
pre_meeting_1 = session_data.get('pre_meeting_1', None) pre_meeting_1 = session_data.get('pre_meeting_1', None)
pre_meeting_2 = session_data.get('pre_meeting_2', None) pre_meeting_2 = session_data.get('pre_meeting_2', None)
@@ -821,14 +823,20 @@ class ChargesForm(EventCreateForm):
else: else:
charge_key = 'J' charge_key = 'J'
additional_costs_text = ugettext(u'Fahrtkosten') additional_costs_text = u''
if transport != 'NONE':
additional_costs_text += ugettext(u'Fahrtkosten')
if last_day: if last_day:
timedelta = last_day - first_day timedelta = last_day - first_day
ndays = timedelta.days + 1 ndays = timedelta.days + 1
additional_costs_text += ugettext(u', Unterkunft und Verpflegung') if accommodation != 'NONE':
if additional_costs_text:
additional_costs_text += u', '
additional_costs_text += ugettext(u'Unterkunft und Verpflegung')
else: else:
ndays = 1 ndays = 1
if pre_meeting_2: if pre_meeting_2:
n_pre_meetings = 2 n_pre_meetings = 2
elif pre_meeting_1: elif pre_meeting_1:
@@ -851,9 +859,6 @@ class ChargesForm(EventCreateForm):
trainer_reward += fees['trainer_day_fee'] / 2.0 trainer_reward += fees['trainer_day_fee'] / 2.0
charge += fees['participant_day_fee'] / 2.0 charge += fees['participant_day_fee'] / 2.0
if charge > 0:
additional_costs_text = u'%s %s' % (ugettext(u'zzgl.'), additional_costs_text)
self.fields['charge_key'].initial = fees['description'] or charge_key self.fields['charge_key'].initial = fees['description'] or charge_key
self.fields['trainer_fee'].initial = fees['trainer_fee'] self.fields['trainer_fee'].initial = fees['trainer_fee']
self.fields['pre_meeting_fee'].initial = fees['pre_meeting_fee'] self.fields['pre_meeting_fee'].initial = fees['pre_meeting_fee']

View File

@@ -14,11 +14,11 @@ CHOICE_FIELD_MAX_LENGTH = 25
def get_ghost_user(): def get_ghost_user():
return get_user_model().objects.get_or_create(username='deleted')[0] return get_user_model().objects.get_or_create(username='-deleted-')[0]
class Event(models.Model): class Event(models.Model):
# Meta # Metadata
owner = models.ForeignKey(settings.AUTH_USER_MODEL, owner = models.ForeignKey(settings.AUTH_USER_MODEL,
null=True, null=True,
on_delete=models.SET(get_ghost_user), on_delete=models.SET(get_ghost_user),
@@ -142,7 +142,7 @@ class Event(models.Model):
notify = True notify = True
user_model = get_user_model() user_model = get_user_model()
try: try:
owner = user_model.objects.get(username=self.trainer_email) owner = user_model.objects.get(username=self.trainer_email.lower())
except user_model.DoesNotExist: except user_model.DoesNotExist:
owner = user_model(username=self.trainer_email.lower(), owner = user_model(username=self.trainer_email.lower(),
first_name=self.trainer_firstname, first_name=self.trainer_firstname,

View File

@@ -36,13 +36,13 @@
<div id="page-body"> <div id="page-body">
{% block page-body %} {% block page-body %}
<div class="container">
{% block page-container %}
{% endblock page-container %}
</div>
<div class="container-fluid"> <div class="container-fluid">
{% block page-container-fluid %} {% block page-container-fluid %}
{% endblock page-container-fluid %} {% endblock page-container-fluid %}
</div>
<div class="container">
{% block page-container %}
{% endblock page-container %}
</div> </div>
{% endblock page-body %} {% endblock page-body %}
</div> </div>

View File

@@ -2,7 +2,7 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<span class="panel-title">{{ sport|upper }}XX/{{ first_day|date:'y' }} - {{ title }}</span> <span class="panel-title">{{ sport|upper }}**/{{ first_day|date:'y' }} - {{ title }}</span>
</div> </div>
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item"> <li class="list-group-item">
@@ -101,7 +101,7 @@
{% endif %} {% endif %}
{% if meeting_point and meeting_point != 'NONE' %} {% if meeting_point and meeting_point != 'NONE' %}
<strong>{% trans 'Treffpunkt' %}:</strong> <strong>{% trans 'Treffpunkt' %}:</strong>
{% if meeting_time %}{{ meeting_time }} Uhr, {% endif %} {% if meeting_time %}{{ meeting_time|time:'G:i'|cut:':00' }} Uhr, {% endif %}
{% if meeting_point == 'OTHER' %} {% if meeting_point == 'OTHER' %}
{{ meeting_point_other }} {{ meeting_point_other }}
{% else %} {% else %}
@@ -111,10 +111,10 @@
{% endif %} {% endif %}
{% if pre_meeting_1 %} {% if pre_meeting_1 %}
{% if pre_meeting_2 %} {% if pre_meeting_2 %}
<strong>{% trans 'Vortreffen' %} 1:</strong> {{ pre_meeting_1|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br /> <strong>{% trans 'Vortreffen' %} 1:</strong> {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br />
<strong>{% trans 'Vortreffen' %} 2:</strong> {{ pre_meeting_2|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br /> <strong>{% trans 'Vortreffen' %} 2:</strong> {{ pre_meeting_2|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br />
{% else %} {% else %}
<strong>{% trans 'Vortreffen' %}:</strong> {{ pre_meeting_1|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br /> <strong>{% trans 'Vortreffen' %}:</strong> {{ pre_meeting_1|date:'l, d. F Y, G:i'|cut:':00' }} {% trans 'Uhr' %}, DAV {% trans 'Sektionszentrum' %}<br />
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if min_participants > 0 or max_participants > 0 %} {% if min_participants > 0 or max_participants > 0 %}
@@ -134,6 +134,7 @@
{{ charge|floatformat:'-2' }} € {% trans 'Teilnahmegebühr' %} {{ charge|floatformat:'-2' }} € {% trans 'Teilnahmegebühr' %}
{% endif %} {% endif %}
{% if additional_costs %} {% if additional_costs %}
{% if charge > 0 %}{% trans 'zzgl.' %}{% endif %}
{{ additional_costs }} {{ additional_costs }}
{% endif %} {% endif %}
<br /> <br />

View File

@@ -3,32 +3,53 @@
{% block head-title %}{{ event.title }} - {{ block.super }}{% endblock head-title %} {% block head-title %}{{ event.title }} - {{ block.super }}{% endblock head-title %}
{% block page-container-fluid %}
<div class="action-tabs">
<ul class="nav nav-tabs" role="tablist">
<li>
<a href="{% url 'dav_events:event_list' %}">{% trans 'Veranstaltungsliste' %}</a>
</li>
<li class="active">
<a href="{% url 'dav_events:event_detail' event.pk %}">{% trans 'Details' %}</a>
</li>
<li class="{% if not has_permission_accept or event.accepted %}disabled{% endif %}">
<a class="{% if has_permission_accept and not event.accepted %}btn-success{% endif %}"
href="{% url 'dav_events:event_accept' event.pk %}">{% trans 'Freigeben' %}</a>
</li>
<li class="disabled">
<a href="{% url 'dav_events:event_detail' event.pk %}">{% trans 'Ändern' %}</a>
</li>
<li class="disabled">
<a href="{% url 'dav_events:event_detail' event.pk %}"
title="{% trans 'Diese Veranstaltung als Vorlage für eine neue Veranstaltung benutzen' %}">{% trans 'Kopieren' %}</a>
</li>
</ul>
</div>
{% endblock page-container-fluid %}
{% block page-container %} {% block page-container %}
<div class="row"> <div class="row">
<div class="col-sm-10"> <div class="col-sm-12">
{{ event.render_as_html }} {{ event.render_as_html }}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-body"> <div class="panel-body">
<strong>{% trans 'Eingereicht' %}:</strong> {{ event.created_at|date:'l, d. F Y, H:i' }} Uhr <div class="row">
</div> <div class="col-sm-2">
<strong>{% trans 'Eingereicht' %}:</strong>
</div> </div>
<div class="col-sm-7">
{{ event.created_at|date:'l, d. F Y, H:i' }} Uhr
</div> </div>
<div class="col-sm-2"> <div class="col-sm-2">
<ul class="list-group">
<li class="list-group-item"><strong>Status</strong></li>
{% if event.accepted %} {% if event.accepted %}
<li class="list-group-item list-group-item-success">{% trans 'Freigegeben' %}</li> <span class="label label-success">{% trans 'Freigegeben' %}</span>
{% else %} {% else %}
<li class="list-group-item list-group-item-danger">{% trans 'Nicht Freigegeben' %}</li> <span class="label label-danger">{% trans 'Nicht Freigegeben' %}</span>
{% endif %}
</ul>
<div class="btn-group-vertical" role="group">
<a class="btn btn-primary" href="{% url 'dav_events:event_list' %}">{% trans 'Zurück' %}</a>
{% if not event.accepted %}
<a disabled="disabled" class="btn btn-warning" href="">{% trans 'Ändern' %}</a>
<a class="btn btn-success" href="{% url 'dav_events:event_accept' event.pk %}">{% trans 'Freigeben' %}</a>
{% endif %} {% endif %}
</div> </div>
</div> </div>
</div> </div>
</div>
</div>
</div>
{% endblock page-container %} {% endblock page-container %}

View File

@@ -2,6 +2,17 @@
{% load i18n %} {% load i18n %}
{% block page-container-fluid %} {% block page-container-fluid %}
<div class="action-tabs">
<ul class="nav nav-tabs" role="tablist">
<li class="active">
<a href="{% url 'dav_events:event_list' %}">{% trans 'Veranstaltungsliste' %}</a>
</li>
<li>
<a class="btn-primary" href="{% url 'dav_events:event_create' %}">{% trans 'Neue Veranstaltung' %}</a>
</li>
</ul>
</div>
<div> <div>
<table id="objects_table" class="table table-striped"> <table id="objects_table" class="table table-striped">
<thead> <thead>
@@ -30,9 +41,13 @@
<a href="{% url 'dav_events:event_detail' event.pk %}">{{ event.title }}</a> <a href="{% url 'dav_events:event_detail' event.pk %}">{{ event.title }}</a>
</td> </td>
<td> <td>
{{ event.trainer_firstname }} {{ event.trainer_familyname }} {% if event.owner.get_full_name %}
{{ event.owner.get_full_name }}<br />{{ event.owner.email }}
{% else %}
{{ event.owner }}
{% endif %}
</td> </td>
<td data-order="{{ first_day|date:'U' }}"> <td data-order="{{ event.first_day|date:'U' }}">
{{ event.get_short_date }} {{ event.get_short_date }}
</td> </td>
<td> <td>
@@ -48,7 +63,7 @@
</table> </table>
<script type="text/javascript"> <script type="text/javascript">
$(document).ready( function () { $(document).ready( function () {
var table = $('#objects_table').DataTable( { var table = $("#objects_table").DataTable( {
orderCellsTop: true, orderCellsTop: true,
paging: false, paging: false,
language: { language: {
@@ -59,12 +74,13 @@
} }
} ); } );
$('#objects_table thead input').on( 'keyup change', function() { $("#objects_table thead input").on( "keyup change", function() {
table table
.column( $(this).parent().index() ) .column( $(this).parent().index() )
.search( this.value ) .search( this.value )
.draw(); .draw();
} ); } );
$("#objects_table_filter").hide();
} ); } );
</script> </script>
</div> </div>

View File

@@ -3,12 +3,14 @@ import os
from django.contrib.auth import login, views as auth_views from django.contrib.auth import login, views as auth_views
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.exceptions import SuspiciousOperation from django.core.exceptions import PermissionDenied, SuspiciousOperation
from django.db.models import Q
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.utils.decorators import method_decorator
from django.views import generic from django.views import generic
from . import config
from . import forms from . import forms
from . import models from . import models
@@ -45,15 +47,85 @@ class SetPasswordView(auth_views.PasswordChangeView):
class EventListView(generic.ListView): class EventListView(generic.ListView):
model = models.Event model = models.Event
queryset = models.Event.objects.all()
def get_queryset(self):
user = self.request.user
if user.is_superuser:
qs = self.model.objects.all()
elif user.groups.filter(name=config.MANAGE_ALL_GROUP).count():
qs = self.model.objects.all()
else:
user_sports_list = list()
for k in ['W', 'S', 'M', 'K', 'B']:
group_name_var = 'MANAGE_{}_GROUP'.format(k)
group_name = getattr(config, group_name_var, None)
if group_name and user.groups.filter(name=group_name).count():
user_sports_list.append(k)
qs = self.model.objects.filter(Q(owner=user) | Q(sport__in=user_sports_list))
return qs
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(EventListView, self).dispatch(request, *args, **kwargs)
class EventDetailView(generic.DetailView): class EventPermissionMixin(object):
permission = 'view'
def has_permission(self, permission, obj):
user = self.request.user
if user.is_superuser:
return True
if permission == 'view':
if obj.owner == user:
return True
if user.groups.filter(name=config.MANAGE_ALL_GROUP).count():
return True
group_name_var = 'MANAGE_{}_GROUP'.format(obj.sport)
group_name = getattr(config, group_name_var, None)
if group_name and user.groups.filter(name=group_name).count():
return True
elif permission in ('edit', 'accept'):
if user.groups.filter(name=config.MANAGE_ALL_GROUP).count():
return True
group_name_var = 'MANAGE_{}_GROUP'.format(obj.sport)
group_name = getattr(config, group_name_var, None)
if group_name and user.groups.filter(name=group_name).count():
return True
return False
def enforce_permission(self, obj):
permission = self.permission
if not self.has_permission(permission, obj):
raise PermissionDenied()
class EventDetailView(EventPermissionMixin, generic.DetailView):
model = models.Event model = models.Event
def get_object(self, queryset=None):
obj = super(EventDetailView, self).get_object(queryset=queryset)
self.enforce_permission(obj)
return obj
class EventAcceptView(generic.DetailView): def get_context_data(self, **kwargs):
model = models.Event context = super(EventDetailView, self).get_context_data(**kwargs)
obj = context.get('event')
context['has_permission_accept'] = self.has_permission('accept', obj)
context['has_permission_edit'] = self.has_permission('edit', obj)
return context
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(EventDetailView, self).dispatch(request, *args, **kwargs)
class EventAcceptView(EventDetailView):
permission = 'accept'
def accept(self): def accept(self):
event = self.get_object() event = self.get_object()
@@ -118,7 +190,7 @@ class EventCreateView(generic.FormView):
next_url = reverse('dav_events:event_list') next_url = reverse('dav_events:event_list')
else: else:
login(self.request, owner) login(self.request, owner)
next_url = reverse('dav_events:set_password', kwargs={'pk': owner.pk}) next_url = reverse('dav_events:set_password')
return HttpResponseRedirect(next_url) return HttpResponseRedirect(next_url)
def clean_session_data(self, session=None): def clean_session_data(self, session=None):