Added Event List Export Feature.
This commit is contained in:
3
TODO.txt
3
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
|
||||
|
||||
@@ -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']
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
27
dav_events/templates/dav_events/event_list_export_form.html
Normal file
27
dav_events/templates/dav_events/event_list_export_form.html
Normal 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 %}
|
||||
@@ -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'),
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user