radeln/rides/management/commands/seed_demo.py
steffen1971 5d967c68b5 Add Radeln ohne Alter ride-coordination demo (Django + HTMX + Leaflet)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 21:20:17 +02:00

149 lines
5.4 KiB
Python

"""Befüllt die Datenbank mit Demo-Daten rund um Saarbrücken-Malstatt.
Idempotent: Fahrten/Fahrgäste/Einrichtungen werden vor dem Anlegen geleert,
die Demo-Nutzer per get_or_create aktualisiert.
"""
from datetime import timedelta
from django.contrib.auth.models import User
from django.core.management.base import BaseCommand
from django.utils import timezone
from rides.models import Availability, Einrichtung, Fahrgast, Profile, Ride, RideStatus, Role
from rides.services import route_geojson
# Reale Orte in/um Saarbrücken (lat, lng)
MALSTATT = (49.2517, 6.9590)
STADEN = (49.2326, 6.9974)
DFG = (49.2236, 6.9637)
SCHLOSS = (49.2310, 6.9960)
BW = (49.2360, 7.0010)
class Command(BaseCommand):
help = "Befüllt die Datenbank mit Demo-Daten (Saarbrücken-Malstatt)."
def handle(self, *args, **options):
Ride.objects.all().delete()
Availability.objects.all().delete()
Fahrgast.objects.all().delete()
Einrichtung.objects.all().delete()
coord = self._user("koordinator", "Mira", "Berg", Role.COORDINATOR, staff=True)
felix = self._user("felix", "Felix", "", Role.PILOT)
anna = self._user("anna", "Anna", "", Role.PILOT)
besteller = self._user("pflege", "Pflegeheim Malstatt", "", Role.REQUESTER)
heim = Einrichtung.objects.create(
name="Seniorenheim Malstatt",
address="Halbergstr. 1, Saarbrücken",
contact="0681 000000",
)
bw = Einrichtung.objects.create(
name="Betreutes Wohnen St. Johann", address="Mainzer Str. 5, Saarbrücken"
)
g1 = Fahrgast.objects.create(
name="Frau Brigitte H.",
einrichtung=heim,
mobility_notes="Rollator, steigt links leichter ein. Mag den Saar-Uferweg.",
)
g2 = Fahrgast.objects.create(
name="Herr Werner K.",
einrichtung=heim,
mobility_notes="Schwerhörig — bitte laut und deutlich sprechen. Decke mitnehmen.",
)
g3 = Fahrgast.objects.create(
name="Frau Anneliese R.",
einrichtung=bw,
mobility_notes="Gut zu Fuß, braucht nur etwas Zeit beim Einsteigen.",
)
now = timezone.now().replace(minute=0, second=0, microsecond=0)
plan = [
dict(
fahrgast=g1,
requested_by=besteller,
when=now + timedelta(days=1, hours=2),
status=RideStatus.REQUESTED,
pickup=("Seniorenheim Malstatt", MALSTATT),
dest=("Staden / Saarufer", STADEN),
),
dict(
fahrgast=g2,
requested_by=coord,
when=now + timedelta(days=1, hours=4),
status=RideStatus.PLANNED,
pickup=("Seniorenheim Malstatt", MALSTATT),
dest=("Deutsch-Französischer Garten", DFG),
),
dict(
fahrgast=g3,
requested_by=coord,
pilot=felix,
when=now + timedelta(days=2, hours=1),
status=RideStatus.CLAIMED,
pickup=("Betreutes Wohnen St. Johann", BW),
dest=("Saarbrücker Schloss", SCHLOSS),
),
dict(
fahrgast=g1,
requested_by=coord,
pilot=anna,
when=now - timedelta(days=2),
status=RideStatus.DONE,
pickup=("Seniorenheim Malstatt", MALSTATT),
dest=("Staden / Saarufer", STADEN),
),
dict(
fahrgast=g2,
requested_by=coord,
pilot=felix,
when=now - timedelta(days=5),
status=RideStatus.DONE,
pickup=("Seniorenheim Malstatt", MALSTATT),
dest=("Saarbrücker Schloss", SCHLOSS),
),
]
for r in plan:
pickup_label, pickup = r["pickup"]
dest_label, dest = r["dest"]
Ride.objects.create(
fahrgast=r["fahrgast"],
requested_by=r["requested_by"],
assigned_pilot=r.get("pilot"),
scheduled_at=r["when"],
status=r["status"],
pickup_label=pickup_label,
pickup_lat=pickup[0],
pickup_lng=pickup[1],
dest_label=dest_label,
dest_lat=dest[0],
dest_lng=dest[1],
route_geojson=route_geojson(pickup, dest),
)
Availability.objects.create(
pilot=felix, start=now + timedelta(days=1), end=now + timedelta(days=1, hours=6)
)
Availability.objects.create(
pilot=felix, start=now + timedelta(days=2), end=now + timedelta(days=2, hours=4)
)
self.stdout.write(
self.style.SUCCESS(f"Demo-Daten erstellt: {len(plan)} Fahrten, 3 Fahrgäste, 4 Nutzer.")
)
self.stdout.write("Login (Passwort 'demo'): koordinator, felix, anna, pflege")
def _user(self, username, first, last, role, staff=False):
user, _ = User.objects.get_or_create(username=username)
user.first_name = first
user.last_name = last
user.is_staff = staff
user.is_superuser = staff
user.set_password("demo")
user.save()
Profile.objects.update_or_create(user=user, defaults={"role": role})
return user