"""Data models for the table layout exporter."""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Optional
@dataclass
class DimensionMember:
"""One dimensional assignment: a dimension (property) to a member."""
property_id: int
dimension_label: str
dimension_code: str
domain_code: str
member_label: str
member_code: str
data_type_code: str = ""
hierarchy_code: str = ""
sign: str = ""
@dataclass
class LayoutHeader:
"""A resolved header in display order."""
header_id: int
header_vid: int
code: str
label: str
direction: str # "x" (column), "y" (row), "z" (sheet)
order: int
is_abstract: bool
is_key: bool
parent_header_id: Optional[int]
parent_first: bool
depth: int = 0
sort_key: str = ""
categorisations: list[DimensionMember] = field(default_factory=list)
subcategory_code: str = ""
subcategory_description: str = ""
subcategory_cat_code: str = ""
# Open-row key column fields (populated for IsKey columns)
key_variable_vid: Optional[int] = None
key_variable_id: Optional[int] = None
key_data_type_code: str = ""
key_property_name: str = ""
key_categorisations: list["DimensionMember"] = field(default_factory=list)
@dataclass
class CellData:
"""One cell in the table grid."""
row_header_id: Optional[int]
col_header_id: int
sheet_header_id: Optional[int]
variable_vid: Optional[int]
variable_id: Optional[int] = None
is_excluded: bool = False
is_void: bool = False
sign: str = ""
data_type_code: str = ""
domain_label: str = ""
dp_categorisations: list[DimensionMember] = field(default_factory=list)
[docs]
@dataclass
class ExportConfig:
"""Configuration flags for the export."""
annotate: bool = True
add_header_comments: bool = True
add_cell_comments: bool = True
show_code_row: bool = True
show_code_column: bool = True
show_abstract_header_codes: bool = False
[docs]
@dataclass
class TableLayout:
"""Complete processed layout for one DPM table."""
table_vid: int
table_code: str
table_name: str
rows: list[LayoutHeader] = field(default_factory=list)
columns: list[LayoutHeader] = field(default_factory=list)
sheets: list[LayoutHeader] = field(default_factory=list)
cells: dict[tuple[Optional[int], int, Optional[int]], CellData] = field(
default_factory=dict,
)
max_col_depth: int = 0
max_row_depth: int = 0
dimension_ids: list[tuple[int, str]] = field(default_factory=list)
is_open_row: bool = False