From f1d6c658517567f6c280341aa85cffdbb6ab4b1f Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Thu, 6 Aug 2026 13:56:06 +0300 Subject: [PATCH] =?UTF-8?q?export-form-4:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BB=D0=B8=D1=81=D1=82=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B0=20=D0=B2=20=D1=8D=D0=BA?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D1=80=D1=82,=20=D0=BF=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80?= =?UTF-8?q?=D1=82=20=D1=81=20=D0=BC=D0=B5=D1=82=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=BC=D0=B8=20=D0=BF=D0=BE=20editable=20columns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/export_service/export_service.py | 6 +++ .../services/export_service/export_writers.py | 48 ++++++++++++------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/api/src/services/export_service/export_service.py b/api/src/services/export_service/export_service.py index c198455..e280a6e 100644 --- a/api/src/services/export_service/export_service.py +++ b/api/src/services/export_service/export_service.py @@ -115,6 +115,12 @@ class ExportService: row_normalizer=self.form1_row_normalizer.normalize, value_serializer=self.value_serializer.to_excel_value, ), + "STRUCTURE": DepthSheetWriter( + columns_dict=FORM1_DEPTH_COLUMNS, + row_normalizer=self.form1_row_normalizer.normalize, + value_serializer=self.value_serializer.to_excel_value, + colors_config=FORM1_COLORS["AHR"], + ), } self.form3_report_writer = TabularSheetWriter( columns=FORM3_REPORT_COLUMNS, diff --git a/api/src/services/export_service/export_writers.py b/api/src/services/export_service/export_writers.py index c893b89..5591a45 100644 --- a/api/src/services/export_service/export_writers.py +++ b/api/src/services/export_service/export_writers.py @@ -1,5 +1,6 @@ from __future__ import annotations +import abc from collections import defaultdict from typing import Any, Callable @@ -15,7 +16,28 @@ RowNormalizer = Callable[[dict[str, Any]], dict[str, Any]] ValueSerializer = Callable[[Any], Any] -class TabularSheetWriter: +class AbstractWriter(abc.ABC): + + def _set_widths(self, worksheet: Worksheet): + for col in worksheet.columns: + max_len = 0 + col_letter = get_column_letter(col[0].column) # Get alphabetical column name (e.g., 'A') + + for cell in col: + if cell.value is not None: + cell_len = len(str(cell.value)) + if cell_len > max_len: + max_len = cell_len + + adjusted_width = max(max_len + 3, 10) + worksheet.column_dimensions[col_letter].width = adjusted_width + + @abc.abstractmethod + def write(self, *args, **kwargs): + pass + + +class TabularSheetWriter(AbstractWriter): def __init__( self, columns: list[tuple[str, str]], @@ -34,9 +56,10 @@ class TabularSheetWriter: worksheet.append( [self.value_serializer(normalized.get(key)) for key, _ in self.columns] ) + self._set_widths(worksheet) -class DepthSheetWriter: +class DepthSheetWriter(AbstractWriter): alignment = Alignment(horizontal='center', vertical='center') thin_border = Border( left=Side(style='thin'), @@ -166,20 +189,6 @@ class DepthSheetWriter: cell.font = Font(color=color["color"]) return current_column - def _set_widths(self, worksheet: Worksheet): - for col in worksheet.columns: - max_len = 0 - col_letter = get_column_letter(col[0].column) # Get alphabetical column name (e.g., 'A') - - for cell in col: - if cell.value is not None: - cell_len = len(str(cell.value)) - if cell_len > max_len: - max_len = cell_len - - adjusted_width = max(max_len + 3, 10) - worksheet.column_dimensions[col_letter].width = adjusted_width - def _set_color_to_row(self, ws: Worksheet, item_type: str) -> None: if not self.palette or item_type in ("SUB_ITEM", "INPUT"): return @@ -199,7 +208,12 @@ class DepthSheetWriter: def write(self, worksheet: Worksheet, rows: list[tuple]) -> None: self._write_header(worksheet) for row in rows: - raw_data = row[3] if len(row) > 3 and isinstance(row[3], dict) else {} + if len(row) > 3 and isinstance(row[3], dict): + if row[0] == 'META': + continue + raw_data = row[3] + else: + raw_data = {} normalized = self.row_normalizer(raw_data) worksheet.append( [self.value_serializer(normalized.get(key)) for key in self.columns] -- 2.47.2