"""Thin Google-Maps geocoding wrapper used only for the admin coord backfill. Runtime geocoding during scraping happens in the alert service. This module exists so the web service can lazy-fix flats that were scraped before the lat/lng migration (or where the alert run skipped geocoding). """ import logging from typing import Optional from settings import GMAPS_API_KEY logger = logging.getLogger("web.geocode") _client = None def _get_client(): global _client if _client is not None: return _client if not GMAPS_API_KEY: return None try: import googlemaps _client = googlemaps.Client(key=GMAPS_API_KEY) return _client except Exception as e: logger.warning("googlemaps client init failed: %s", e) return None def geocode(address: str) -> Optional[tuple[float, float]]: if not address: return None gm = _get_client() if gm is None: return None try: res = gm.geocode(f"{address}, Berlin, Germany") if not res: return None loc = res[0]["geometry"]["location"] return float(loc["lat"]), float(loc["lng"]) except Exception as e: logger.warning("geocode failed for %r: %s", address, e) return None