fix(site_finder): read real NSPD territorial-zone keys (nspd_zoning.zone_code was always null) #1844

Merged
lekss361 merged 1 commit from fix/nspd-zoning-zone-code-keys into main 2026-06-20 18:02:20 +00:00
Collaborator

Баг

quarter_dump_lookup._get_zoning() (строитель nspd_zoning для /analyze) читал ключи props НСПД territorial_zones, которых НЕ существует (reg_numb_border top-level, zone_code, type_zone, name) → nspd_zoning.zone_code и zone_name были NULL на каждом участке (затрагивает и обычный site-finder, и новый ПТИЦА-cockpit).

Что на самом деле в дампе (прод, 796 features)

Только рег-номер зоны, продублированный в descr == label == externalKey == options.reg_numb_border (например 66:41-7.14). Человеческого имени зоны («Ж-2», «Зона застройки…») в дампе НЕТ (0/796 с кириллицей; category/subcategory — непрозрачные числовые коды; pzz_zones_ekb пуст).

Фикс

zone_codedescrlabeloptions.reg_numb_border (вложенно, через isinstance(options, dict)) → externalKey → legacy-fallback'и; zone_name ← fallback'и → в итоге рег-номер. Defensive .get() (без KeyError при отсутствии ключей / не-dict options), None если ничего не резолвится. Честно — фейковое имя не синтезируется. Форма dict не изменена.

Эффект

  • Чинит реальный null-баг (корректный код).
  • Surfacing reg_numb_border — это ключ для crosswalk КСИТ из #1843 (реальные КСИТ/высота). Т.е. этот PR — фундамент под оживление регламента.
  • Честная оговорка: значение — рег-номер, не «Ж-2». Человеческое имя + КСИТ = отдельная data-задача #1843.

Качество

ruff чист, pytest 68 passed/1 skipped (новые тесты на реальной форме props: full / nested-only / opaque→None). code-reviewer APPROVE (None-safety/no-KeyError/no-regression проверены).

Связано: #1843 (оживление КСИТ), ПТИЦА-порт #1831–#1835, #1842.

## Баг `quarter_dump_lookup._get_zoning()` (строитель `nspd_zoning` для `/analyze`) читал ключи props НСПД territorial_zones, которых НЕ существует (`reg_numb_border` top-level, `zone_code`, `type_zone`, `name`) → **`nspd_zoning.zone_code` и `zone_name` были NULL на каждом участке** (затрагивает и обычный site-finder, и новый ПТИЦА-cockpit). ## Что на самом деле в дампе (прод, 796 features) Только рег-номер зоны, продублированный в `descr` == `label` == `externalKey` == `options.reg_numb_border` (например `66:41-7.14`). **Человеческого имени зоны («Ж-2», «Зона застройки…») в дампе НЕТ** (0/796 с кириллицей; `category`/`subcategory` — непрозрачные числовые коды; `pzz_zones_ekb` пуст). ## Фикс `zone_code` ← `descr` → `label` → `options.reg_numb_border` (вложенно, через `isinstance(options, dict)`) → `externalKey` → legacy-fallback'и; `zone_name` ← fallback'и → в итоге рег-номер. Defensive `.get()` (без KeyError при отсутствии ключей / не-dict `options`), `None` если ничего не резолвится. Честно — фейковое имя не синтезируется. Форма dict не изменена. ## Эффект - Чинит реальный null-баг (корректный код). - Surfacing `reg_numb_border` — это **ключ для crosswalk КСИТ из #1843** (реальные КСИТ/высота). Т.е. этот PR — фундамент под оживление регламента. - Честная оговорка: значение — рег-номер, не «Ж-2». Человеческое имя + КСИТ = отдельная data-задача #1843. ## Качество ruff чист, **pytest 68 passed/1 skipped** (новые тесты на реальной форме props: full / nested-only / opaque→None). **code-reviewer ✅ APPROVE** (None-safety/no-KeyError/no-regression проверены). Связано: #1843 (оживление КСИТ), ПТИЦА-порт #1831–#1835, #1842.
bot-backend added 1 commit 2026-06-20 15:29:49 +00:00
fix(site_finder): read real NSPD territorial-zone keys in _get_zoning
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m51s
CI / backend-tests (pull_request) Successful in 8m52s
cbe509f092
_get_zoning() read non-existent props (top-level reg_numb_border / zone_code /
type_zone / name) so nspd_zoning.zone_code & zone_name were NULL on every parcel.
Real dump props (verified prod, 796 features) carry only the registration number,
duplicated across descr / label / externalKey / options.reg_numb_border (no human
zone name exists in the NSPD dump). Map both fields to that reg-number with safe
nested narrowing (isinstance options dict) + legacy fallbacks; honest — no
fabricated name. Surfacing reg_numb_border also unblocks the КСИТ crosswalk (#1843).
Regression tests use the real prop shape (full / nested-only / opaque→None).
lekss361 merged commit b57bd2e3be into main 2026-06-20 18:02:20 +00:00
lekss361 deleted branch fix/nspd-zoning-zone-code-keys 2026-06-20 18:02:20 +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#1844
No description provided.