Files
OAMC-Auswertung/tests/factories.py
T
linusandClaude Sonnet 5 c33aaa1a4b Meisterschaft: eine pro Saison, mit zugeordneten Turnieren
Auf Vorgabe des Auftraggebers umgestellt:
* genau eine Meisterschaft je Saison (unique auf saison_jahr)
* turnier.meisterschaft_id (nullable FK) statt bool zaehlt_meisterschaft;
  NULL = "o. M.". Kompat-Property turnier.zaehlt_meisterschaft bleibt.
* Teilwertungen (Erwachsene-Gesamt, Jugend J1-J5) sind (Kategorie, Klasse)-
  Sichten auf die eine Meisterschaft, keine eigenen Zeilen mehr
* meisterschaft_stand: kategorie + klasse_id + Unique je Wertung/Fahrer
* berechne_stand(kategorie=, klasse_id=), wertungen_fuer(), berechne_alle_wertungen()
* Read-API: /meisterschaften/{id}/stand[?wertung=], .../endlauf-qualifikation?wertung=
* Ingest: POST /turniere haengt zaehlende Turniere an die Jahres-Meisterschaft
* Initialmigration neu erzeugt (Projekt noch nicht ausgerollt); Seed: eine
  "HTH-Meisterschaft <jahr>"
* Tests angepasst/ergaenzt (61 gruen)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-05 19:52:25 +02:00

87 lines
2.3 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,
Meisterschaft,
Start,
Turnier,
Veranstaltung,
Verein,
)
from oamc.models.enums import StartStatus, TurnierStatus, VeranstaltungStatus
def meisterschaft(db, jahr=2026):
"""Die eine Meisterschaft der Saison (aus dem Seed)."""
return db.scalars(select(Meisterschaft).where(Meisterschaft.saison_jahr == jahr)).one()
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", meisterschaft=None, aktiv=False,
status=TurnierStatus.LAUFEND, flush=True):
"""``meisterschaft``: Meisterschaft-Objekt (zaehlt zur Jahreswertung) oder None."""
v = v or veranstaltung(db)
t = Turnier(
veranstaltung_id=v.id, name=name,
meisterschaft_id=meisterschaft.id if meisterschaft is not None else None,
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