UPD: made interface for office useful.
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
{% extends 'dav_event_office/base.html' %}
|
{% extends 'dav_event_office/base.html' %}
|
||||||
{% load bootstrap3 %}
|
{% load bootstrap3 %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% load dav_events %}
|
||||||
|
|
||||||
{% block head-title %}{{ event }} - {{ block.super }}{% endblock head-title %}
|
{% block head-title %}{{ event }} - {{ block.super }}{% endblock head-title %}
|
||||||
|
|
||||||
@@ -8,51 +9,276 @@
|
|||||||
<div class="action-tabs top-most">
|
<div class="action-tabs top-most">
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
<li>
|
<li>
|
||||||
<a class="btn"
|
<a href="{% url 'dav_event_office:event-list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
||||||
href="{% url 'dav_event_office:event-list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
|
||||||
</li>
|
</li>
|
||||||
<li class="active">
|
<li class="active">
|
||||||
<a class="btn"
|
<a href="{% url 'dav_event_office:event-detail' event.pk %}">{% trans 'Details' %}</a>
|
||||||
href="{% url 'dav_event_office:event-detail' event.pk %}">{% trans 'Details' %}</a>
|
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
{% if not event.registration_required %}
|
||||||
<div class="col-sm-12">
|
<div class="alert alert-danger alert-dismissible" role="alert">
|
||||||
{{ event.render_as_html }}
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
|
{% trans 'Für diese Veranstaltung wurde keine Anmeldung gefordert.' %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<div class="pull-right">
|
||||||
|
{% render_event_status event %}
|
||||||
|
</div>
|
||||||
|
<h3 class="panel-title">{{ event }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<div class="panel-group" id="form-accordion-details" role="tablist" aria-multiselectable="true">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div id="headingShortDetails" class="panel-heading" role="tab">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<div class="pull-right">
|
||||||
|
{% if not event.registration_required %}
|
||||||
|
<span class="label label-success">{% trans 'Anmeldung nicht erforderlich' %}</span>
|
||||||
|
{% elif is_done %}
|
||||||
|
<span class="label label-default">{% trans 'Veranstaltung beendet' %}</span>
|
||||||
|
{% elif event.registration_closed %}
|
||||||
|
<span class="label label-danger">{% trans 'Anmeldung geschlossen' %}</span>
|
||||||
|
{% elif event.is_deadline_expired %}
|
||||||
|
<span class="label label-warning">{% trans 'Anmeldeschluss abgelaufen' %}</span>
|
||||||
|
{% elif is_published_any %}
|
||||||
|
<span class="label label-success">{% trans 'Anmeldung geöffnet' %}</span>
|
||||||
|
{% else %}
|
||||||
|
<span class="label label-info">{% trans 'Veranstaltung noch nicht veröffentlicht' %}</span>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<a role="button" href="#collapseShortDetails"
|
||||||
|
data-toggle="collapse" data-parent="#form-accordion-details"
|
||||||
|
aria-expanded="true" aria-controls="collapseShortDetails">
|
||||||
|
{% trans 'Details - Anmeldung' %}
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="collapseShortDetails" class="panel-collapse collapse in"
|
||||||
|
role="tabpanel" aria-labelledby="headingShortDetails">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-8">
|
||||||
<h5>Status-Log</h5>
|
<strong>{% trans 'Leitung' %}:</strong>
|
||||||
{% for flag in event.flags.all %}
|
{{ event.get_trainer_full_name }}
|
||||||
|
{% if event.trainer_email or event.trainer_phone %}
|
||||||
|
({% if event.trainer_email %}<a href="mailto:{{ event.trainer_email }}">{{ event.trainer_email }}</a>{% endif %}{% if event.trainer_email and event.trainer_phone %}, {% endif %}{% if event.trainer_phone %}{{ event.trainer_phone }}{% endif %})
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<strong>{% trans 'Teilnehmergebühr' %}:</strong>
|
||||||
|
{{ event.charge|floatformat:'-2' }} €
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-8">
|
||||||
<span class="text-{{ flag.status.bootstrap_context|default:'default' }}">{% bootstrap_icon 'check' %}</span>
|
<strong>{% trans 'Anmeldeschluss' %}:</strong>
|
||||||
<strong>{{ flag.status.label }}:</strong>
|
{% if event.deadline %}
|
||||||
|
{{ event.deadline|date:'l, d. F Y' }}
|
||||||
|
{% else %}
|
||||||
|
-
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-4">
|
||||||
{{ flag.timestamp|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
|
<strong>{% trans 'Teilnehmerzahl' %}:</strong>
|
||||||
{% trans 'von' %} {{ flag.user.get_full_name|default:flag.user }}
|
{{ event.min_participants }} -
|
||||||
|
{% if event.max_participants > 0 %}
|
||||||
|
{{ event.max_participants }}
|
||||||
|
{% else %}
|
||||||
|
∞
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div id="headingFullDetails" class="panel-heading" role="tab">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a role="button" href="#collapseFullDetails"
|
||||||
|
data-toggle="collapse" data-parent="#form-accordion-details"
|
||||||
|
aria-expanded="true" aria-controls="collapseFullDetails">
|
||||||
|
{% trans 'Komplette Ausschreibung' %}
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="collapseFullDetails" class="panel-collapse collapse"
|
||||||
|
role="tabpanel" aria-labelledby="headingFullDetails">
|
||||||
|
<div class="panel-body">
|
||||||
|
{{ event.render_as_html }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
<h4>{% trans 'Teilnehmer' %}</h4>
|
||||||
|
<div class="panel-group" id="form-accordion-participants" role="tablist" aria-multiselectable="true">
|
||||||
|
{% if registrations_support %}
|
||||||
|
<div class="panel panel-info">
|
||||||
|
<div id="headingRegistrations" class="panel-heading" role="tab">
|
||||||
|
<h5 class="panel-title">
|
||||||
|
<a role="button" href="#collapseRegistrations"
|
||||||
|
data-toggle="collapse"
|
||||||
|
aria-expanded="true" aria-controls="collapseRegistrations">
|
||||||
|
<span class="caret"></span> {% trans 'Anmeldungen' %}
|
||||||
|
</a>
|
||||||
|
</h5>
|
||||||
|
</div>
|
||||||
|
<div id="collapseRegistrations" class="panel-collapse collapse"
|
||||||
|
role="tabpanel" aria-labelledby="headingRegistrations">
|
||||||
|
<div class="panel-body">
|
||||||
|
{% for registration in registrations %}
|
||||||
|
<form action="" method="post" class="form-inline">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="registration" value="{{ registration.id }}">
|
||||||
|
{% if has_permission_update_participants %}
|
||||||
|
<button type="submit" name="action" value="accept_registration"
|
||||||
|
class="btn btn-link no-padding" title="zur Teilnehmerliste hinzufügen">
|
||||||
|
<span class="text-success">{% bootstrap_icon 'plus-sign' %}</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="submit" name="action" value="reject_registration"
|
||||||
|
class="btn btn-link no-padding" title="Anmeldung löschen">
|
||||||
|
<span class="text-danger">{% bootstrap_icon 'minus-sign' %}</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% if registration.answered %}
|
||||||
|
<span class="text-muted">
|
||||||
|
{% endif %}
|
||||||
|
{{ registration.get_full_name }}
|
||||||
|
(<a href="mailto:{{ registration.email_address }}">{{ registration.email_address }}</a>,
|
||||||
|
{{ registration.phone_number }})
|
||||||
|
|
||||||
|
<span title="Anmeldezeitpunkt">
|
||||||
|
{% bootstrap_icon 'time' %}
|
||||||
|
{{ registration.created_at|date:'d. F Y, G:i' }}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span title="{{ registration.get_info }}">
|
||||||
|
{% bootstrap_icon 'info-sign' %}
|
||||||
|
</span>
|
||||||
|
{% if registration.answered %}
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
{% empty %}
|
||||||
|
{% trans 'Keine unbearbeiteten Anmeldungen vorhanden' %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-5">
|
</div>
|
||||||
<h5>{% trans 'Veröffentlichung' %}</h5>
|
</div>
|
||||||
{% if event.planned_publication_date %}
|
{% endif %}
|
||||||
{{ event.planned_publication_date|date:'l, d. F Y' }}
|
{% if participants %}
|
||||||
|
{% for form in participant_formset %}
|
||||||
|
{% with participant=form.instance %}
|
||||||
|
{% with position=participant.position %}
|
||||||
|
<div class="panel {% if event.max_participants and position > event.max_participants %}panel-warning{% else %}panel-default{% endif %}">
|
||||||
|
<div id="headingParticipant_{{ participant.id }}" class="panel-heading" role="tab">
|
||||||
|
<h5 class="panel-title">
|
||||||
|
<a role="button" href="#collapseParticipant_{{ participant.id }}"
|
||||||
|
data-toggle="collapse"
|
||||||
|
aria-expanded="true" aria-controls="collapseParticipant_{{ participant.id }}">
|
||||||
|
<span class="caret"></span>
|
||||||
|
{{ position }}. {{ participant.get_full_name }}
|
||||||
|
</a>
|
||||||
|
<small>
|
||||||
|
(<a href="mailto:{{ participant.email_address }}">{{ participant.email_address }}</a>, {{ participant.phone_number }})
|
||||||
|
</small>
|
||||||
|
{{ participant.dav_number }}
|
||||||
|
<div class="pull-right">
|
||||||
|
<form action="" method="post" class="form-inline">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="id" value="{{ participant.id }}">
|
||||||
|
{% if has_permission_update_participants %}
|
||||||
|
<button name="action" value="moveup_participant"
|
||||||
|
title="{% trans 'Nach oben verschieben' %}"
|
||||||
|
class="btn btn-link no-padding {% if forloop.first %}invisible{% endif %}">
|
||||||
|
<span class="text-info">{% bootstrap_icon 'triangle-top' %}</span>
|
||||||
|
</button>
|
||||||
|
<button name="action" value="movedown_participant"
|
||||||
|
title="{% trans 'Nach unten verschieben' %}"
|
||||||
|
class="btn btn-link no-padding {% if forloop.last %}invisible{% endif %}">
|
||||||
|
<span class="text-info">{% bootstrap_icon 'triangle-bottom' %}</span>
|
||||||
|
</button>
|
||||||
|
<button name="action" value="remove_participant"
|
||||||
|
title="{% trans 'Teilnehmer jetzt löschen' %}
|
||||||
|
({% trans 'erfolgt automatisch am' %} {{ participant.purge_at|date:'d. F Y'}})"
|
||||||
|
class="btn btn-link no-padding">
|
||||||
|
<span class="text-danger">{% bootstrap_icon 'remove-circle' %}</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% if event.charge and participant.paid and has_permission_payment %}
|
||||||
|
<button name="action" value="revoke_payment"
|
||||||
|
title="{% trans 'Geldeingang wurde bestätigt' %} - {% trans 'Bestätigung des Geldeingangs zurückziehen' %}"
|
||||||
|
class="btn btn-link no-padding">
|
||||||
|
<span class="text-success">{% bootstrap_icon 'piggy-bank' %}</span>
|
||||||
|
</button>
|
||||||
|
{% elif event.charge and participant.paid %}
|
||||||
|
<span class="text-success" title="{% trans 'Geldeingang bestätigt' %}">
|
||||||
|
{% bootstrap_icon 'piggy-bank' %}
|
||||||
|
</span>
|
||||||
|
{% elif event.charge and has_permission_payment %}
|
||||||
|
<button name="action" value="confirm_payment"
|
||||||
|
title="{% trans 'Geldeingang bestätigen' %}"
|
||||||
|
class="btn btn-link no-padding">
|
||||||
|
<span class="text-danger">{% bootstrap_icon 'piggy-bank' %}</span>
|
||||||
|
</button>
|
||||||
|
{% elif event.charge %}
|
||||||
|
<span class="text-danger" title="{% trans 'Geldeingang unbestätigt' %}">
|
||||||
|
{% bootstrap_icon 'piggy-bank' %}
|
||||||
|
</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% trans 'Unverzüglich' %}
|
<span class="hidden" title="{% trans 'Keine Teilnehmergebühr gefordert' %}">
|
||||||
|
{% bootstrap_icon 'piggy-bank' %}
|
||||||
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if event.internal_note %}
|
</form>
|
||||||
<h5 style="margin-top: 1em;">{% trans 'Bearbeitungshinweis' %}</h5>
|
</div>
|
||||||
<div class="well well-sm"><small>{{ event.internal_note|linebreaksbr }}</small></div>
|
</h5>
|
||||||
|
</div>
|
||||||
|
<div id="collapseParticipant_{{ participant.id }}"
|
||||||
|
class="panel-collapse collapse {% if form.errors %}in{% endif %}"
|
||||||
|
role="tabpanel" aria-labelledby="headingParticipant_{{ participant.id }}">
|
||||||
|
<div class="panel-body">
|
||||||
|
{% bootstrap_form_errors form %}
|
||||||
|
<form action="" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="form_prefix" value="{{ form.prefix }}">
|
||||||
|
<input type="hidden" name="{{ form.prefix }}-id" value="{{ participant.id }}">
|
||||||
|
{% include './includes/participant_form.html' %}
|
||||||
|
{% if has_permission_update_participants %}
|
||||||
|
<button type="submit" name="action" value="update_participant" class="btn btn-success">
|
||||||
|
{% bootstrap_icon 'hdd' %} {% trans 'Speichern' %}
|
||||||
|
</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<div class="panel panel-info">
|
||||||
|
<div class="panel-body">
|
||||||
|
<span class="text-info">{% trans 'Es wurden noch keine Teilnehmer hinzugefügt.' %}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if participant_emails %}
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-body">
|
||||||
|
<strong>{% trans 'E-Mail-Adressen' %}</strong> <small>({% trans 'für Copy-Paste' %})</small><br />
|
||||||
|
<div class="well well-sm">{{ participant_emails }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,19 +5,13 @@
|
|||||||
|
|
||||||
{% block page-container-fluid %}
|
{% block page-container-fluid %}
|
||||||
<div class="action-tabs top-most">
|
<div class="action-tabs top-most">
|
||||||
<div class="pull-right">
|
|
||||||
<!--
|
|
||||||
<a id="btn-event-create" class="btn btn-primary"
|
|
||||||
href="{% url 'dav_events:create' %}">
|
|
||||||
{% bootstrap_icon 'plus' %}
|
|
||||||
{% trans 'Neue Veranstaltung anlegen' %}
|
|
||||||
</a>
|
|
||||||
-->
|
|
||||||
</div>
|
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
<li class="active">
|
<li class="active">
|
||||||
<a href="{% url 'dav_event_office:event-list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
<a href="{% url 'dav_event_office:event-list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'dav_event_office:participant-list' %}">{% trans 'Teilnehmerliste' %}</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -4,15 +4,11 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="well">
|
<div class="well">
|
||||||
<p class="lead">Veranstaltungen</p>
|
<p class="lead">Veranstaltungen (für Geschäftstelle)</p>
|
||||||
<p>
|
<p>
|
||||||
Blah.
|
Hier sind alle Veranstaltungen gelistet.
|
||||||
<span class="glyphicon glyphicon-question-sign" title="
|
<span class="glyphicon glyphicon-question-sign" title="
|
||||||
Du wirst durch eine Reihe von Eingabemasken geführt, die alles Mögliche abfragen, was wir bezüglich deiner Tour / deines Kurses wissen müssen.
|
Zu jeder Veranstaltung ist eine Detail-Seite aufrufbar, über die Details und angemeldete Teilnehmer einsehbar sind.
|
||||||
|
|
||||||
Am Ende dieses Prozesses bekommst du noch einmal eine Zusammenfassung der Daten angezeigt.
|
|
||||||
Wenn du dann auf "Einsenden" klickst, wird alles an den Tourenreferenten und sein Team weitergeleitet.
|
|
||||||
Du wirst dann per E-Mail auf dem laufenden gehalten.
|
|
||||||
"></span>
|
"></span>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
@@ -22,16 +18,14 @@ Du wirst dann per E-Mail auf dem laufenden gehalten.
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="well">
|
<div class="well">
|
||||||
<p class="lead">Teilnehmer</p>
|
<p class="lead">Teilnehmer (für Geschäftstelle)</p>
|
||||||
<p>
|
<p>
|
||||||
Fasel.
|
Hier sind alle angemeldeten Teilnehmer gelistet.
|
||||||
<span class="glyphicon glyphicon-question-sign" title="
|
<span class="glyphicon glyphicon-question-sign" title="
|
||||||
Als Tourenleiter kannst du hier die Anmeldungen und Teilnehmerlisten zu deinen Touren verwalten.
|
|
||||||
Tourenreferenten und Redakteure können hier Veranstaltungen freigeben und Programmlisten herunterladen.
|
|
||||||
"></span>
|
"></span>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a class="btn btn-success" href="{% url 'dav_event_office:event-list' %}">Teilnehmer</a>
|
<a class="btn btn-success" href="{% url 'dav_event_office:participant-list' %}">Teilnehmer</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
{% load bootstrap3 %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
{% bootstrap_field form.personal_names %}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
{% bootstrap_field form.family_names %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
{% bootstrap_field form.address %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
{% bootstrap_field form.postal_code %}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-8">
|
||||||
|
{% bootstrap_field form.city %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
{% bootstrap_field form.email_address %}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
{% bootstrap_field form.phone_number %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
{% bootstrap_field form.dav_number %}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
{% bootstrap_field form.emergency_contact %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
{% bootstrap_field form.experience %}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
{% bootstrap_field form.note %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
{% extends 'dav_event_office/base.html' %}
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load dav_events %}
|
||||||
|
|
||||||
|
{% block page-container-fluid %}
|
||||||
|
<div class="action-tabs top-most">
|
||||||
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'dav_event_office:event-list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
||||||
|
</li>
|
||||||
|
<li class="active">
|
||||||
|
<a href="{% url 'dav_event_office:participant-list' %}">{% trans 'Teilnehmerliste' %}</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<table id="objects_table" class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{% trans 'Veranstaltung' %}</th>
|
||||||
|
<th>{% trans 'Datum' %}</th>
|
||||||
|
<th>{% trans 'Nachname' %}</th>
|
||||||
|
<th>{% trans 'Vorname' %}</th>
|
||||||
|
<th>{% trans 'Mitgliedsnummer' %}</th>
|
||||||
|
<th>{% trans 'Teilnehmergebühr' %}</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th><input type="text" placeholder="{% trans 'Filter' %}" /></th>
|
||||||
|
<th><input type="text" placeholder="{% trans 'Filter' %}" /></th>
|
||||||
|
<th><input type="text" placeholder="{% trans 'Filter' %}" /></th>
|
||||||
|
<th><input type="text" placeholder="{% trans 'Filter' %}" /></th>
|
||||||
|
<th><input type="text" placeholder="{% trans 'Filter' %}" /></th>
|
||||||
|
<th><input type="text" placeholder="{% trans 'Filter' %} ({% trans 'Grün' %}/{% trans 'Rot' %})" /></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for participant in participant_list %}
|
||||||
|
{% with event=participant.event %}
|
||||||
|
<tr>
|
||||||
|
{% with number=event.get_number %}
|
||||||
|
<td data-order="{{ number|slice:':1' }}{{ number|slice:'-2:' }}{{ number|slice:'1:-2'|cut:'/' }}"
|
||||||
|
data-search="{{ number }} ({{ event.get_sport_display }})">
|
||||||
|
<a href="{% url 'dav_event_office:event-detail' event.pk %}">{{ number }}</a>
|
||||||
|
</td>
|
||||||
|
{% endwith %}
|
||||||
|
<td data-order="{{ event.first_day|date:'U' }}">
|
||||||
|
{{ event.get_numeric_date }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ participant.family_names }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ participant.personal_names }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ participant.dav_number }}
|
||||||
|
</td>
|
||||||
|
<td data-order="{{ participant.paid }} {{ event.charge|floatformat:'-2' }}"
|
||||||
|
data-search="{% if participant.paid %}{% trans 'Grün' %}{% else %}{% trans 'Rot' %}{% endif %} {{ event.charge|floatformat:'-2' }}">
|
||||||
|
<form action="" method="post" class="form-inline">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="id" value="{{ participant.id }}">
|
||||||
|
{% if event.charge and participant.paid %}
|
||||||
|
<button name="action" value="revoke_payment"
|
||||||
|
title="{% trans 'Geldeingang wurde bestätigt' %} - {% trans 'Bestätigung des Geldeingangs zurückziehen' %}"
|
||||||
|
class="btn btn-link no-padding">
|
||||||
|
<span class="text-success">{% bootstrap_icon 'piggy-bank' %}</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
({{ event.charge|floatformat:'-2' }} €)
|
||||||
|
{% elif event.charge %}
|
||||||
|
<button name="action" value="confirm_payment"
|
||||||
|
title="{% trans 'Geldeingang bestätigen' %}"
|
||||||
|
class="btn btn-link no-padding">
|
||||||
|
<span class="text-danger">{% bootstrap_icon 'piggy-bank' %}</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
({{ event.charge|floatformat:'-2' }} €)
|
||||||
|
{% else %}
|
||||||
|
<span class="text-muted" title="{% trans 'Keine Teilnehmergebühr gefordert' %}">
|
||||||
|
{% bootstrap_icon 'piggy-bank' %}
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endwith %}
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready( function () {
|
||||||
|
var table = $("#objects_table").DataTable( {
|
||||||
|
order: [[2, "asc"], [3, "asc"], [0, "asc"]],
|
||||||
|
orderCellsTop: true,
|
||||||
|
paging: false,
|
||||||
|
language: {
|
||||||
|
search: "{% trans 'Filter' %}:",
|
||||||
|
info: "{% trans 'Zeige _TOTAL_ Einträge' %}",
|
||||||
|
infoFiltered: "{% trans 'aus insgesamt _MAX_ Einträgen' %}",
|
||||||
|
infoEmpty: "{% trans 'Zeige 0 Einträge' %}",
|
||||||
|
infoPostFix: ".",
|
||||||
|
emptyTable: "{% trans 'Keine Daten vorhanden.' %}",
|
||||||
|
zeroRecords: "{% trans 'Keine passenden Einträge.' %}",
|
||||||
|
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
$("#objects_table thead input").on( "keyup change", function() {
|
||||||
|
table
|
||||||
|
.column( $(this).parent().index() )
|
||||||
|
.search( this.value )
|
||||||
|
.draw();
|
||||||
|
} );
|
||||||
|
$("#objects_table_filter").hide();
|
||||||
|
} );
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
{% endblock page-container-fluid %}
|
||||||
@@ -4,6 +4,7 @@ from . import views
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^home$', views.HomeView.as_view(), name='root'),
|
url(r'^home$', views.HomeView.as_view(), name='root'),
|
||||||
|
url(r'^participants$', views.ParticipantListView.as_view(), name='participant-list'),
|
||||||
url(r'^$', views.EventListView.as_view(), name='event-list'),
|
url(r'^$', views.EventListView.as_view(), name='event-list'),
|
||||||
url(r'^(?P<pk>\d+)/', views.EventDetailView.as_view(), name='event-detail'),
|
url(r'^(?P<pk>\d+)/', views.EventDetailView.as_view(), name='event-detail'),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,44 +1,64 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
from django.contrib import messages
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
|
from django.urls import reverse
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
|
||||||
from dav_events.models import Event
|
from dav_events.models import Participant
|
||||||
from dav_events.roles import has_role
|
from dav_events.roles import has_role
|
||||||
|
from dav_events.views.events import EventListView as _EventListView, EventRegistrationsView as _EventRegistrationsView
|
||||||
|
|
||||||
|
|
||||||
class HomeView(generic.TemplateView):
|
class HomeView(generic.TemplateView):
|
||||||
template_name = 'dav_event_office/home.html'
|
template_name = 'dav_event_office/home.html'
|
||||||
|
|
||||||
|
|
||||||
class OfficePermissionMixin(object):
|
class EventListView(_EventListView):
|
||||||
def enforce_permission(self, request):
|
|
||||||
user = request.user
|
|
||||||
if user.is_superuser:
|
|
||||||
return None
|
|
||||||
elif has_role(user, 'manager_super'):
|
|
||||||
return None
|
|
||||||
elif has_role(user, 'event_office'):
|
|
||||||
return None
|
|
||||||
raise PermissionDenied('event_office')
|
|
||||||
|
|
||||||
|
|
||||||
class EventListView(OfficePermissionMixin, generic.ListView):
|
|
||||||
model = Event
|
|
||||||
template_name = 'dav_event_office/event_list.html'
|
template_name = 'dav_event_office/event_list.html'
|
||||||
|
|
||||||
@method_decorator(login_required)
|
@method_decorator(login_required)
|
||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
self.enforce_permission(request)
|
if not has_role(request.user, 'office'):
|
||||||
|
raise PermissionDenied('Zugang nur für die Geschäftsstelle')
|
||||||
return super(EventListView, self).dispatch(request, *args, **kwargs)
|
return super(EventListView, self).dispatch(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class EventDetailView(OfficePermissionMixin, generic.DetailView):
|
class EventDetailView(_EventRegistrationsView):
|
||||||
model = Event
|
|
||||||
template_name = 'dav_event_office/event_detail.html'
|
template_name = 'dav_event_office/event_detail.html'
|
||||||
|
|
||||||
@method_decorator(login_required)
|
@method_decorator(login_required)
|
||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
self.enforce_permission(request)
|
if not has_role(request.user, 'office'):
|
||||||
|
raise PermissionDenied('Zugang nur für die Geschäftsstelle')
|
||||||
return super(EventDetailView, self).dispatch(request, *args, **kwargs)
|
return super(EventDetailView, self).dispatch(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class ParticipantListView(generic.ListView):
|
||||||
|
model = Participant
|
||||||
|
template_name = 'dav_event_office/participant_list.html'
|
||||||
|
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
action = request.POST.get('action')
|
||||||
|
if action == 'confirm_payment':
|
||||||
|
participant_id = request.POST.get('id')
|
||||||
|
participant = get_object_or_404(Participant, pk=participant_id)
|
||||||
|
participant.paid = True
|
||||||
|
participant.save()
|
||||||
|
elif action == 'revoke_payment':
|
||||||
|
participant_id = request.POST.get('id')
|
||||||
|
participant = get_object_or_404(Participant, pk=participant_id)
|
||||||
|
participant.paid = False
|
||||||
|
participant.save()
|
||||||
|
else:
|
||||||
|
messages.error(request, 'unsupported action: {}'.format(action))
|
||||||
|
return HttpResponseRedirect(reverse('dav_event_office:participant-list'))
|
||||||
|
|
||||||
|
@method_decorator(login_required)
|
||||||
|
def dispatch(self, request, *args, **kwargs):
|
||||||
|
if not has_role(request.user, 'office'):
|
||||||
|
raise PermissionDenied('Zugang nur für die Geschäftsstelle')
|
||||||
|
return super(ParticipantListView, self).dispatch(request, *args, **kwargs)
|
||||||
|
|||||||
@@ -413,7 +413,7 @@ class EventRegistrationsView(EventPermissionMixin, generic.DetailView):
|
|||||||
return self.render_to_response(self.get_context_data(create_participant_form=form))
|
return self.render_to_response(self.get_context_data(create_participant_form=form))
|
||||||
else:
|
else:
|
||||||
messages.error(request, 'unsupported action: {}'.format(action))
|
messages.error(request, 'unsupported action: {}'.format(action))
|
||||||
return HttpResponseRedirect(reverse('dav_events:registrations', kwargs={'pk': event.pk}))
|
return self.render_to_response(self.get_context_data())
|
||||||
|
|
||||||
@method_decorator(login_required)
|
@method_decorator(login_required)
|
||||||
def dispatch(self, request, *args, **kwargs):
|
def dispatch(self, request, *args, **kwargs):
|
||||||
|
|||||||
Reference in New Issue
Block a user