"""Записи `document_issue` в API: `IssueOut` — общая для `StatementOut.issues` и `DocumentOut.issues`; `IssueCountsOut` — счётчики по `severity` для карточки файла (P3-23).""" import uuid from decimal import Decimal from pydantic import BaseModel from src.models.enums import DocumentIssueKind, IssueSeverity, IssueSource from src.models.statements import DocumentIssue class IssueOut(BaseModel): id: uuid.UUID kind: DocumentIssueKind code: str severity: IssueSeverity message: str line_ids: list[uuid.UUID] column_id: uuid.UUID | None column_index: int | None field: str | None source: IssueSource relation: str | None codes: list[str] expected: Decimal | None actual: Decimal | None class IssueCountsOut(BaseModel): """Число записей `document_issue` документа по `severity`, всех видов.""" error: int = 0 info: int = 0 def issue_out(issue: DocumentIssue) -> IssueOut: """JSONB `line_ids` / `codes` (`NULL` — пусто) приводятся к спискам uuid и строк.""" line_ids = issue.line_ids if isinstance(issue.line_ids, list) else [] codes = issue.codes if isinstance(issue.codes, list) else [] return IssueOut( id=issue.id, kind=issue.kind, code=issue.code, severity=issue.severity, message=issue.message, line_ids=[uuid.UUID(str(item)) for item in line_ids], column_id=issue.column_id, column_index=issue.column_index, field=issue.field, source=issue.source, relation=issue.relation, codes=[str(item) for item in codes], expected=issue.expected, actual=issue.actual, )