From ce5e29f92e41488dca1031659c9e4b656e19c1f0 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Mon, 11 May 2026 14:43:44 +0300 Subject: [PATCH] =?UTF-8?q?fix(nspd-geo):=20rosreestr2coord=20v5=20compat?= =?UTF-8?q?=20=E2=80=94=20delay=20arg,=20tmp=20cache,=20dumps=20default?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three incremental bugs surfaced while wiring rosreestr2coord v5 into our worker. All in backend/app/services/scrapers/nspd_lite.py. 1. `Area.__init__()` removed `delay` kwarg in v5 (was throttling). Drop it from our call. Rate limit now happens in worker via time.sleep(rate_ms/1000) after each fetch. 2. `Area(..., use_cache=True)` default writes media cache to ./tmp/ relative to CWD. In our docker image CWD=/app (owned by root), worker runs as non-root → PermissionError on every target. Fix: use_cache=False, media_path="/tmp/rosreestr2coord". 3. `Area.to_geojson_poly(dumps=True)` default returns JSON-serialized STRING, not dict (changed in v5). Worker's _persist_target expects dict with .get("properties") → AttributeError. Fix: dumps=False. Vault entries: - fixes/Bug_Rosreestr2coord_Delay_Arg_v5_Fixed.md - fixes/Bug_Nspd_Geo_Tmp_Permission_Fixed.md - fixes/Bug_Nspd_Geo_Str_Object_No_Get_Fixed.md --- backend/app/services/scrapers/nspd_lite.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/app/services/scrapers/nspd_lite.py b/backend/app/services/scrapers/nspd_lite.py index b8a8cafa..0015c34c 100644 --- a/backend/app/services/scrapers/nspd_lite.py +++ b/backend/app/services/scrapers/nspd_lite.py @@ -179,7 +179,10 @@ def fetch_via_rosreestr2coord( media_path="/tmp/rosreestr2coord", ) try: - return a.to_geojson_poly() + # dumps=False — возвращает dict (GeoJSON Feature), а не JSON-сериализованную + # строку. Default в v5 = True → строка → крах в `_persist_target` который + # ожидает dict с `.get("properties")` etc. + return a.to_geojson_poly(dumps=False) except Exception as e: logger.warning("rosreestr2coord failed for %s: %s", cad_num, e) return None