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
- ApproachForm aufteilen
- Anmeldungstext
- Publish Status?
- Download Veranstaltungsliste
- Teilnehmerzahl und Trainerzahl kombinieren
- Save as Draft
- Copy Event

View File

@@ -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']

View File

@@ -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

View File

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