Stabilize AMSC chart detail overlays
This commit is contained in:
@@ -419,6 +419,13 @@ async def _get_city_chart_data(city: str, *, force_refresh: bool) -> Dict[str, A
|
||||
fn=_overlay_cached_runway_history_from_db,
|
||||
args=(city, payload),
|
||||
)
|
||||
payload = await _run_optional_city_chart_overlay(
|
||||
city=city,
|
||||
overlay_name="amsc_latest_raw",
|
||||
payload=payload,
|
||||
fn=overlay_latest_amsc_observation,
|
||||
args=(legacy_routes._CACHE_DB, city, payload),
|
||||
)
|
||||
return await _run_optional_city_chart_overlay(
|
||||
city=city,
|
||||
overlay_name="wunderground_current",
|
||||
|
||||
@@ -88,6 +88,11 @@ def _to_float(value: Any) -> Optional[float]:
|
||||
return None
|
||||
|
||||
|
||||
def _amsc_payload_has_observation(raw_payload: dict[str, Any]) -> bool:
|
||||
temp = raw_payload.get("temp_c") if raw_payload.get("temp_c") is not None else raw_payload.get("temp")
|
||||
return _to_float(temp) is not None
|
||||
|
||||
|
||||
def _latest_amsc_row(db: Any, city: str) -> tuple[Optional[dict[str, Any]], Optional[dict[str, Any]]]:
|
||||
getter = getattr(db, "get_latest_raw_observation", None)
|
||||
if not callable(getter):
|
||||
@@ -100,9 +105,26 @@ def _latest_amsc_row(db: Any, city: str) -> tuple[Optional[dict[str, Any]], Opti
|
||||
if not isinstance(row, dict):
|
||||
return None, None
|
||||
raw_payload = row.get("payload")
|
||||
if not isinstance(raw_payload, dict) or not raw_payload:
|
||||
return row, None
|
||||
return row, raw_payload
|
||||
if isinstance(raw_payload, dict) and raw_payload and _amsc_payload_has_observation(raw_payload):
|
||||
return row, raw_payload
|
||||
|
||||
lister = getattr(db, "list_latest_raw_observations_for_city", None)
|
||||
if callable(lister):
|
||||
try:
|
||||
candidates = lister(city, limit=20)
|
||||
except Exception as exc:
|
||||
logger.debug("latest AMSC raw fallback list failed city={}: {}", city, exc)
|
||||
candidates = []
|
||||
for candidate in candidates if isinstance(candidates, list) else []:
|
||||
if not isinstance(candidate, dict):
|
||||
continue
|
||||
if str(candidate.get("source") or "").strip().lower() != "amsc_awos":
|
||||
continue
|
||||
candidate_payload = candidate.get("payload")
|
||||
if isinstance(candidate_payload, dict) and _amsc_payload_has_observation(candidate_payload):
|
||||
return candidate, candidate_payload
|
||||
|
||||
return row, None
|
||||
|
||||
|
||||
def _raw_observation_update(
|
||||
|
||||
Reference in New Issue
Block a user