149 lines
5.4 KiB
Python
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
|