UPD: made interface for office useful.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
{% extends 'dav_event_office/base.html' %}
|
||||
{% load bootstrap3 %}
|
||||
{% load i18n %}
|
||||
{% load dav_events %}
|
||||
|
||||
{% block head-title %}{{ event }} - {{ block.super }}{% endblock head-title %}
|
||||
|
||||
@@ -8,52 +9,277 @@
|
||||
<div class="action-tabs top-most">
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li>
|
||||
<a class="btn"
|
||||
href="{% url 'dav_event_office:event-list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
||||
<a href="{% url 'dav_event_office:event-list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
||||
</li>
|
||||
<li class="active">
|
||||
<a class="btn"
|
||||
href="{% url 'dav_event_office:event-detail' event.pk %}">{% trans 'Details' %}</a>
|
||||
<a href="{% url 'dav_event_office:event-detail' event.pk %}">{% trans 'Details' %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
{{ event.render_as_html }}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="row">
|
||||
<div class="col-sm-7">
|
||||
<h5>Status-Log</h5>
|
||||
{% for flag in event.flags.all %}
|
||||
{% if not event.registration_required %}
|
||||
<div class="alert alert-danger alert-dismissible" role="alert">
|
||||
<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-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="row">
|
||||
<div class="col-sm-5">
|
||||
<span class="text-{{ flag.status.bootstrap_context|default:'default' }}">{% bootstrap_icon 'check' %}</span>
|
||||
<strong>{{ flag.status.label }}:</strong>
|
||||
<div class="col-sm-8">
|
||||
<strong>{% trans 'Leitung' %}:</strong>
|
||||
{{ 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-7">
|
||||
{{ flag.timestamp|date:'l, d. F Y, H:i' }} {% trans 'Uhr' %}<br />
|
||||
{% trans 'von' %} {{ flag.user.get_full_name|default:flag.user }}
|
||||
<div class="col-sm-4">
|
||||
<strong>{% trans 'Teilnehmergebühr' %}:</strong>
|
||||
{{ event.charge|floatformat:'-2' }} €
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
<strong>{% trans 'Anmeldeschluss' %}:</strong>
|
||||
{% if event.deadline %}
|
||||
{{ event.deadline|date:'l, d. F Y' }}
|
||||
{% else %}
|
||||
-
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-sm-4">
|
||||
<strong>{% trans 'Teilnehmerzahl' %}:</strong>
|
||||
{{ event.min_participants }} -
|
||||
{% if event.max_participants > 0 %}
|
||||
{{ event.max_participants }}
|
||||
{% else %}
|
||||
∞
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="col-sm-5">
|
||||
<h5>{% trans 'Veröffentlichung' %}</h5>
|
||||
{% if event.planned_publication_date %}
|
||||
{{ event.planned_publication_date|date:'l, d. F Y' }}
|
||||
{% else %}
|
||||
{% trans 'Unverzüglich' %}
|
||||
{% endif %}
|
||||
{% if event.internal_note %}
|
||||
<h5 style="margin-top: 1em;">{% trans 'Bearbeitungshinweis' %}</h5>
|
||||
<div class="well well-sm"><small>{{ event.internal_note|linebreaksbr }}</small></div>
|
||||
{% endif %}
|
||||
</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 %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% 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 %}
|
||||
<span class="hidden" title="{% trans 'Keine Teilnehmergebühr gefordert' %}">
|
||||
{% bootstrap_icon 'piggy-bank' %}
|
||||
</span>
|
||||
{% endif %}
|
||||
</form>
|
||||
</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 %}
|
||||
</form>
|
||||
</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>
|
||||
{% endblock page-container-fluid %}
|
||||
@@ -5,19 +5,13 @@
|
||||
|
||||
{% block page-container-fluid %}
|
||||
<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">
|
||||
<li class="active">
|
||||
<a href="{% url 'dav_event_office:event-list' %}">{% trans 'Veranstaltungsliste' %}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{% url 'dav_event_office:participant-list' %}">{% trans 'Teilnehmerliste' %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -4,15 +4,11 @@
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<div class="well">
|
||||
<p class="lead">Veranstaltungen</p>
|
||||
<p class="lead">Veranstaltungen (für Geschäftstelle)</p>
|
||||
<p>
|
||||
Blah.
|
||||
Hier sind alle Veranstaltungen gelistet.
|
||||
<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.
|
||||
|
||||
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.
|
||||
Zu jeder Veranstaltung ist eine Detail-Seite aufrufbar, über die Details und angemeldete Teilnehmer einsehbar sind.
|
||||
"></span>
|
||||
</p>
|
||||
<p>
|
||||
@@ -22,16 +18,14 @@ Du wirst dann per E-Mail auf dem laufenden gehalten.
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="well">
|
||||
<p class="lead">Teilnehmer</p>
|
||||
<p class="lead">Teilnehmer (für Geschäftstelle)</p>
|
||||
<p>
|
||||
Fasel.
|
||||
Hier sind alle angemeldeten Teilnehmer gelistet.
|
||||
<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>
|
||||
</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>
|
||||
</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 = [
|
||||
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'^(?P<pk>\d+)/', views.EventDetailView.as_view(), name='event-detail'),
|
||||
]
|
||||
|
||||
@@ -1,44 +1,64 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.decorators import login_required
|
||||
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.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.views.events import EventListView as _EventListView, EventRegistrationsView as _EventRegistrationsView
|
||||
|
||||
|
||||
class HomeView(generic.TemplateView):
|
||||
template_name = 'dav_event_office/home.html'
|
||||
|
||||
|
||||
class OfficePermissionMixin(object):
|
||||
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
|
||||
class EventListView(_EventListView):
|
||||
template_name = 'dav_event_office/event_list.html'
|
||||
|
||||
@method_decorator(login_required)
|
||||
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)
|
||||
|
||||
|
||||
class EventDetailView(OfficePermissionMixin, generic.DetailView):
|
||||
model = Event
|
||||
class EventDetailView(_EventRegistrationsView):
|
||||
template_name = 'dav_event_office/event_detail.html'
|
||||
|
||||
@method_decorator(login_required)
|
||||
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)
|
||||
|
||||
|
||||
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))
|
||||
else:
|
||||
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)
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
|
||||
Reference in New Issue
Block a user