CluHu-Funktionen jenseits des Kerns (Mitglieder/Personen) sind Addons, die pro Verein aktiviert werden.
apps/core/addons_catalog.py::ADDONS (25 Einträge) — Marketing-Daten (Titel, Beschreibung, Kategorie, SVG-Hero). Lebt weiter für Landingpage und öffentlichen Schauraum /addons/.AddonCatalog — wird per python manage.py seed_addon_catalog aus dem statischen Katalog befüllt (idempotent). Zusatzfelder: price_chf, trial_days (Default 30), terms_version, is_published, Detail-Popup-Inhalte. Der Addon-Store rendert aus der DB.⚠️ Deploy-Falle: Nach Katalog-Änderungen immer seed_addon_catalog ausführen — sonst zeigt der Store den alten Stand. Entfernte Slugs werden auf is_published=False gesetzt.
/clucore/addons/)AuthRoleAssignment, nicht Django-Permissions)_compute_addon_gating): Mehrpersonen braucht ≥1 Mitglied; Firmen-Mitglieder braucht aktives Firmen-Addon + Mitglieder. Geblockte Addons zeigen den Grund als Textbilling_status='trial' mit trial_ends_at = now + trial_daysClubAddonTermsAcceptance existiert noch als Audit-Modell, wird aber nicht mehr befüllt.)billing_status='cancelled' — die Zeile bleibt (Audit, Reaktivierung nutzt dieselbe Zeile)AddonCatalog.long_description/video_url/image_urls, core-Migration 0005), Gating-Grund, Aktivieren/Deaktivieren./admin/core/clubaddon/)Plattform-Admin-Weg mit Bulk-Aktionen.
⚠️ Das active-Feld ist eine Falle: Massgeblich ist billing_status (+ trial_ends_at), nicht active — das ist nur ein denormalisierter Schnellzugriff. Wer im Admin nur active=True setzt, aber billing_status='cancelled' lässt, aktiviert nichts. Praktisch korrekt: billing_status='active' setzen.
Kein Cronjob: billing_status='trial' mit vergangenem trial_ends_at fällt einfach aus den Queries (is_active() bzw. der Sidebar-Query). expired wird nirgends automatisch gesetzt.
get_sidebar_items_for_club(club) (apps/core/menu.py) lädt aktive Keys und fügt die passenden ADDON_MENU_ITEMS (aktuell: kalender, news, faktura „Rechnungen", gruppen, firmen, webseiten-builder) zwischen „Personen" und „Addon-Store" ein. Defensiv: jede Exception → Addons fehlen einfach (kein 500).
Addons ohne Menüpunkt sind normal: mehrpersonen-mitgliedschaft und firmen-mitglieder schalten Verhalten frei (Canvas-Views, Slots) statt einen Menüpunkt zu zeigen.
Grundsatz (User-Entscheid): kein @requires_addon-Gate auf den eingefrorenen Views — Direkt-URLs (z. B. /clucore/gruppen/) funktionieren auch ohne aktives Addon; das Addon steuert nur die Menü-Sichtbarkeit.
Ausnahmen (hartes View-Gate via club_has_addon): die Mapping-/Canvas-Views (Mehrpersonen, Firmen-Mitglieder) und die News-App (@require_addon('news') mit Upsell-Seite).
| Status | Addon | Abo-Stufe |
|---|---|---|
| ✅ Verfügbar | Kalender | Basis |
| ✅ Verfügbar | News | Basis |
| ✅ Verfügbar | Gruppen | Basis |
| ✅ Verfügbar | Firmen | Basis |
| ✅ Verfügbar | Mehrpersonen-Mitgliedschaft | Basis |
| ✅ Verfügbar | Firmen Mitglieder | Pro (30 Tage Trial) |
| ✅ Verfügbar | Faktura (Rechnungen Swiss QR) | Basis |
| ✅ Verfügbar | Webseiten-Builder | Basis |
| 🔲 Geplant | ~17 weitere | Basis / Pro / Einzel-Abo / Set |
vereins-rollen) und 31 (personen) wurden entfernt, weil die Top-Level-Seiten das Feature abdecken; Nr. 23 (mitglieder-portal/Intranet) wurde mit v0.20.0 entfernt — Berechtigungen & Clu-Portal sind Standard statt Addon.kalender → apps/events); Faktura hält sie (faktura → apps/faktura).docs/addons.md im Repo ist auf Stand v0.14.91 eingefroren und in mehreren Punkten überholt — dieses Wiki ist aktueller.Was kann es. Das Detail-Popup (auf Desktop 896 px) ist eine kleine Produktseite: Intro mit dem Mehrwert, ein bis fünf Bildschirmfotos in voller Breite mit Bildtext, Highlights und Anwendungsbeispiele, dann Meta und Buttons. Klick auf ein Bild öffnet die Lightbox (Bild in 100 %, Zähler, Pfeile, Esc, Wischen); dasselbe Bauteil nutzt der Datei-Browser. Klick auf die Kachel öffnet das Popup; Status und Abo stehen rechts vom Titel, Voraussetzungen als eigene Box (v0.26.25). Geplante Addons zeigen dasselbe Layout ohne Screens. News ist ein normaler Katalogeintrag statt Seed-Sonderfall.
Warum so. Die redaktionellen Texte liegen im Code (addon_details.py) statt in der Datenbank: versioniert, vom Seed nicht überschrieben, auf der Landingpage wiederverwendbar (die Funktionen-Seite liest dieselben Screens). Die Katalog-Stammdaten (Titel, Beschreibung, Zielgruppe, Preis) liegen dagegen in der Tabelle addon_catalog und werden mit manage.py seed_addon_catalog aus addons_catalog.py nachgeführt; nach jeder Textänderung dort ist der Seed Pflicht (Lehre v0.28.38). Die 24 Bilder (rund 3 MB) laden erst beim Öffnen. Hover-Animationen wurden erst ganz entfernt (v0.26.25) und dann nur für Desktop mit echtem Zeiger zurückgeholt (v0.26.26); auf dem Handy gibt es kein Hover, dort bleiben sie aus. Die Portal-Bilder der Addons sind bewusst verschieden: Kalender zeigt das Dashboard mit Terminen, Webseiten-Builder den Datei-Browser, Buchhaltung die Revision; beim Webseiten-Builder ersetzt die Sponsorenseite die Versionen-Liste (v0.26.29), damit ein Verein das Ergebnis sieht statt ein Editor-Internum (Einschätzung).