Key: kalender · App: apps/events · Plan: Basis (gratis) · Seit: v0.18.0/v0.18.1 (Juli 2026)
Zentraler Vereinskalender (/clucore/kalender/) mit Monats-/Wochen-/Listen-Ansicht, Swipe-Navigation, Serien-Baukasten und farbigen Kategorien.
Die App ist das führende System; externe Kalender sind reine Anzeige. Deshalb:
Serientermine werden materialisiert (jedes Vorkommen = eigene Event-Zeile, Outlook-Muster: freq/interval/weekdays/monthly_mode/nth, Ende via count oder until) statt zur Laufzeit expandiert — einfaches Editieren einzelner Vorkommen. Sicherheitskappe: max. 104 Vorkommen.
invite_mode)| Art | Verhalten |
|---|---|
silent |
ohne Info in die Kalender der Empfänger buchen |
inform |
Info-Mail, Status fixed |
request |
Anfrage mit Zusage/Absage, Status pending/accepted/declined |
Bei Zeitänderung je nach Art: request → alle Invites zurück auf pending + neue Anfrage; inform → Info-Mail; silent → still.
EventRecipient = Person, Gruppe oder ganzer Verein. Gruppen/Verein werden laufend synchronisiert (Django-Signals): Gruppenbeitritt erzeugt nachträglich Invites für künftige Termine, Austritt löst Absage-Mails aus (nur bei fixed/accepted — Abgelehnte werden still entfernt). Neue Personen bekommen automatisch Invites für künftige „Ganzer Verein"-Termine.
Gegenseitige Sichtbarkeit (Eingeladene sehen sich z.B. um untereinander Fahrgemeinschaften zu organisieren): ab 19 Empfängern zwangsweise deaktiviert wegen Datenschutz (nicht dass sich z.B. 150 Personen gegenseitig sehen) (MUTUAL_VISIBILITY_MAX=18).
GET /kalender/antwort/<token>/ — Bestätigungsseite ohne Login; bewusst kein Ein-Klick („kein Ein-Klick-Unfall"): erst der POST setzt den Status. ?a=zusagen|absagen steuert die Vorauswahl. Token wird nach Terminende/Absage ungültigGET /kalender/ics/<token>.ics — persönlicher Feed pro Person (Token OneToOne, ohne Login). Abgelehnte Termine fehlen; Horizont 90 Tage rückwärts; Antwort-Link in der Beschreibung; Cache-Control: private, max-age=300expand_household: Haushaltsmitglieder einer eingeladenen Person werden Mit-Informierte und Stellvertreter (EventInviteProxy):
responded_by protokolliert wer)Löst ein Token kein Invite auf, wird er automatisch als Proxy-Token versucht.
event_create liefert eine no_email-Liste zur Warnungfail_silently=True — kein Retry, keine Queue („robustes Mail-System folgt separat")organizer ist reine Fach-Info (nicht der Ersteller)/api/events/ (Zeitfenster mit Überlappungslogik), create/, <uuid> GET/PATCH/DELETE mit scope=single|series, preview-recipients/ (Live-Zähler inkl. Haushalts-Personen), categories/