61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
|
|
"""
|
||
|
|
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 på noen av dem (globale, delt på 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
|
||
|
|
|
||
|
|
|
||
|
|
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
|
||
|
|
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
|
||
|
|
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]
|