fix(exporters): annotate scenario deficit horizon in docx/pptx (#1590 follow-up)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / changes (push) Successful in 7s
CI / frontend-tests (push) Successful in 1m1s
CI / frontend-tests (pull_request) Successful in 1m17s
CI / openapi-codegen-check (push) Successful in 2m19s
CI / backend-tests (pull_request) Successful in 9m11s
CI / backend-tests (push) Successful in 9m15s
CI / openapi-codegen-check (pull_request) Successful in 1m43s
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / changes (push) Successful in 7s
CI / frontend-tests (push) Successful in 1m1s
CI / frontend-tests (pull_request) Successful in 1m17s
CI / openapi-codegen-check (push) Successful in 2m19s
CI / backend-tests (pull_request) Successful in 9m11s
CI / backend-tests (push) Successful in 9m15s
CI / openapi-codegen-check (pull_request) Successful in 1m43s
report_docx и report_pptx рендерили bare _scenario_deficit_index под захардкоженной шапкой «(12 мес)» — при fallback на другой горизонт подпись лгала. Переключил оба на _scenario_deficit_cell (как в report_md): per-cell аннотация «(гор. N мес)» при N != 12. Закрывает code-review major по #1590.
This commit is contained in:
parent
c9ba595abe
commit
764db61734
2 changed files with 10 additions and 8 deletions
|
|
@ -10,7 +10,7 @@
|
|||
DRY: PURE-хелперы нормализации/форматирования НЕ дублируем — импортируем из
|
||||
`report_pdf` (там они уже есть: `_normalize` — приём инстанса ИЛИ `as_dict()`-словаря,
|
||||
`_fmt` — строковое форматирование ячейки/None→"—", `_level_ru`, `_as_dict`/`_as_list`,
|
||||
`_future_supply_pairs`, `_scenario_deficit_index`) + переиспользуем его named-константы
|
||||
`_future_supply_pairs`, `_scenario_deficit_cell`) + переиспользуем его named-константы
|
||||
(`_DASH`/`_NO_DATA`/`_ADVISORY_MARKER`). Здесь добавлены ТОЛЬКО docx-специфичные
|
||||
микро-билдеры (заголовки/абзацы/таблицы python-docx).
|
||||
|
||||
|
|
@ -44,7 +44,7 @@ from app.services.exporters.report_pdf import (
|
|||
_future_supply_pairs,
|
||||
_level_ru,
|
||||
_normalize,
|
||||
_scenario_deficit_index,
|
||||
_scenario_deficit_cell,
|
||||
)
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
|
@ -76,7 +76,8 @@ _TABLE_STYLE: str = "Table Grid"
|
|||
_COMPETITORS_TOP_N: int = 5
|
||||
|
||||
# Основной продуктовый горизонт (мес) — подпись столбца сводного дефицита сценария
|
||||
# (зеркало report_md._PRIMARY_HORIZON_MONTHS; само значение тянет _scenario_deficit_index).
|
||||
# (зеркало report_md._PRIMARY_HORIZON_MONTHS; значение тянет _scenario_deficit_cell —
|
||||
# при fallback на чужой горизонт ячейка несёт «(гор. N мес)», #1590).
|
||||
_PRIMARY_HORIZON_MONTHS: int = 12
|
||||
|
||||
|
||||
|
|
@ -272,7 +273,7 @@ def _build_scenarios(doc: _DocxDocument, report: dict[str, Any]) -> None:
|
|||
rate_str = (
|
||||
", ".join(f"{k}: {_fmt(v)}" for k, v in rate_path.items()) if rate_path else None
|
||||
)
|
||||
rows.append([name, _scenario_deficit_index(data), rate_str, data.get("advisory")])
|
||||
rows.append([name, _scenario_deficit_cell(data), rate_str, data.get("advisory")])
|
||||
|
||||
headers = [
|
||||
"Сценарий",
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
DRY: PURE-хелперы нормализации/форматирования НЕ дублируем — импортируем из
|
||||
`report_pdf` (там они уже есть: `_normalize` — приём инстанса ИЛИ `as_dict()`-словаря,
|
||||
`_fmt` — строковое форматирование значения/None→"—", `_level_ru`, `_as_dict`/`_as_list`,
|
||||
`_scenario_deficit_index`) + переиспользуем его named-константы
|
||||
`_scenario_deficit_cell`) + переиспользуем его named-константы
|
||||
(`_DASH`/`_NO_DATA`/`_ADVISORY_MARKER`). Здесь добавлены ТОЛЬКО pptx-специфичные
|
||||
микро-билдеры (слайды/буллеты/таблица python-pptx).
|
||||
|
||||
|
|
@ -46,7 +46,7 @@ from app.services.exporters.report_pdf import (
|
|||
_fmt,
|
||||
_level_ru,
|
||||
_normalize,
|
||||
_scenario_deficit_index,
|
||||
_scenario_deficit_cell,
|
||||
)
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
|
@ -78,7 +78,8 @@ _LAYOUT_TITLE_CONTENT: int = 1
|
|||
_LAYOUT_TITLE_ONLY: int = 5
|
||||
|
||||
# Основной продуктовый горизонт (мес) — подпись сводного дефицита сценария
|
||||
# (зеркало report_docx._PRIMARY_HORIZON_MONTHS; само значение тянет _scenario_deficit_index).
|
||||
# (зеркало report_docx._PRIMARY_HORIZON_MONTHS; значение тянет _scenario_deficit_cell —
|
||||
# при fallback на чужой горизонт буллет несёт «(гор. N мес)», #1590).
|
||||
_PRIMARY_HORIZON_MONTHS: int = 12
|
||||
|
||||
# Сколько USP-ниш выводить буллетами на слайд «Продукт ТЗ» (колода — держим компактно).
|
||||
|
|
@ -235,7 +236,7 @@ def _build_scenarios(prs: _PptxPresentation, report: dict[str, Any]) -> None:
|
|||
rate_str = (
|
||||
", ".join(f"{k}: {_fmt(v)}" for k, v in rate_path.items()) if rate_path else _DASH
|
||||
)
|
||||
deficit = _fmt(_scenario_deficit_index(data))
|
||||
deficit = _fmt(_scenario_deficit_cell(data))
|
||||
bullets.append(
|
||||
(str(name), f"дефицит ({_PRIMARY_HORIZON_MONTHS} мес) {deficit}; ставка {rate_str}")
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue