Implementierung des Veranstaltungsmoduls inkl. Serienbrief-PDF-Generator mit dynamischen, editierbaren Feldern für Betreff und Unterschriften. ### Veranstaltungsmodul (STI-35) - Neues Veranstaltungs-Modell: Titel, Datum, Uhrzeit, Ort, Gasthaus-Adresse, Briefvorlage, Gästeliste (VerstaltungsGast mit freien/Destinatär-Feldern) - Views: Veranstaltungsliste, -detail, Serienbrief-PDF-Generator - Templates: list.html, detail.html, serienbrief_pdf.html (A4, einseitig) - API: Serializer + Endpunkte für Veranstaltungen - Admin: Inline-Bearbeitung der Gästeliste - Migration: 0044_veranstaltungsmodul ### Serienbrief editierbare Felder + PDF-Fix (STI-39) - Neue Felder an Veranstaltung: betreff, unterschrift_1_name/titel, unterschrift_2_name/titel (mit Defaults: Katrin Kleinpaß / Jan Remmer Siebels) - PDF-CSS: Margins, Font-Sizes und Line-Heights reduziert für einseitigen Druck - Migration: 0045_add_serienbrief_editable_fields ### Infrastruktur - scripts/init-paperless-db.sh: Erstellt separate Paperless-DB beim DB-Init - compose.yml: init-paperless-db.sh eingebunden, PAPERLESS_DBNAME-Fix - .gitignore: .claude/ ausgeschlossen Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
76 lines
3.3 KiB
HTML
76 lines
3.3 KiB
HTML
{% extends "base.html" %}
|
||
|
||
{% block title %}Veranstaltungen – Stiftungsverwaltung{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="container-fluid py-4">
|
||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||
<h1 class="h3 mb-0">
|
||
<i class="fas fa-calendar-alt me-2"></i>Veranstaltungen
|
||
</h1>
|
||
<a href="{% url 'admin:stiftung_veranstaltung_add' %}" class="btn btn-primary">
|
||
<i class="fas fa-plus me-1"></i>Neue Veranstaltung
|
||
</a>
|
||
</div>
|
||
|
||
{% if veranstaltungen %}
|
||
<div class="card shadow-sm">
|
||
<div class="card-body p-0">
|
||
<table class="table table-hover mb-0">
|
||
<thead class="table-dark">
|
||
<tr>
|
||
<th>Titel</th>
|
||
<th>Datum</th>
|
||
<th>Ort / Gasthaus</th>
|
||
<th>Status</th>
|
||
<th>Teilnehmer</th>
|
||
<th>Zugesagt</th>
|
||
<th>Aktionen</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for v in veranstaltungen %}
|
||
<tr>
|
||
<td>
|
||
<a href="{% url 'stiftung:veranstaltung_detail' v.pk %}">
|
||
<strong>{{ v.titel }}</strong>
|
||
</a>
|
||
</td>
|
||
<td>{{ v.datum|date:"d.m.Y" }}{% if v.uhrzeit %}, {{ v.uhrzeit|time:"H:i" }} Uhr{% endif %}</td>
|
||
<td>{{ v.ort }}</td>
|
||
<td>
|
||
{% if v.status == "geplant" %}
|
||
<span class="badge bg-secondary">Geplant</span>
|
||
{% elif v.status == "einladungen_versendet" %}
|
||
<span class="badge bg-primary">Einladungen versendet</span>
|
||
{% elif v.status == "abgeschlossen" %}
|
||
<span class="badge bg-success">Abgeschlossen</span>
|
||
{% elif v.status == "abgesagt" %}
|
||
<span class="badge bg-danger">Abgesagt</span>
|
||
{% endif %}
|
||
</td>
|
||
<td>{{ v.get_teilnehmer_count }}</td>
|
||
<td>{{ v.get_zugesagte_count }}</td>
|
||
<td>
|
||
<a href="{% url 'stiftung:veranstaltung_detail' v.pk %}" class="btn btn-sm btn-outline-secondary me-1">
|
||
<i class="fas fa-eye"></i>
|
||
</a>
|
||
<a href="{% url 'stiftung:veranstaltung_serienbrief_pdf' v.pk %}" class="btn btn-sm btn-outline-success">
|
||
<i class="fas fa-file-pdf"></i> Serienbrief
|
||
</a>
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
{% else %}
|
||
<div class="alert alert-info">
|
||
<i class="fas fa-info-circle me-2"></i>Noch keine Veranstaltungen angelegt.
|
||
<a href="{% url 'admin:stiftung_veranstaltung_add' %}">Jetzt erste Veranstaltung erstellen.</a>
|
||
</div>
|
||
{% endif %}
|
||
</div>
|
||
{% endblock %}
|