refactor notifications to MVC: extract templates, context, and renderer

- Move all email layout to Jinja2 templates (4 files: admin_new,
  admin_update, parent_confirmation html+txt)
- Extract pure helper/context-builder functions to context.py
  (format_types, calculate_age, format_dob, calculate_monthly_fee,
  format_days, build_admin_new_context, build_admin_update_context,
  build_parent_context)
- Move i18n label strings out of Python into YAML locale files
  (i18n/de.yaml, i18n/en.yaml) — admin-editable without code changes
- Add renderer.py as thin Jinja2 wrapper (render_template)
- Reduce notifier.py to routing + SMTP dispatch only
- Update tests to call context functions directly and render
  templates via renderer instead of calling private builder methods
- Add jinja2 and pyyaml as explicit dependencies in pyproject.toml

https://claude.ai/code/session_01LjjK7RjKVnC8bETtccfgna
This commit is contained in:
Claude
2026-02-23 10:05:03 +00:00
parent b2e04fa07b
commit 54d88d1d64
11 changed files with 699 additions and 596 deletions
@@ -0,0 +1,42 @@
===============================================
NEUE SPIELGRUPPEN-ANMELDUNG
===============================================
Eingereicht: {{ submitted_date }} um {{ submitted_time }} Uhr (UTC)
Kanal: {{ channel }}
Anmelde-ID: {{ registration_id }} (Version {{ version }})
-----------------------------------------------
ANGABEN ZUM KIND
-----------------------------------------------
Name: {{ child_name }}
Geburtsdatum: {{ child_dob }} (Alter: {{ child_age }})
Bes. Bedürfnisse: {{ child_needs }}
-----------------------------------------------
SPIELGRUPPEN-AUSWAHL
-----------------------------------------------
Art: {{ playgroup_types }}
Tage: {{ days }}
Monatlicher Beitrag: {{ monthly_fee }}
(Zzgl. CHF 80 Anmeldegebühr bei Erstanmeldung)
-----------------------------------------------
ELTERN / ERZIEHUNGSBERECHTIGTE
-----------------------------------------------
Name: {{ parent_name }}
Adresse: {{ parent_street }}
{{ parent_postal_code }} {{ parent_city }}
Telefon: {{ parent_phone }}
E-Mail: {{ parent_email }}
-----------------------------------------------
NOTFALLKONTAKT
-----------------------------------------------
Name: {{ emergency_name }}
Telefon: {{ emergency_phone }}
===============================================
Diese Anmeldung wurde über den automatischen Anmeldeassistenten eingereicht.