diff --git a/TODO.txt b/TODO.txt
index 4483f7f..2e90218 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -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
- ApproachForm aufteilen
- Anmeldungstext
- Publish Status?
-- Download Veranstaltungsliste
- Teilnehmerzahl und Trainerzahl kombinieren
- Save as Draft
- Copy Event
diff --git a/dav_events/choices.py b/dav_events/choices.py
index fc56ab0..9fe28ce 100644
--- a/dav_events/choices.py
+++ b/dav_events/choices.py
@@ -34,6 +34,9 @@ class ChoiceSet(object):
def get_label(self, code):
return self._labels[code]
+ def sort(self):
+ self._codes.sort()
+
class CountryChoiceSet(Countries):
first = ['DE', 'AUT', 'CH', 'FR', 'IT']
diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py
index 8e5b3a2..4d00a75 100644
--- a/dav_events/forms/events.py
+++ b/dav_events/forms/events.py
@@ -18,6 +18,54 @@ app_config = apps.get_containing_app_config(__package__)
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 Meta:
model = models.Event
diff --git a/dav_events/templates/dav_events/event_list.html b/dav_events/templates/dav_events/event_list.html
index 86db779..9301eaa 100644
--- a/dav_events/templates/dav_events/event_list.html
+++ b/dav_events/templates/dav_events/event_list.html
@@ -10,8 +10,9 @@
{% trans 'Neue Veranstaltung' %}
-
- {% trans 'Veranstaltungsliste downloaden' %}
+
+ {% trans 'Veranstaltungsliste herunterladen' %}
diff --git a/dav_events/templates/dav_events/event_list_export_form.html b/dav_events/templates/dav_events/event_list_export_form.html
new file mode 100644
index 0000000..0887ca1
--- /dev/null
+++ b/dav_events/templates/dav_events/event_list_export_form.html
@@ -0,0 +1,27 @@
+{% extends 'dav_events/base.html' %}
+{% load bootstrap3 %}
+{% load i18n %}
+
+{% block page-container-fluid %}
+
+
+{% endblock page-container-fluid %}
diff --git a/dav_events/urls.py b/dav_events/urls.py
index c9eb553..be82dc6 100644
--- a/dav_events/urls.py
+++ b/dav_events/urls.py
@@ -10,6 +10,7 @@ urlpatterns = [
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/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\d+)/accept', views.events.EventAcceptView.as_view(), name='event_accept'),
url(r'^events/(?P\d+)/edit', views.events.EventUpdateView.as_view(), name='event_update'),
url(r'^events/(?P\d+)/', views.events.EventDetailView.as_view(), name='event_detail'),
diff --git a/dav_events/views/events.py b/dav_events/views/events.py
index c1dd5c7..b941305 100644
--- a/dav_events/views/events.py
+++ b/dav_events/views/events.py
@@ -6,12 +6,13 @@ from django.contrib.auth import login
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied, SuspiciousOperation
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.utils.decorators import method_decorator
from django.utils.translation import ugettext as _
from django.views import generic
+from .. import choices
from .. import forms
from .. import models
from ..utils import has_role
@@ -39,11 +40,60 @@ class EventListView(generic.ListView):
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)
def dispatch(self, 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):
permission = 'view'