teecup/app/target_points.py

62 lines
2.2 KiB
Python
Raw Normal View History

"""
Rangefinder-koordinater (migrasjon 065/079) -- avstand til green/hindringer,
GPS-basert. Delt mellom rounds.py (frittstående runder), individual_
tournaments.py (org-turnering, individuell slagspill) og scoring.py
(org-turnering, lag-matchplay) -- alle tre løser sin egen kontekst om til
samme `CourseKey` (se hole_history.py, som denne modulen gjenbruker banen-
bro-abstraksjonen fra) og kaller `get_target_points()` her.
To kildetabeller, ingen RLS noen av dem (globale, delt tvers av
organisasjoner/brukere som tilfeldigvis bruker samme fysiske bane -- samme
begrunnelse som golfapi_course_coordinate alltid har hatt): `golfapi_
course_coordinate` (GolfAPI-importerte baner) og `teeoff_course_coordinate`
(ekte teeoff-baner, migrasjon 079). Fordi ingen av dem er RLS-beskyttet,
virker `get_target_points()` uendret uansett om `conn` kommer fra
`plain_connection()` eller `org_connection()`.
"""
from __future__ import annotations
from asyncpg import Connection
from pydantic import BaseModel
from .hole_history import CourseKey
class TargetPoint(BaseModel):
poi_type: str
location: str | None
side_fairway: str | None
latitude: float
longitude: float
hazard_group: str | None
async def get_target_points(conn: Connection, course_key: CourseKey | None, hole_number: int) -> list[TargetPoint]:
if course_key is None:
return []
kind = course_key[0]
if kind == "teeoff":
_, facility_slug, teeoff_course_id = course_key
rows = await conn.fetch(
"""
SELECT poi_type, location, side_fairway, latitude, longitude, hazard_group
FROM teeoff_course_coordinate
WHERE external_course_ref = $1 AND hole_number = $2
""",
f"{facility_slug}:{teeoff_course_id}",
hole_number,
)
else:
_, golfapi_course_id = course_key
rows = await conn.fetch(
"""
SELECT poi_type, location, side_fairway, latitude, longitude, hazard_group
FROM golfapi_course_coordinate
WHERE golfapi_course_id = $1 AND hole_number = $2
""",
golfapi_course_id,
hole_number,
)
return [TargetPoint(**dict(r)) for r in rows]