From 95c2258db0cf4e835553ccf97386be2c7b8e3776 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Fri, 29 May 2026 21:56:57 +0800 Subject: [PATCH] Fix Turkey MGM panel history --- tests/test_country_networks.py | 46 +++++++++++++++++++++++++++++++++- web/analysis_service.py | 32 +++++++++++++++++++++-- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/tests/test_country_networks.py b/tests/test_country_networks.py index fd259c76..10c1854d 100644 --- a/tests/test_country_networks.py +++ b/tests/test_country_networks.py @@ -6,7 +6,11 @@ from src.data_collection.city_registry import ALIASES, CITY_REGISTRY from src.data_collection.city_time import CITY_TIME_ZONES, get_city_utc_offset_seconds from src.data_collection import metar_sources from src.data_collection.metar_sources import MetarSourceMixin -from web.analysis_service import _build_city_detail_payload, _build_intraday_meteorology +from web.analysis_service import ( + _build_city_detail_payload, + _build_intraday_meteorology, + _should_build_country_network_snapshot, +) from web.core import CITIES @@ -166,6 +170,46 @@ def test_turkey_mgm_primary_today_obs_uses_mgm_airport_history_not_metar(): assert snapshot["airport_primary_today_obs"] == [{"time": "14:56", "temp": 17.3}] +def test_panel_mode_still_builds_turkey_mgm_airport_snapshot(): + raw = { + "mgm": { + "obs_time": "2026-05-29T11:56:00Z", + "current": {"temp": 17.3}, + } + } + + assert ( + _should_build_country_network_snapshot( + "ankara", raw, is_panel_mode=True, is_market_mode=False + ) + is True + ) + assert ( + _should_build_country_network_snapshot( + "istanbul", raw, is_panel_mode=True, is_market_mode=False + ) + is True + ) + assert ( + _should_build_country_network_snapshot( + "guangzhou", raw, is_panel_mode=True, is_market_mode=False + ) + is False + ) + assert ( + _should_build_country_network_snapshot( + "ankara", raw, is_panel_mode=False, is_market_mode=False + ) + is True + ) + assert ( + _should_build_country_network_snapshot( + "ankara", raw, is_panel_mode=True, is_market_mode=True + ) + is False + ) + + def test_nearby_station_timing_marks_stale_rows_unusable_for_network_signal(): anchor_time = datetime.now(timezone.utc).replace(microsecond=0) fresh_time = anchor_time + timedelta(minutes=20) diff --git a/web/analysis_service.py b/web/analysis_service.py index 1b2bb173..7eaf7bc8 100644 --- a/web/analysis_service.py +++ b/web/analysis_service.py @@ -105,6 +105,29 @@ AMSC_SETTLEMENT_RUNWAY_TARGETS: Dict[str, str] = { } +def _should_build_country_network_snapshot( + city: str, + raw: Dict[str, Any], + *, + is_panel_mode: bool, + is_market_mode: bool, +) -> bool: + if is_market_mode: + return False + if not is_panel_mode: + return True + + city_lower = str(city or "").strip().lower() + if city_lower not in TURKISH_MGM_CITIES: + return False + + return bool( + (raw or {}).get("mgm") + or (raw or {}).get("mgm_today_obs") + or (raw or {}).get("mgm_nearby") + ) + + def _mgm_hourly_high(mgm: Dict[str, Any]) -> Optional[float]: hourly = mgm.get("hourly") if isinstance(mgm, dict) else [] if not isinstance(hourly, list): @@ -492,6 +515,7 @@ def _build_intraday_meteorology(data: Dict[str, Any]) -> Dict[str, Any]: "medium", "high", } + structural_cap = False if taf_signal.get("available") or taf_suppression: available_layers += 1 @@ -815,7 +839,12 @@ def _analyze( risk = CITY_RISK_PROFILES.get(city, {}) network_snapshot = ( build_country_network_snapshot(city, raw) - if not is_panel_mode and not is_market_mode + if _should_build_country_network_snapshot( + city, + raw, + is_panel_mode=is_panel_mode, + is_market_mode=is_market_mode, + ) else {} ) @@ -2298,4 +2327,3 @@ def _build_city_market_scan_payload( "selected_date": target_date or local_date, "fetched_at": data.get("updated_at"), } -