fix(tradein/pdf): МЕРА branding + fix 'Год постройки None' + drop duplicate deals-range on cover
- Дефолт-бренд generic: name «Trade-In Estimator» → «МЕРА» (brand.py). Masthead/ footer/подписи секций читают brand.name → отчёт теперь брендирован МЕРА; white-label бренды (реальное name в brands) не тронуты. - Cover: year_built=None утекал литеральным «None» в «Год постройки» → «—». - Cover: убран дубль-бар «Диапазон цен по фактическим сделкам» (уже есть на стр. 03) — часть ужимания cover до одной A4-страницы. Тесты обновлены.
This commit is contained in:
parent
b5477362f0
commit
9a73da4ce0
3 changed files with 10 additions and 22 deletions
|
|
@ -28,7 +28,7 @@ class Brand:
|
||||||
|
|
||||||
_DEFAULT = Brand(
|
_DEFAULT = Brand(
|
||||||
slug="generic",
|
slug="generic",
|
||||||
name="Trade-In Estimator",
|
name="МЕРА",
|
||||||
logo_url=None,
|
logo_url=None,
|
||||||
primary_color="#1d4ed8",
|
primary_color="#1d4ed8",
|
||||||
accent_color="#f59e0b",
|
accent_color="#f59e0b",
|
||||||
|
|
|
||||||
|
|
@ -1086,16 +1086,14 @@ def _build_cover(estimate: AggregatedEstimate, input_snapshot: dict, brand) -> s
|
||||||
house_label = house_labels.get(house_type, "—") if house_type else "—"
|
house_label = house_labels.get(house_type, "—") if house_type else "—"
|
||||||
repair_label = repair_labels.get(repair_state, "Не указано") if repair_state else "Не указано"
|
repair_label = repair_labels.get(repair_state, "Не указано") if repair_state else "Не указано"
|
||||||
balcony_label = "Есть" if has_balcony else "Нет" if has_balcony is False else "—"
|
balcony_label = "Есть" if has_balcony else "Нет" if has_balcony is False else "—"
|
||||||
|
# #pdf-none: year_built может быть None (адрес без house_metadata) — раньше в
|
||||||
|
# таблицу утекало литеральное «None»; показываем «—» как в остальных пустых полях.
|
||||||
|
year_label = _mono(str(year_built)) if year_built else "—"
|
||||||
|
|
||||||
# Срок экспозиции показываем ТОЛЬКО при реальных days_on_market в analogs;
|
# Срок экспозиции показываем ТОЛЬКО при реальных days_on_market в analogs;
|
||||||
# если данных нет — days не рисуем (не выдумываем «4-118 дней», #pdf-honesty).
|
# если данных нет — days не рисуем (не выдумываем «4-118 дней», #pdf-honesty).
|
||||||
days_range = _days_on_market_range(estimate.analogs)
|
days_range = _days_on_market_range(estimate.analogs)
|
||||||
|
|
||||||
# Deals range — если deals есть, считаем; иначе fallback к listings range
|
|
||||||
deals_low, deals_high = _deals_range(
|
|
||||||
estimate.actual_deals, fallback=(estimate.range_low_rub, estimate.range_high_rub)
|
|
||||||
)
|
|
||||||
|
|
||||||
listings_bar = _price_range_chart_svg(
|
listings_bar = _price_range_chart_svg(
|
||||||
estimate.range_low_rub,
|
estimate.range_low_rub,
|
||||||
estimate.range_high_rub,
|
estimate.range_high_rub,
|
||||||
|
|
@ -1121,12 +1119,6 @@ def _build_cover(estimate: AggregatedEstimate, input_snapshot: dict, brand) -> s
|
||||||
"Росреестр, ДомКлик и продажи агентств недвижимости"
|
"Росреестр, ДомКлик и продажи агентств недвижимости"
|
||||||
)
|
)
|
||||||
|
|
||||||
deals_bar = _price_range_chart_svg(
|
|
||||||
deals_low,
|
|
||||||
deals_high,
|
|
||||||
sub_label="Диапазон цен по фактическим сделкам",
|
|
||||||
)
|
|
||||||
|
|
||||||
disclaimer_html = ""
|
disclaimer_html = ""
|
||||||
if brand.pdf_disclaimer:
|
if brand.pdf_disclaimer:
|
||||||
disclaimer_html = (
|
disclaimer_html = (
|
||||||
|
|
@ -1160,7 +1152,7 @@ def _build_cover(estimate: AggregatedEstimate, input_snapshot: dict, brand) -> s
|
||||||
<td class="bold dotted-row">до {_mono(expires.strftime("%d.%m.%Y"))}</td></tr>
|
<td class="bold dotted-row">до {_mono(expires.strftime("%d.%m.%Y"))}</td></tr>
|
||||||
<tr><td class="dotted-row">Адрес</td><td class="bold dotted-row">{address}</td></tr>
|
<tr><td class="dotted-row">Адрес</td><td class="bold dotted-row">{address}</td></tr>
|
||||||
<tr><td class="dotted-row">Год постройки</td>
|
<tr><td class="dotted-row">Год постройки</td>
|
||||||
<td class="bold dotted-row">{_mono(str(year_built))}</td></tr>
|
<td class="bold dotted-row">{year_label}</td></tr>
|
||||||
<tr><td class="dotted-row">Тип дома</td><td class="bold dotted-row">{house_label}</td></tr>
|
<tr><td class="dotted-row">Тип дома</td><td class="bold dotted-row">{house_label}</td></tr>
|
||||||
<tr><td class="dotted-row">Этаж / этажность</td>
|
<tr><td class="dotted-row">Этаж / этажность</td>
|
||||||
<td class="bold dotted-row">{_mono(f"{floor} / {total_floors}")}</td></tr>
|
<td class="bold dotted-row">{_mono(f"{floor} / {total_floors}")}</td></tr>
|
||||||
|
|
@ -1187,13 +1179,6 @@ def _build_cover(estimate: AggregatedEstimate, input_snapshot: dict, brand) -> s
|
||||||
{listings_bar}
|
{listings_bar}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="break-inside:avoid;page-break-inside:avoid;">
|
|
||||||
<p style="margin:6pt 0 2pt 0;font-size:{_FS_MD};font-weight:700;">
|
|
||||||
Диапазон цен по фактическим сделкам
|
|
||||||
</p>
|
|
||||||
{deals_bar}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Что важно при оценке -->
|
<!-- Что важно при оценке -->
|
||||||
<h3 style="margin-top:8pt;font-size:{_FS_MD};font-weight:700;">
|
<h3 style="margin-top:8pt;font-size:{_FS_MD};font-weight:700;">
|
||||||
Что важно при оценке стоимости квартиры:
|
Что важно при оценке стоимости квартиры:
|
||||||
|
|
|
||||||
|
|
@ -233,7 +233,9 @@ def test_build_cover_with_sold_contains_dual_block() -> None:
|
||||||
assert "Ожидаемая цена продажи" in html
|
assert "Ожидаемая цена продажи" in html
|
||||||
# existing sections untouched
|
# existing sections untouched
|
||||||
assert "Диапазон цен в объявлениях" in html
|
assert "Диапазон цен в объявлениях" in html
|
||||||
assert "Диапазон цен по фактическим сделкам" in html
|
# #pdf-empty-pages: дубль-бар «по фактическим сделкам» убран с cover
|
||||||
|
# (остался на стр. 03) — cover ужат до одной A4-страницы.
|
||||||
|
assert "Диапазон цен по фактическим сделкам" not in html
|
||||||
|
|
||||||
|
|
||||||
def test_build_cover_without_sold_renders_only_asking() -> None:
|
def test_build_cover_without_sold_renders_only_asking() -> None:
|
||||||
|
|
@ -243,7 +245,8 @@ def test_build_cover_without_sold_renders_only_asking() -> None:
|
||||||
assert "Ожидаемая цена продажи" not in html
|
assert "Ожидаемая цена продажи" not in html
|
||||||
# existing layout intact
|
# existing layout intact
|
||||||
assert "Диапазон цен в объявлениях" in html
|
assert "Диапазон цен в объявлениях" in html
|
||||||
assert "Диапазон цен по фактическим сделкам" in html
|
# #pdf-empty-pages: дубль-бар «по фактическим сделкам» убран с cover (см. выше).
|
||||||
|
assert "Диапазон цен по фактическим сделкам" not in html
|
||||||
|
|
||||||
|
|
||||||
# ── _days_on_market_range — no fabricated (4, 118) corridor (#pdf-honesty) ─────
|
# ── _days_on_market_range — no fabricated (4, 118) corridor (#pdf-honesty) ─────
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue