Zum Inhalt

Entwicklung

mandari ist Open Source. Der Code liegt in mehreren Repositories der GitHub-Organisation mandariOSS.

Repository Inhalt
mandari Hauptanwendung mit Insight, Work und Session sowie der Ingestor
marketing-website Öffentliche Website mandari.de (Wagtail)
docs Diese Dokumentation

Entwicklung findet im Hauptrepository auf dem Branch dev statt, main ist der Produktionsstand.

Technologie-Stack

Komponente Technologie
Backend Django 6.1, Python 3.12 oder neuer
Frontend Django-Templates, HTMX, Alpine.js, Tailwind CSS, Tiptap-Editor; TypeScript, gebaut mit Vite
Admin django-unfold
Datenbank PostgreSQL 16
Suche Elasticsearch 8
Cache und Echtzeit Redis 7, Django Channels
Ingestor Python mit httpx und SQLAlchemy, Scraper-Adapter, Prometheus-Metriken
Verschlüsselung AES-256-GCM mit mandantenspezifischen Schlüsseln
Proxy Caddy

Lokal entwickeln

Voraussetzungen: Python 3.12 oder neuer, Node.js 22 oder neuer, Docker (für PostgreSQL, Redis und Elasticsearch) und uv. Die Python-Abhängigkeiten stehen in mandari/pyproject.toml, die gesperrten Versionen in mandari/uv.lock. Eine requirements.txt liegt nicht im Repository; wer sie für pip braucht, erzeugt sie mit sh scripts/export_requirements.sh <datei> aus der Lock-Datei.

git clone https://github.com/mandariOSS/mandari.git
cd mandari

# Datenbank, Cache und Suche starten
docker compose up -d postgres redis elasticsearch

cd mandari
cp ../.env.example .env          # SECRET_KEY und ENCRYPTION_MASTER_KEY eintragen
uv sync --extra dev              # Abhängigkeiten aus uv.lock, mit Test- und Lint-Werkzeugen
npm ci && npm run build          # Frontend bauen

uv run python manage.py migrate
uv run python manage.py setup_roles
uv run python manage.py createsuperuser
uv run python manage.py runserver

Die Anwendung läuft dann unter http://localhost:8000. Für die Frontend-Entwicklung mit Hot Reload laufen npm run watch und DJANGO_VITE_DEV_MODE=1 uv run python manage.py runserver nebeneinander. Eine neue Abhängigkeit kommt mit uv lock in die Lock-Datei; pyproject.toml und uv.lock gehören in denselben Commit.

Für einen schnellen Überblick über alle drei Portale eignet sich die Demo-Umgebung. Die Datei AGENTS.md im Repository beschreibt Architektur, Apps, Berechtigungssystem und Konventionen ausführlich, CONTRIBUTING.md die Entwicklungsumgebung und die Prüfungen, docs/ENGINEERING_STANDARDS.md die Regeln für neuen Code.

Tests

Die Testsuite läuft mit pytest:

cd mandari
uv run pytest apps/work/tasks -q                 # einzelne App
uv run pytest -n auto -m "not migrationen"       # parallel, ohne Migrationstests

Neben den Unit-Tests gibt es eine Reihe von Smoke-Tests unter scripts/smoke_*.py. Jeder läuft selbst enthalten auf einer frischen SQLite-Datenbank und prüft ein Feature Ende-zu-Ende, inklusive Berechtigungen, Mandantentrennung und der Garantie, dass nur öffentliche Inhalte nach außen gelangen. Beispiele:

Skript Prüft
smoke_oparl_api.py OParl-Aggregations-API mit synthetischen Daten aller Objekttypen
smoke_tombstones.py Tombstone-Verhalten in Sync, Portal und API
smoke_session_oparl.py Session-OParl-API inklusive Beweis, dass nichts Nicht-Öffentliches ausgeliefert wird
smoke_insight_durchstich.py Weg einer Session-Kommune ins Bürgerportal
smoke_ris_submission.py Digitale Antragseinreichung von Work nach Session
smoke_faction_meetings.py Fraktionssitzungen und öffentliche Fraktions-API
smoke_demo_environment.py Demo-Umgebung anlegen, prüfen, aufräumen

Die CI führt Linting, Tests, Smoke-Tests und einen Template-Check aus, der mehrzeilige Inline-Kommentare in Django-Templates ablehnt, weil sie sonst als Text auf der Seite landen würden.

Mitwirken

Lizenz und Abhängigkeiten

Der Quellcode steht unter einer Open-Source-Lizenz, die in den Repositories angegeben ist. Eine Übersicht der eingesetzten Bibliotheken mit Lizenzen findest du unter Abhängigkeiten (SBOM).