Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
"""Записи `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,
|
|
)
|