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("-")