Die Mieter:innenverwaltung des Collegium Academicum
CArtei bündelt an einem Ort, wer bei uns wohnt, wer sich wo engagiert und welche Nachweise vorliegen. Alles rollenbasiert und datenschutzfreundlich: Jede:r sieht genau das, was die eigene Aufgabe erfordert – nicht mehr.
Die wichtigsten Bausteine – in Alltagssprache.
Wer wohnt in welcher WG, welchem Zimmer und welchem Cluster – inklusive Ein- und Auszügen sowie Untermiete.
Jedes Mieter:innen-Profil zeigt Felder je nach Rolle – vom eigenen Profil bis zur Miet- und Finanzverwaltung.
AG- und Initiativen-Engagement erfassen, Fristen im Blick behalten und pro Cluster auswerten.
Immatrikulationsbescheinigungen selbst hochladen; die Verwaltung prüft, bearbeitet und bestätigt sie.
Admin-Kommentare zu Mieter:innen, Clustern und WGs – zugriffsgeschützt und nachvollziehbar (append-only).
Jede Änderung wird auf Datenbankebene automatisch mit Zeitpunkt und Urheber:in im Audit-Trail festgehalten.
Für die Technikbegeisterten: aufklappen und mitlesen.
CArtei ist bewusst in drei eigenständige Repositories geteilt, die nebeneinander entwickelt werden – klare Zuständigkeiten, sauber trennbar.
| Repo | Rolle |
|---|---|
cartei_db | Schema – die Single Source of Truth. SQLAlchemy-2.0-Modelle + Alembic-Migrationen, als Paket veröffentlicht. |
CArtei | Django-5-Webanwendung mit LDAP-Login. Liest und schreibt die Datenbank über managed=False-Spiegelmodelle. |
cartei_deployment | Podman Compose + systemd auf zwei VMs (DB + App), Backups und Bootstrap-Skripte. |
uv (kein bare pip).Mapped[...]) und Alembic-Migrationen.Das Datenmodell existiert nur an einer Stelle: in cartei_db.
Eine Schema-Änderung ist immer ein zweistufiger Schritt – Modell + Alembic-Migration
in cartei_db, danach das gespiegelte managed=False-Modell in Django.
Django besitzt hier keine Domänen-Tabellen: manage.py migrate verwaltet
ausschließlich Auth, Sessions und ContentTypes. Fremdschlüssel-Constraints gehören der
Datenbank, nicht dem Framework.
Sichtbarkeit und Editierbarkeit werden pro Feld aufgelöst (~19 Felder) – anhand der LDAP-Gruppen der angemeldeten Person. Kollidieren mehrere Rollen, greift eine klare Vorrang-Regel.
Views sind mit @login_required und einem @require_group(...)-Decorator
abgesichert; das Profilformular zeigt exakt die Felder, die man bearbeiten darf. Eine
schreibgeschützte Berechtigungsmatrix macht sichtbar, wer was sehen kann.
Jede Änderung wird per PostgreSQL-Trigger nach audit_history geschrieben –
unabhängig davon, wie die Zeile geändert wurde (Django-ORM, rohes SQL,
Migration). Die Datenbank selbst hält es fest.
Die handelnde Person wird pro Request über eine Middleware / Contextvar gesetzt, sodass jeder Eintrag der angemeldeten Nutzer:in zugeordnet ist. Datumsangaben laufen durchgängig im ISO-Format (YMD).
Zwei getrennte VMs (Datenbank + App), betrieben mit Podman Compose. systemd-Oneshot-Services
wrappen podman compose up/down; .timer-Units treiben nächtliches
Image-Update und Backup.
Verschlüsselte Offsite-Backups landen bucket-scoped bei Cloudflare R2 (per rclone). Der
Deploy läuft über curl | bash-Bootstrap-Skripte; ein operations.md-Runbook
dokumentiert den Betrieb.
Wo wir stehen – und was als Nächstes kommt.
Ein zentrales Schema (Building, WG, Room, Tenant, AGAbfrage, EnrollmentProof, InternalNote …), SQLAlchemy 2.0 + Alembic, plus vollständiges Auditing über Postgres-Trigger.
Django 5 mit LDAP-Login, managed=False-Spiegelmodellen, CA-Design und CI.
Inklusive Dashboard, Engagement-Abfragen und Cluster-Auswertung.
Feld-Zugriffsmatrix (~19 Felder), rollen-getrimmtes Profilformular, editierbare Zimmerzuordnung, Untermiete und eine Berechtigungsmatrix für Admins.
Polymorphe internal_note-Tabelle mit LDAP-geschütztem Zugriff, append-only
und Soft-Delete – angezeigt auf der Profilseite.
Self-Service-Upload durch Mieter:innen, Prüfung und Bearbeitung durch die Verwaltung, automatische Berechnung des Gültigkeitsendes (31.3. / 30.9.).
Zwei-VM-Setup mit Podman & systemd, verschlüsselte Offsite-Backups und ein dokumentiertes Runbook. Die aktuellen Builds laufen produktiv.
Nächtliche Auto-Prüfung von Nachweisen (PDF-Text bzw. Vision-Modell), Alarm bei nicht lesbaren Dokumenten und ein eigenes Nachweise-Dashboard.
Die Briefkasten-Umfrage als Abfrage-Workflow abbilden; die Felder auf Tenant
existieren bereits.
Management-Oberfläche und eine CHECK-Grenze, sobald die Limits feststehen.
Ein Reports-Bereich für Nachweise, Engagement-Statistiken und Point-in-Time-History (die Audit-Daten liegen bereits vor, es fehlt der Viewer).
E-Mail-Erinnerungen für Engagement-Fristen und ablaufende Nachweise.
Das internal_note-Schema unterstützt diese Subjekte bereits – es fehlt nur die UI.
Mehrere gleichzeitig offene Abfragen und ein modulares Widget-Grid.
RoomRent (temporal) + Nebenkostenabrechnung in cartei_db;
schaltet die Finanzierung-Rolle und den Zahlungsbereich frei.
Onboarding und Offboarding von Mieter:innen als geführter Ablauf.
Gebäude, WGs und Zimmer selbst verwalten – nicht nur deren Zuordnung.
Bewerber:innen haben die Verschwiegenheitserklärung noch nicht unterschrieben – die Voraussetzung, um aus LDAP nach CArtei geladen zu werden. Braucht einen eigenen Datensatz-Typ, der nicht an LDAP gekoppelt ist.
Priorisierung ist ein Vorschlag – umsortierbar, wie das Team es sieht. Schätzungen sind grobe Story Points (Fibonacci), Stand 14.08.2026.