Add Radeln ohne Alter ride-coordination demo (Django + HTMX + Leaflet)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
commit
5d967c68b5
40 changed files with 2040 additions and 0 deletions
0
rides/management/commands/__init__.py
Normal file
0
rides/management/commands/__init__.py
Normal file
149
rides/management/commands/seed_demo.py
Normal file
149
rides/management/commands/seed_demo.py
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
"""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
|
||||
Loading…
Add table
Add a link
Reference in a new issue