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
|
- 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
|
||||||
|
|||||||
@@ -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']
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
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'^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'),
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user