""" 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 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]