5 связанных client-facing+legal дефектов PDF-генерации (audit #7/#8/#9/#13/#33): A (#7): бренд PDF из estimate.created_by (get_brand_for_user), НЕ из ?brand= query — param удалён → brand-spoof невозможен. B (#9): generate_trade_in_pdf гейтит по estimate.insufficient_data → empty-state страница «недостаточно данных» вместо «0,0 млн» + фабрикованной таблицы потерь. C (#8): _build_cover рендерит brand.logo_url (validated) + brand.pdf_disclaimer на обложке (были =None). D (#13): _safe_logo_url/_safe_color + _make_safe_url_fetcher блокирует file://; base_url=None (был file:///) → SSRF closed. logo_url+primary_color валидируются. E (#33): n_with_repair=n_total (убран фабрикованный 40%); sources из estimate.sources_used (не хардкод); None-guard в _examples_rows. report_number не менялся (estimate_id UUID — уникален; смена display сломала бы нумерацию без чёткого спека). brand.py изменений не потребовал. pytest -k 'pdf or brand' 54 pass, ruff clean. |
||
|---|---|---|
| .. | ||
| app | ||
| data/sql | ||
| scripts | ||
| tests | ||
| .dockerignore | ||
| Dockerfile | ||
| pyproject.toml | ||