{# … #}-Django-Kommentare sind IMMER ein Bug — Django entfernt nur einzeilige. Im <script> brechen sie das gesamte JS (v0.15.7: Vue-App crashte, Import-Button postete ins Leere), im HTML erscheinen sie als sichtbarer Text. Regel: immer {% comment %} verwenden.{{ }} braucht {% verbatim %} — und Django-Kommentare innerhalb von {% verbatim %} erscheinen wörtlich.max-h-[85vh]) können im lokal gebauten CSS fehlen → kritische Layout-Werte inline als style setzen. Ebenso: parallele hidden flex-Klassen, deren Gewinner von der CSS-Reihenfolge abhängt → Inline-Display für Modals.output.css hat seit v0.16.73 den Cache-Buster ?v={{CLUHU_VERSION}} (Context-Processor) — davor zeigte iOS/Safari tagelang alten Stand („Canvas zerfiel").?v=0.16.xx in Templates) — bei „unerklärlichen" Frontend-Bugs zuerst Hard-Refresh probieren. Mehrfach war ein vermeintlicher Bug nur Browser-Cache.visibleColumns/columnOrder aus alten Sessions machen neue Spalten unsichtbar (_mergeColumnOrder behebt das teilweise).Person.user ist SET_NULL, die Tenant-Middleware verlangt aber user.person. Person eines Users löschen = User ausgesperrt. AuthRoleAssignment hat zudem CASCADE auf Person. Deshalb: Bulk-Deletes schonen Login-Personen immer.OnboardingVerification überlebt User-Deletes — beim Komplett-Wipe eines Test-Users die Verification per E-Mail separat löschen.ClubAddon.active ist nicht massgeblich — billing_status zählt (Details).?filter[…]=) werden in der Session gemerkt und bleiben bis zum manuellen Entfernen aktiv.5.0 → wird zu '5' normalisiert.MAX_PROBE_ROWS ab — Dateien wurden stillschweigend abgeschnitten. Zusätzlich vergiftete der erste IntegrityError die ganze Transaktion → seither Savepoint pro Zeile.select_for_update-Status-Claiming.pattern-Attribut blockierte einen Submit clientseitig komplett (gar kein Request) — Server-Validation ist die Single Source of Truth, pattern entfernt. (Ursprung: Bestätigungstext „ALLE LOESCHEN" ohne Umlaut vs. Eingabe mit Umlaut.){% csrf_token %} passierte → @ensure_csrf_cookie + Token aus Cookie lesen.@click.prevent auf Checkboxen: Browser stellt den Zustand nach dem Microtask zurück → Checkboxen wirken eingefroren. Lösung: deterministisches Vanilla-JS.ALLOWED_IMPORT_EXTS → HTTP 500) — seither AST-Vergleich als Vollständigkeits-Check.from .models zeigte auf die falsche App → ImportError erst zur Laufzeit im Import-Pfad.| URL/Parameter | Wirkung |
|---|---|
/clucore/mitglieder/zuordnung/?view=canvas|list|firmen |
Canvas / Simpel-Modus / Firmen-Canvas |
?filter[member_number]=… / ?filter[person_number]=… |
„Springen"-Filter, funktioniert auf jeder Liste |
/clucore/mitglieder/?manual=1 |
Empty-State überspringen |
/kalender/antwort/<token>/?a=zusagen|absagen |
Magic-Link mit Vorauswahl |
00000 = Owner; Mitgliedernummern-Autovergabe ab max+1 (min. 1000)status=passiv + exited=True; Austrittsdatum impliziert exitedmember_reset_all räumt auch Waisen ab (Personen ohne Login, verwaiste Adressen/Telefone, leere Feld-Definitionen)fail_silently — kein Retry/Queuelink_address_member, link_phone_number_member, ClubImportColumnMap, Batch.member_display_name_columnsDer runserver-Autoreloader im web-Container stirbt bei langer Laufzeit still — der Live-Prozess serviert dann tagealten Python-Code, während DB-Migrationen und Templates aktuell sind. Symptome: kaputte Seiten, extrem langsame Requests, nginx-504 (so beim Mitglieder-Import erlebt). ⚠️ manage.py shell-Tests sehen das NICHT (frischer Prozess mit aktuellem Code).
Regel: Nach jedem Merge mit Python-Änderungen cd /srv/cluhu/code && docker compose restart web. Diagnose-Trick: die Ordnernamen unter /app/import_logs/ tragen die CLUHU_VERSION, die der Live-Prozess geladen hat — mit apps/core/views.py vergleichen.
CLUHU_VERSION stand wochenlang auf v0.16.80, obwohl die Changelog-Einträge weiterliefen: verkettete sed-Bumps (s/v0.16.94/v0.16.95/ …) liefen teils im falschen Verzeichnis ins Leere — und weil jeder Bump das Muster des vorherigen erwartet, schlugen ALLE Folge-Bumps still fehl. Folge: der ?v=-Cache-Buster für CSS/JS war eingefroren; Browser zeigten teils alten Stand trotz Hard-Reload.
Regel: Versions-Bumps (und alle verketteten Ersetzungen) mit absolutem Pfad und assert count==1 (Python) statt stummem sed; Ergebnis per grep belegen.