From 9197a539e92749d485c090a2cce3cdd5498d14be Mon Sep 17 00:00:00 2001 From: lekss361 Date: Fri, 15 May 2026 14:50:22 +0300 Subject: [PATCH] fix(parcels): _parse_floors handle int (post-migration #169 schema change) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After PR #169 cad_buildings schema migration, `floors` column is INT (was TEXT in legacy schema). Existing `_parse_floors(r.get("floors"))` call in analyze_parcel → _neighbors_summary crashes with: AttributeError: 'int' object has no attribute 'strip' Fix: type union str | int | None. If int → return directly (no strip). Preserve TEXT range parsing ("5-7" → 7) for backwards-compat with any legacy data still in cad_buildings_old_apr26. --- backend/app/api/v1/parcels.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/app/api/v1/parcels.py b/backend/app/api/v1/parcels.py index a1697a9a..63a3cfba 100644 --- a/backend/app/api/v1/parcels.py +++ b/backend/app/api/v1/parcels.py @@ -639,16 +639,23 @@ _COST_PER_M2_MIN = 1000 # ₽/м² — ниже скорее всего оши _COST_PER_M2_MAX = 500_000 # ₽/м² — выше скорее всего outlier -def _parse_floors(raw: str | None) -> int | None: - """cad_buildings.floors хранится TEXT (могут быть диапазоны '1-2', '5-7'). +def _parse_floors(raw: str | int | None) -> int | None: + """cad_buildings.floors — после schema migration #169 теперь INT, + но historically мог быть TEXT с диапазоном '5-7'. Поддерживаем оба + для backwards-compat с legacy data + tests. Возвращаем верхнюю границу (более консервативный сосед-высотка). NB: `isdigit()` намеренно фильтрует malformed parts типа "5а-7"; для multi-range "1-2-3" возвращается max(1,2,3)=3 (acceptable degradation). """ + if raw is None or raw == "": + return None + # Post-migration: INT column → fast path + if isinstance(raw, int): + return raw if raw > 0 else None + raw = raw.strip() if not raw: return None - raw = raw.strip() # range like "5-7" → 7 if "-" in raw: parts = raw.split("-")