fix(ptica): HTML-экспортёр перестаёт выбрасывать легаси-зонирование, которое сам же проверил (#2464) #2959

Merged
bot-backend merged 1 commit from fix/2464-html-zoning-fallback into main 2026-08-20 08:44:12 +00:00
Collaborator

Пункт эпика #2464: full_report_html.py:460.

Дефект

nspd_zoning = _as_dict(result.get("nspd_zoning"))
if not nspd_zoning:
    zoning = _as_dict(result.get("zoning"))
    if not zoning or not zoning.get("zone_code"):
        return _no_data() + note_html
    # ← здесь ничего нет; nspd_zoning так и остался ПУСТЫМ

zone_code = nspd_zoning.get("zone_code") or ...   # None

Легаси-зонирование проверили («есть zone_code, годится») — и продолжили читать из пустого словаря. Все пары выходят None, отбрасываются фильтром, и §1 печатает «нет данных» поверх имеющихся данных. Это не пустая таблица, а ложное утверждение об отсутствии.

Правильный образец — в соседнем файле

full_report_docx._build_zoning — та же структура слово в слово — закрывает ветку одной строкой:

        nspd_zoning = zoning

В HTML её не было. Копий ровно две, третьей нет (проверил по exporters/ и generative/).

Достижимость — говорю честно

Сегодня на проде ветка не срабатывает. Легаси-зонирование заполняется из pzz_zones_ekb, а она пуста намеренно: задача pzz-sync отключена в beat-расписании, потому что Росреестр закрыл PKK6 (#233, #259). Проверил — SELECT count(*) FROM pzz_zones_ekb даёт 0.

Так что это латентный дефект, а не наблюдаемый отказ. Чиню по двум причинам:

  • HTML-сборка — основа полного PDF-отчёта (full_report_pdf импортирует build_full_report_html), и в день, когда таблицу наполнят, зонирование молча пропадёт из главного документа;
  • правка — ровно одна строка, приводящая функцию к её же соседу.

Тест — двусторонний

Против кода origin/main:

код зоны Ж-4 не попал в таблицу        → вывод: <div class="no-data">нет данных</div>
заглушка «нет данных» рядом с данными  → то же, отдельным утверждением
приоритет nspd_zoning сохранён         → контроль, зелёный на обеих сторонах
отсутствие данных честно названо       → контроль, зелёный на обеих сторонах

Контроль «приоритет nspd_zoning» стоит не для симметрии: он ловит «починку», которая слила бы два источника вместо того, чтобы оставить НСПД главным.

Прогоны

tests/services/exporters   224 passed   rc=0
tests/services            3101 passed   rc=0
Пункт эпика #2464: `full_report_html.py:460`. ## Дефект ```python nspd_zoning = _as_dict(result.get("nspd_zoning")) if not nspd_zoning: zoning = _as_dict(result.get("zoning")) if not zoning or not zoning.get("zone_code"): return _no_data() + note_html # ← здесь ничего нет; nspd_zoning так и остался ПУСТЫМ zone_code = nspd_zoning.get("zone_code") or ... # None ``` Легаси-зонирование проверили («есть `zone_code`, годится») — и продолжили читать из пустого словаря. Все пары выходят `None`, отбрасываются фильтром, и §1 печатает **«нет данных» поверх имеющихся данных**. Это не пустая таблица, а ложное утверждение об отсутствии. ## Правильный образец — в соседнем файле `full_report_docx._build_zoning` — та же структура слово в слово — закрывает ветку одной строкой: ```python nspd_zoning = zoning ``` В HTML её не было. Копий ровно две, третьей нет (проверил по exporters/ и generative/). ## Достижимость — говорю честно Сегодня на проде ветка **не срабатывает**. Легаси-зонирование заполняется из `pzz_zones_ekb`, а она пуста намеренно: задача `pzz-sync` отключена в beat-расписании, потому что Росреестр закрыл PKK6 (#233, #259). Проверил — `SELECT count(*) FROM pzz_zones_ekb` даёт `0`. Так что это латентный дефект, а не наблюдаемый отказ. Чиню по двум причинам: - HTML-сборка — основа полного PDF-отчёта (`full_report_pdf` импортирует `build_full_report_html`), и в день, когда таблицу наполнят, зонирование молча пропадёт из главного документа; - правка — ровно одна строка, приводящая функцию к её же соседу. ## Тест — двусторонний Против кода `origin/main`: ``` код зоны Ж-4 не попал в таблицу → вывод: <div class="no-data">нет данных</div> заглушка «нет данных» рядом с данными → то же, отдельным утверждением приоритет nspd_zoning сохранён → контроль, зелёный на обеих сторонах отсутствие данных честно названо → контроль, зелёный на обеих сторонах ``` Контроль «приоритет `nspd_zoning`» стоит не для симметрии: он ловит «починку», которая слила бы два источника вместо того, чтобы оставить НСПД главным. ## Прогоны ``` tests/services/exporters 224 passed rc=0 tests/services 3101 passed rc=0 ```
bot-backend added 1 commit 2026-08-20 08:23:33 +00:00
fix(ptica): HTML-экспортёр перестаёт выбрасывать легаси-зонирование, которое сам же проверил (#2464)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
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 1m57s
CI / backend-tests (pull_request) Successful in 17m20s
ed13f0af31
_build_zoning при пустом nspd_zoning берёт легаси result["zoning"], проверяет, что
там есть zone_code, — и дальше читает поля из так и оставшегося ПУСТЫМ nspd_zoning.
Все пары выходят None, отбрасываются фильтром, и §1 печатает «нет данных» ПОВЕРХ
имеющихся данных. То есть это не пустая таблица, а ложное утверждение об отсутствии.

Соседний full_report_docx._build_zoning — та же структура слово в слово — закрывает
эту ветку одной строкой `nspd_zoning = zoning`. В HTML её не было.

Достижимость называю честно: сегодня ветка на проде не срабатывает. Легаси-зонирование
заполняется из pzz_zones_ekb, а она пуста намеренно — задача pzz-sync отключена в
beat-расписании, потому что Росреестр закрыл PKK6 (#233, #259). Дефект латентный.

Чиню всё равно по двум причинам. HTML-сборка — основа полного PDF-отчёта
(full_report_pdf импортирует build_full_report_html), так что в день, когда таблицу
наполнят, зонирование молча пропадёт из главного документа. И правка — ровно одна
строка, приводящая функцию к её же соседу.

Тест против origin/main:

  код зоны Ж-4 не попал в таблицу        — вывод '<div class="no-data">нет данных</div>'
  заглушка «нет данных» рядом с данными  — то же самое, отдельным утверждением
  приоритет nspd_zoning сохранён         — контроль, зелёный на обеих сторонах
  отсутствие данных честно названо       — контроль, зелёный на обеих сторонах

Контроль «приоритет nspd_zoning» стоит не для симметрии: он ловит «починку», которая
слила бы два источника вместо того, чтобы оставить НСПД главным.

Прогоны: tests/services/exporters 224 passed rc=0; tests/services rc=0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit 07b5e5e6da into main 2026-08-20 08:44:12 +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#2959
No description provided.