feat: Veranstaltungsmodul + Serienbrief mit editierbaren Feldern (STI-35, STI-39)
Some checks failed
CI/CD Pipeline / test (push) Has been cancelled
CI/CD Pipeline / deploy (push) Has been cancelled
Code Quality / quality (push) Has been cancelled

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>
This commit is contained in:
SysAdmin Agent
2026-03-10 22:36:58 +00:00
parent f8f9dc3319
commit 28621d2774
24 changed files with 1072 additions and 68 deletions

View File

@@ -25,9 +25,9 @@
--orange-dark: #e8590c;
}
/* Global Typography - More Compact */
/* Global Typography */
html {
font-size: 14px; /* Reduced from default 16px */
font-size: 15px;
}
body {
@@ -69,26 +69,6 @@
padding-right: 0.5rem;
}
/* Compact margins */
.mb-1 { margin-bottom: 0.25rem !important; }
.mb-2 { margin-bottom: 0.4rem !important; }
.mb-3 { margin-bottom: 0.75rem !important; }
.mb-4 { margin-bottom: 1rem !important; }
.mb-5 { margin-bottom: 1.5rem !important; }
.mt-1 { margin-top: 0.25rem !important; }
.mt-2 { margin-top: 0.4rem !important; }
.mt-3 { margin-top: 0.75rem !important; }
.mt-4 { margin-top: 1rem !important; }
.mt-5 { margin-top: 1.5rem !important; }
.py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; }
.py-2 { padding-top: 0.4rem !important; padding-bottom: 0.4rem !important; }
.py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; }
.px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; }
.px-2 { padding-left: 0.4rem !important; padding-right: 0.4rem !important; }
.px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; }
.border-left-primary {
border-left: 0.25rem solid var(--racing-green) !important;
@@ -209,19 +189,19 @@
margin-bottom: 0;
}
/* Tables - More Compact */
/* Tables */
.table {
font-size: 0.8rem;
font-size: 0.85rem;
margin-bottom: 0.75rem;
}
.table th {
border-top: none;
font-weight: 600;
color: var(--racing-green-dark);
background-color: var(--grey-light);
padding: 0.5rem;
font-size: 0.75rem;
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.025em;
}
@@ -375,47 +355,61 @@
color: var(--orange-dark);
}
/* Responsive adjustments for very compact design */
/* Responsive adjustments */
@media (max-width: 768px) {
html {
font-size: 13px;
}
body {
font-size: 0.8rem;
}
.navbar-brand {
font-size: 1rem;
}
.navbar-nav .nav-link {
font-size: 0.75rem;
padding: 0.25rem 0.375rem !important;
}
.card-body {
padding: 0.5rem;
}
.btn {
font-size: 0.75rem;
padding: 0.25rem 0.5rem;
}
.table {
font-size: 0.75rem;
}
.table th,
.table td {
padding: 0.375rem;
}
}
@media (min-width: 768px) and (max-width: 1200px) {
html {
font-size: 14px;
}
.container, .container-lg {
max-width: 100%;
}
.table {
font-size: 0.8rem;
}
}
@media (min-width: 1400px) {
.container-lg {
max-width: 1400px;
max-width: 1600px;
}
}
@@ -638,6 +632,23 @@
</ul>
</li>
<!-- Veranstaltungen -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="veranstaltungenDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="fas fa-glass-cheers me-1"></i>Veranstaltungen
</a>
<ul class="dropdown-menu" aria-labelledby="veranstaltungenDropdown">
<li><a class="dropdown-item" href="{% url 'stiftung:veranstaltung_list' %}">
<i class="fas fa-list me-2"></i>Alle Veranstaltungen
</a></li>
<li><hr class="dropdown-divider"></li>
<li><h6 class="dropdown-header">Aktionen</h6></li>
<li><a class="dropdown-item" href="{% url 'stiftung:veranstaltung_list' %}">
<i class="fas fa-envelope-open-text me-2"></i>Serienbrief drucken
</a></li>
</ul>
</li>
<!-- Geschichte -->
<li class="nav-item">
<a class="nav-link" href="{% url 'stiftung:geschichte_list' %}">