trade_in_pdf._analog_rows: floor==0 (или total_floors==0) у аналога рендерится как «—» из-за truthiness вместо is not None #1631

Closed
opened 2026-06-16 18:44:23 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: edge-case / потеря данных в ячейке · Файл: backend/app/services/exporters/trade_in_pdf.py:61

Файл: backend/app/services/exporters/trade_in_pdf.py:61. floor_val = f"{lot.floor}/{lot.total_floors}" if lot.floor and lot.total_floors else "—" использует truthiness (and), поэтому floor==0 или total_floors==0 трактуются как «нет данных». AnalogLot.floor/total_floors заданы как int | None без ограничения ge=1 (backend/app/schemas/trade_in.py:37-38), в отличие от пользовательского ввода (floor ge=1). Импакт: на реальных данных Phase 2 (Циан/Авито/Росреестр) этаж 0 (цоколь/технический) или неполная этажность 0 покажутся как «—» вместо «0/16», теряя реальный этаж в клиентской таблице. Тот же класс дефекта, что закрытый #1533, но в другой строке и не исправлен. Фикс: floor_val = f"{lot.floor}/{lot.total_floors}" if lot.floor is not None and lot.total_floors is not None else "—".

Почему баг: Для реальных данных Phase 2 (Циан/Авито/Росреестр) floor может быть 0 (цоколь/нулевой/технический этаж) или total_floors=0 в неполных данных — тогда вместо «0/16» в ячейку попадёт «—», теряя реальный этаж. Это тот же класс, что закрытый #1533 (days_on_market==0 → «—» из-за truthiness вместо is not None), но в другой строке и не исправленный.

Как чинить: Использовать явную проверку на None: floor_val = f"{lot.floor}/{lot.total_floors}" if lot.floor is not None and lot.total_floors is not None else "—".


deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.7 · unit B20

**Severity:** low · **Категория:** edge-case / потеря данных в ячейке · **Файл:** `backend/app/services/exporters/trade_in_pdf.py:61` Файл: backend/app/services/exporters/trade_in_pdf.py:61. `floor_val = f"{lot.floor}/{lot.total_floors}" if lot.floor and lot.total_floors else "—"` использует truthiness (and), поэтому floor==0 или total_floors==0 трактуются как «нет данных». AnalogLot.floor/total_floors заданы как int | None без ограничения ge=1 (backend/app/schemas/trade_in.py:37-38), в отличие от пользовательского ввода (floor ge=1). Импакт: на реальных данных Phase 2 (Циан/Авито/Росреестр) этаж 0 (цоколь/технический) или неполная этажность 0 покажутся как «—» вместо «0/16», теряя реальный этаж в клиентской таблице. Тот же класс дефекта, что закрытый #1533, но в другой строке и не исправлен. Фикс: `floor_val = f"{lot.floor}/{lot.total_floors}" if lot.floor is not None and lot.total_floors is not None else "—"`. **Почему баг:** Для реальных данных Phase 2 (Циан/Авито/Росреестр) floor может быть 0 (цоколь/нулевой/технический этаж) или total_floors=0 в неполных данных — тогда вместо «0/16» в ячейку попадёт «—», теряя реальный этаж. Это тот же класс, что закрытый #1533 (days_on_market==0 → «—» из-за truthiness вместо `is not None`), но в другой строке и не исправленный. **Как чинить:** Использовать явную проверку на None: `floor_val = f"{lot.floor}/{lot.total_floors}" if lot.floor is not None and lot.total_floors is not None else "—"`. --- <sub>deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.7 · unit B20</sub>
bot-backend added the
week ревью 1
label 2026-06-16 18:44:23 +00:00
Sign in to join this conversation.
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#1631
No description provided.