arm-core/api/src/schemas/issues.py

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,
)