Add leader contact section to parent confirmation email templates

Both .html.j2 and .txt.j2 now include a CONTACT section after the
emergency block. It conditionally shows Andrea Sigrist (indoor) and/or
Barbara Gross (outdoor) plus Markus Graf (admin) with phone and email,
rendered as clickable links in HTML.

Adds the required template variables (has_outdoor, leader_indoor_*,
leader_outdoor_*, admin_*) to build_parent_context in context.py, and
the matching label strings to de.yaml (LLM-translated for other langs).

https://claude.ai/code/session_01Qikq92MrNk95ZXtatPyJJh
This commit is contained in:
Claude
2026-02-27 19:18:59 +00:00
parent 55d5567e54
commit aa3686c6a9
4 changed files with 74 additions and 1 deletions
+22
View File
@@ -14,6 +14,18 @@ QR_STREET = "Huebwisstrase 5"
QR_PCODE = "8117"
QR_CITY = "Fällanden"
LEADER_INDOOR_NAME = "Andrea Sigrist"
LEADER_INDOOR_PHONE = "079 674 99 92"
LEADER_INDOOR_EMAIL = "andrea.sigrist@gmx.net"
LEADER_OUTDOOR_NAME = "Barbara Gross"
LEADER_OUTDOOR_PHONE = "078 761 19 64"
LEADER_OUTDOOR_EMAIL = "baba.laeubli@gmail.com"
ADMIN_NAME = "Markus Graf"
ADMIN_PHONE = "079 261 16 37"
ADMIN_EMAIL = "spielgruppen@familien-verein.ch"
# ---------------------------------------------------------------------------
# Formatting helpers (pure functions, no side-effects)
# ---------------------------------------------------------------------------
@@ -187,7 +199,17 @@ def build_parent_context(
"days": format_days_i18n(registration, strings),
"monthly_fee": calculate_monthly_fee(registration),
"has_indoor": "indoor" in registration.booking.playgroup_types,
"has_outdoor": "outdoor" in registration.booking.playgroup_types,
"has_qr": has_qr,
"leader_indoor_name": LEADER_INDOOR_NAME,
"leader_indoor_phone": LEADER_INDOOR_PHONE,
"leader_indoor_email": LEADER_INDOOR_EMAIL,
"leader_outdoor_name": LEADER_OUTDOOR_NAME,
"leader_outdoor_phone": LEADER_OUTDOOR_PHONE,
"leader_outdoor_email": LEADER_OUTDOOR_EMAIL,
"admin_name": ADMIN_NAME,
"admin_phone": ADMIN_PHONE,
"admin_email": ADMIN_EMAIL,
"parent_name": pg.full_name or "",
"parent_address": pg.street_address or "",
"parent_postal_code": pg.postal_code or "",
+10 -1
View File
@@ -39,8 +39,17 @@ iban_label: "IBAN"
payee_label: "Empfänger"
amount_label: "Betrag"
contact_section: "Deine Ansprechpersonen"
contact_intro: "Bei Fragen kannst du dich direkt an die zuständige Spielgruppenleiterin wenden:"
contact_indoor_label: "Innenspielgruppe"
contact_outdoor_label: "Waldspielgruppe"
contact_admin_label: "Administration"
contact_name: "Name"
contact_phone: "Telefon"
contact_email: "E-Mail"
closing: |
Bei Fragen stehen wir dir gerne zur Verfügung. Wir freuen uns auf dein Kind!
Wir freuen uns auf dein Kind!
Herzliche Grüsse
Spielgruppe Pumuckl
@@ -74,6 +74,27 @@
<tr><td style="padding:4px 0;color:#666;">{{ strings.emergency_phone }}</td><td>{{ emergency_phone }}</td></tr>
</table>
<h2 style="color:#2e7d32;border-bottom:2px solid #2e7d32;padding-bottom:4px;font-size:16px;">{{ strings.contact_section }}</h2>
<p>{{ strings.contact_intro }}</p>
<table style="width:100%;border-collapse:collapse;">
{% if has_indoor %}
<tr><td colspan="2" style="padding:8px 0 2px;font-weight:bold;">{{ strings.contact_indoor_label }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;width:55%;">{{ strings.contact_name }}</td><td>{{ leader_indoor_name }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;">{{ strings.contact_phone }}</td><td><a href="tel:{{ leader_indoor_phone }}" style="color:#2e7d32;">{{ leader_indoor_phone }}</a></td></tr>
<tr><td style="padding:2px 0 8px 16px;color:#666;">{{ strings.contact_email }}</td><td><a href="mailto:{{ leader_indoor_email }}" style="color:#2e7d32;">{{ leader_indoor_email }}</a></td></tr>
{% endif %}
{% if has_outdoor %}
<tr><td colspan="2" style="padding:8px 0 2px;font-weight:bold;">{{ strings.contact_outdoor_label }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;width:55%;">{{ strings.contact_name }}</td><td>{{ leader_outdoor_name }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;">{{ strings.contact_phone }}</td><td><a href="tel:{{ leader_outdoor_phone }}" style="color:#2e7d32;">{{ leader_outdoor_phone }}</a></td></tr>
<tr><td style="padding:2px 0 8px 16px;color:#666;">{{ strings.contact_email }}</td><td><a href="mailto:{{ leader_outdoor_email }}" style="color:#2e7d32;">{{ leader_outdoor_email }}</a></td></tr>
{% endif %}
<tr><td colspan="2" style="padding:8px 0 2px;font-weight:bold;">{{ strings.contact_admin_label }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;width:55%;">{{ strings.contact_name }}</td><td>{{ admin_name }}</td></tr>
<tr><td style="padding:2px 0 2px 16px;color:#666;">{{ strings.contact_phone }}</td><td><a href="tel:{{ admin_phone }}" style="color:#2e7d32;">{{ admin_phone }}</a></td></tr>
<tr><td style="padding:2px 0 8px 16px;color:#666;">{{ strings.contact_email }}</td><td><a href="mailto:{{ admin_email }}" style="color:#2e7d32;">{{ admin_email }}</a></td></tr>
</table>
<p style="margin-top:24px;white-space:pre-line;">{{ strings.closing }}</p>
</div>
@@ -46,6 +46,27 @@
{{ strings.emergency_name }}: {{ emergency_name }}
{{ strings.emergency_phone }}: {{ emergency_phone }}
===============================================
{{ strings.contact_section | upper }}
===============================================
{{ strings.contact_intro }}
{% if has_indoor %}
{{ strings.contact_indoor_label }}
{{ strings.contact_name }}: {{ leader_indoor_name }}
{{ strings.contact_phone }}: {{ leader_indoor_phone }}
{{ strings.contact_email }}: {{ leader_indoor_email }}
{% endif %}
{% if has_outdoor %}
{{ strings.contact_outdoor_label }}
{{ strings.contact_name }}: {{ leader_outdoor_name }}
{{ strings.contact_phone }}: {{ leader_outdoor_phone }}
{{ strings.contact_email }}: {{ leader_outdoor_email }}
{% endif %}
{{ strings.contact_admin_label }}
{{ strings.contact_name }}: {{ admin_name }}
{{ strings.contact_phone }}: {{ admin_phone }}
{{ strings.contact_email }}: {{ admin_email }}
-----------------------------------------------
{{ strings.closing }}