from html import escape
from typing import List
from ..report_builder import group_rows_by_project_and_version
from ..types import ReportRow
from .base import Formatter
class HTMLFormatter(Formatter):
"""Форматтер для экспорта отчёта в HTML."""
def __init__(self, **_kwargs):
super().__init__()
def format(self, rows: List[ReportRow]) -> str:
projects = group_rows_by_project_and_version(rows)
lines = [
'
',
" ",
" ",
" | Наименование Проекта | ",
" Номер версии* | ",
" Задача | ",
" Статус Готовность* | ",
" Затрачено за отчетный период | ",
"
",
" ",
" ",
]
for project, versions in projects.items():
project_text = escape(project)
total_project_rows = sum(len(tasks) for tasks in versions.values())
first_version_in_project = True
for version, task_rows in versions.items():
version_text = escape(version)
row_span_version = len(task_rows)
first_row_in_version = True
for r in task_rows:
task_cell = escape(f"{r['issue_id']}. {r['subject']}")
status_text = escape(r["status_ru"])
time_text = escape(r["time_text"])
lines.append(" ")
# Ячейка "Проект" - только в первой строке проекта
if first_version_in_project and first_row_in_version:
lines.append(
f' | {project_text} | '
)
# Ячейка "Версия" - только в первой строке версии
if first_row_in_version:
lines.append(
f' {version_text} | '
)
first_row_in_version = False
# Остальные колонки
lines.append(f" {task_cell} | ")
lines.append(f" {status_text} | ")
lines.append(f" {time_text} | ")
lines.append("
")
first_version_in_project = False
lines.append(" ")
lines.append("
")
return "\n".join(lines)
def save(self, rows: List[ReportRow], output_path: str) -> None:
content = self.format(rows)
with open(output_path, "w", encoding="utf-8") as f:
f.write(content)