* Datenmodell + Alembic-Initialmigration (Plan §4), Seed Saison 2026 * Wertungs-Engine (Plan §3.3), regelbasiert je Kategorie/Saison - Abnahmetest gegen die Ergebnisliste 2026-05-31 * Meisterschaftsberechnung mit Streichresultaten + Tie-Break (PLATZHALTER-Punktetabelle, O-1 offen) * Ingest-API (idempotent, dry_run) inkl. Excel-Leser und Fahrer-Matching/Merge * Zeitmessungs-Endpoint (Batch, idempotent, unzugeordnet/unplausibel) + SSE-Anzeige - Mess-Pi-Client bewusst NICHT enthalten (docs/zeitmessung-endpoint.md) * Frontend: öffentliche Seiten + internes Backend (Jinja2/HTMX, kein Build) * Auslieferung: Docker (multi-arch) + docker-compose sowie Debian-Paket/APT-Repo * 57 Tests grün gegen echte PostgreSQL-Testdatenbank Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
79 lines
2.0 KiB
Python
79 lines
2.0 KiB
Python
"""Kleine Helfer zum Aufbau von Testdaten."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import date
|
|
|
|
from sqlalchemy import select
|
|
|
|
from oamc.models import (
|
|
Ergebnis,
|
|
Fahrer,
|
|
Klasse,
|
|
Start,
|
|
Turnier,
|
|
Veranstaltung,
|
|
Verein,
|
|
)
|
|
from oamc.models.enums import StartStatus, TurnierStatus, VeranstaltungStatus
|
|
|
|
|
|
def klasse(db, code="J 3"):
|
|
return db.scalars(select(Klasse).where(Klasse.code == code, Klasse.saison_jahr == 2026)).one()
|
|
|
|
|
|
def verein(db, name="OAMC Reinheim e.V. im ADAC"):
|
|
return db.scalars(select(Verein).where(Verein.name == name)).first()
|
|
|
|
|
|
def veranstaltung(db, *, datum=date(2026, 5, 31), titel="Testturnier", status=VeranstaltungStatus.LAUFEND):
|
|
v = Veranstaltung(datum=datum, titel=titel, ort="Reinheim", status=status, ist_doppelturnier=False)
|
|
db.add(v)
|
|
db.flush()
|
|
return v
|
|
|
|
|
|
def turnier(db, v=None, *, name="Reinheim", zaehlt_meisterschaft=True, aktiv=False,
|
|
status=TurnierStatus.LAUFEND, flush=True):
|
|
v = v or veranstaltung(db)
|
|
t = Turnier(
|
|
veranstaltung_id=v.id, name=name, zaehlt_meisterschaft=zaehlt_meisterschaft,
|
|
ist_aktiv=aktiv, status=status,
|
|
)
|
|
db.add(t)
|
|
if flush:
|
|
db.flush()
|
|
return t
|
|
|
|
|
|
def fahrer(db, nachname="Mustermann", vorname="Max", geburtsjahr=2014):
|
|
f = Fahrer(nachname=nachname, vorname=vorname, geburtsjahr=geburtsjahr)
|
|
db.add(f)
|
|
db.flush()
|
|
return f
|
|
|
|
|
|
def start(db, t, f, k, *, startnummer, status=StartStatus.GESTARTET, wertungsklasse_id=None,
|
|
flush=True):
|
|
s = Start(
|
|
turnier_id=t.id, fahrer_id=f.id, klasse_id=k.id, startnummer=startnummer,
|
|
status=status, wertungsklasse_id=wertungsklasse_id,
|
|
)
|
|
db.add(s)
|
|
if flush:
|
|
db.flush()
|
|
return s
|
|
|
|
|
|
def ergebnis(db, s, *, zeit=None, fehler=None, zeit_fertig=True, fehler_fertig=True):
|
|
e = Ergebnis(
|
|
start_id=s.id,
|
|
summe_zeit=zeit,
|
|
summe_fehler=fehler,
|
|
zeit_vollstaendig=zeit_fertig,
|
|
fehler_vollstaendig=fehler_fertig,
|
|
)
|
|
db.add(e)
|
|
db.flush()
|
|
return e
|