Added Event List Export Feature.

This commit is contained in:
2018-01-29 17:21:04 +01:00
parent d3625cf79f
commit b68949ba5f
7 changed files with 133 additions and 6 deletions

View File

@@ -1,10 +1,7 @@
- beim Erstellen einer neuen Veranstaltung wird nach event.trainer_email = user.username gesucht, evtl. wäre
event.trainer_email = user.email besser?
- Anzeige Bahnfahrt - Anzeige Bahnfahrt
- ApproachForm aufteilen - ApproachForm aufteilen
- Anmeldungstext - Anmeldungstext
- Publish Status? - Publish Status?
- Download Veranstaltungsliste
- Teilnehmerzahl und Trainerzahl kombinieren - Teilnehmerzahl und Trainerzahl kombinieren
- Save as Draft - Save as Draft
- Copy Event - Copy Event

View File

@@ -34,6 +34,9 @@ class ChoiceSet(object):
def get_label(self, code): def get_label(self, code):
return self._labels[code] return self._labels[code]
def sort(self):
self._codes.sort()
class CountryChoiceSet(Countries): class CountryChoiceSet(Countries):
first = ['DE', 'AUT', 'CH', 'FR', 'IT'] first = ['DE', 'AUT', 'CH', 'FR', 'IT']

View File

@@ -18,6 +18,54 @@ app_config = apps.get_containing_app_config(__package__)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class EventListExportForm(forms.Form):
sport = forms.ChoiceField(choices=choices.SPORT_CHOICES,
required=False,
label=_(u'Spielart'),
)
begin = forms.DateField(required=False,
label=_(u'Zeitraum - Start'),
help_text=u'%s - %s' % (
_(u'Format: tt.mm.jjjj'),
_(u'Kann frei gelassen werden')
),
widget = DateWidget(attrs={'id': 'id_begin_widget',
'placeholder': _(u'Kann freigelassen werden')},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'startView': 3,
'clearBtn': True,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
end = forms.DateField(required=False,
label=_(u'Zeitraum - Ende'),
help_text=u'%s - %s' % (
_(u'Format: tt.mm.jjjj'),
_(u'Kann frei gelassen werden')
),
widget = DateWidget(attrs={'id': 'id_end_widget',
'placeholder': _(u'Kann freigelassen werden')},
usel10n=True,
options={
# 'format': 'dd.mm.yyyy',
# 'weekStart': 1,
'startView': 3,
'clearBtn': True,
'pickerPosition': 'bottom-left',
},
bootstrap_version=3))
def __init__(self, *args, **kwargs):
super(EventListExportForm, self).__init__(*args, **kwargs)
sport_choices = self.fields['sport'].widget.choices
sport_choices.append((None, u'Alle'))
sport_choices.sort()
self.fields['sport'].widget.choices = sport_choices
class EventUpdateForm(forms.ModelForm): class EventUpdateForm(forms.ModelForm):
class Meta: class Meta:
model = models.Event model = models.Event

View File

@@ -10,8 +10,9 @@
<li> <li>
<a class="btn-primary" href="{% url 'dav_events:event_create' %}">{% trans 'Neue Veranstaltung' %}</a> <a class="btn-primary" href="{% url 'dav_events:event_create' %}">{% trans 'Neue Veranstaltung' %}</a>
</li> </li>
<li class="disabled"> <li class="{% if not has_permission_export %}disabled{% endif %}">
<a class="" href="{% url 'dav_events:event_list' %}">{% trans 'Veranstaltungsliste downloaden' %}</a> <a class="btn {% if not has_permission_export %}disabled{% endif %}"
href="{% url 'dav_events:event_list_export' %}">{% trans 'Veranstaltungsliste herunterladen' %}</a>
</li> </li>
</ul> </ul>
</div> </div>

View File

@@ -0,0 +1,27 @@
{% extends 'dav_events/base.html' %}
{% load bootstrap3 %}
{% load i18n %}
{% 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>
<a class="btn-primary" href="{% url 'dav_events:event_create' %}">{% trans 'Neue Veranstaltung' %}</a>
</li>
<li class="active">
<a href="{% url 'dav_events:event_list_export' %}">{% trans 'Veranstaltungsliste herunterladen' %}</a>
</li>
</ul>
</div>
<form action="" method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-success">{% trans 'Exportieren' %}</button>
<a class="btn btn-danger" href="{% url 'dav_events:event_list' %}">{% trans 'Abbrechen' %}</a>
{% endbuttons %}
</form>
{% endblock page-container-fluid %}

View File

@@ -10,6 +10,7 @@ urlpatterns = [
url(r'^user/password$', views.auth.SetPasswordView.as_view(), name='set_password'), url(r'^user/password$', views.auth.SetPasswordView.as_view(), name='set_password'),
url(r'^events$', views.events.EventListView.as_view(), name='event_list'), url(r'^events$', views.events.EventListView.as_view(), name='event_list'),
url(r'^events/create$', views.events.EventCreateView.as_view(), name='event_create'), url(r'^events/create$', views.events.EventCreateView.as_view(), name='event_create'),
url(r'^events/export$', views.events.EventListExportView.as_view(), name='event_list_export'),
url(r'^events/(?P<pk>\d+)/accept', views.events.EventAcceptView.as_view(), name='event_accept'), url(r'^events/(?P<pk>\d+)/accept', views.events.EventAcceptView.as_view(), name='event_accept'),
url(r'^events/(?P<pk>\d+)/edit', views.events.EventUpdateView.as_view(), name='event_update'), url(r'^events/(?P<pk>\d+)/edit', views.events.EventUpdateView.as_view(), name='event_update'),
url(r'^events/(?P<pk>\d+)/', views.events.EventDetailView.as_view(), name='event_detail'), url(r'^events/(?P<pk>\d+)/', views.events.EventDetailView.as_view(), name='event_detail'),

View File

@@ -6,12 +6,13 @@ from django.contrib.auth import login
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied, SuspiciousOperation from django.core.exceptions import PermissionDenied, SuspiciousOperation
from django.db.models import Q from django.db.models import Q
from django.http import HttpResponseRedirect from django.http import HttpResponse, 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.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.views import generic from django.views import generic
from .. import choices
from .. import forms from .. import forms
from .. import models from .. import models
from ..utils import has_role from ..utils import has_role
@@ -39,11 +40,60 @@ class EventListView(generic.ListView):
return qs return qs
def get_context_data(self, **kwargs):
context = super(EventListView, self).get_context_data(**kwargs)
user = self.request.user
context['has_permission_export'] = user.is_superuser or has_role(user, 'publish')
return context
@method_decorator(login_required) @method_decorator(login_required)
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
return super(EventListView, self).dispatch(request, *args, **kwargs) return super(EventListView, self).dispatch(request, *args, **kwargs)
class EventListExportView(generic.FormView):
form_class = forms.events.EventListExportForm
template_name = 'dav_events/event_list_export_form.html'
def form_valid(self, form):
filename = _(u'Veranstaltungen')
filter_kwargs = {
'accepted': True,
}
if form.cleaned_data['sport']:
sport = form.cleaned_data['sport']
filter_kwargs['sport'] = sport
filename += u'--%s' % choices.SPORT_CHOICES.get_label(sport)
if form.cleaned_data['begin']:
date = form.cleaned_data['begin']
filter_kwargs['first_day__gte'] = date
filename += u'--%s' % date.strftime('%Y-%m-%d')
if form.cleaned_data['end']:
date = form.cleaned_data['end']
filter_kwargs['first_day__lte'] = date
filename += u'--%s' % date.strftime('%Y-%m-%d')
txt = u''
event_qs = models.Event.objects.filter(**filter_kwargs).order_by('number')
for event in event_qs:
# txt += unicode(event)
txt += event.render_as_text()
txt += u'\n-----\n\n'
filename += u'.txt'
response = HttpResponse(txt, content_type='text/plain')
response['Content-Disposition'] = 'attachment; filename="{filename}"'.format(filename=filename)
return response
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
user = request.user
if not user.is_superuser and not has_role(user, 'publish'):
raise PermissionDenied('publish')
return super(EventListExportView, self).dispatch(request, *args, **kwargs)
class EventPermissionMixin(object): class EventPermissionMixin(object):
permission = 'view' permission = 'view'