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 %} +
    + +
    +
    + {% csrf_token %} + {% bootstrap_form form %} + {% buttons %} + + {% trans 'Abbrechen' %} + {% endbuttons %} +
    +{% 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'