fix(generative): отклонять спроецированные координаты до pyproj CRSError → 422 (#2445-B1) #2453

Merged
bot-backend merged 1 commit from fix/geometry-projected-coords-422 into main 2026-07-05 19:20:21 +00:00
Collaborator

Summary

Аудит-находка B1 (epic #2445). parcel_geojson со спроецированными координатами (МСК-66/UTM метры, напр. [500000, 6200000]) вместо WGS84 lon/lat проходил синтаксическую валидацию Polygon, затем крашил _metric_transformers на CRS.from_proj4 с lat_0 вне ±90° → необработанный pyproj.CRSErroropaque 500 вместо чистого 422.

Fix (2 слоя)

  1. Root-cause: _assert_wgs84_bounds(polygon) — проверка полного bbox (lon∈[-180,180], lat∈[-90,90]) в parse_parcel ДО проекции, ParcelGeometryError с понятным сообщением.
  2. Belt-and-suspenders: try/except CRSError → ParcelGeometryError вокруг CRS.from_proj4.

Существующий маппинг ParcelGeometryError → 422 в concepts.py:287 срабатывает как задумано (проверено: single class def, import-identity чист).

Test plan

  • 152 теста generative + 2 новых (unit ParcelGeometryError + API 422) зелёные
  • mypy strict clean, ruff чисто
  • Легитимный ЕКБ-участок (~[60.6, 56.8]) не отвергается (full-bbox check без false-positive)
  • code-reviewer: APPROVE (0 блокеров)

Refs #2445

## Summary Аудит-находка B1 (epic #2445). `parcel_geojson` со спроецированными координатами (МСК-66/UTM метры, напр. `[500000, 6200000]`) вместо WGS84 lon/lat проходил синтаксическую валидацию Polygon, затем крашил `_metric_transformers` на `CRS.from_proj4` с `lat_0` вне ±90° → необработанный `pyproj.CRSError` → **opaque 500** вместо чистого 422. ## Fix (2 слоя) 1. Root-cause: `_assert_wgs84_bounds(polygon)` — проверка полного bbox (lon∈[-180,180], lat∈[-90,90]) в `parse_parcel` ДО проекции, `ParcelGeometryError` с понятным сообщением. 2. Belt-and-suspenders: `try/except CRSError → ParcelGeometryError` вокруг `CRS.from_proj4`. Существующий маппинг `ParcelGeometryError → 422` в `concepts.py:287` срабатывает как задумано (проверено: single class def, import-identity чист). ## Test plan - [x] 152 теста generative + 2 новых (unit `ParcelGeometryError` + API 422) зелёные - [x] mypy strict clean, ruff чисто - [x] Легитимный ЕКБ-участок (~[60.6, 56.8]) не отвергается (full-bbox check без false-positive) - [x] code-reviewer: ✅ APPROVE (0 блокеров) Refs #2445
bot-backend added 1 commit 2026-07-05 19:04:39 +00:00
fix(generative): отклонять спроецированные координаты до pyproj CRSError (#2445-B1)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m8s
CI / backend-tests (pull_request) Successful in 15m0s
0a018d201e
parcel_geojson со спроецированными координатами (МСК-66/UTM метры) проходил
синтаксическую валидацию Polygon, затем крашил _metric_transformers на
CRS.from_proj4 с lat_0 вне ±90° → необработанный CRSError → opaque 500.

Добавлен WGS84 bbox-check (_assert_wgs84_bounds) в parse_parcel ДО проекции
(root cause, понятное сообщение) + защитный CRSError → ParcelGeometryError
wrap в _metric_transformers. Существующий маппинг ParcelGeometryError → 422
в concepts.py срабатывает как задумано.

Refs #2445
bot-backend merged commit 1bbd4c99e2 into main 2026-07-05 19:20:21 +00:00
bot-backend deleted branch fix/geometry-projected-coords-422 2026-07-05 19:20:21 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2453
No description provided.