"""Reporting and analysis models for iMedNet, including CDISC-aligned datasets."""
from __future__ import annotations
from datetime import datetime
from pydantic import Field
from imednet.models.base import ImednetBaseModel
[docs]class AdverseEvent(ImednetBaseModel):
"""Canonical CDISC-aligned Adverse Event (AE) reporting model."""
subject_key: str = Field(..., alias="subjectKey", description="Unique subject identifier")
ae_term: str = Field(
..., alias="aeTerm", description="Reported term for the adverse event (AETERM)"
)
ae_decod: str | None = Field(
None, alias="aeDecod", description="Dictionary-derived preferred term (AEDECOD)"
)
ae_severity: str = Field(
..., alias="aeSeverity", description="Severity/intensity: MILD, MODERATE, SEVERE (AESEV)"
)
ae_serious: bool = Field(
False, alias="aeSerious", description="Serious Adverse Event flag (AESER)"
)
ae_start_date: datetime | None = Field(
None, alias="aeStartDate", description="Start date/time of event (AESTDTC)"
)
ae_end_date: datetime | None = Field(
None, alias="aeEndDate", description="End date/time of event (AEENDTC)"
)
ae_outcome: str | None = Field(
None, alias="aeOutcome", description="Outcome of adverse event (AEOUT)"
)
ae_relationship: str | None = Field(
None,
alias="aeRelationship",
description="Causality / relationship to study drug/device (AEREL)",
)
ae_action_taken: str | None = Field(
None,
alias="aeActionTaken",
description="Action taken with study drug/device (AEACN)",
)
[docs]class ProtocolDeviation(ImednetBaseModel):
"""Canonical CDISC-aligned Protocol Deviation (PD) reporting model."""
subject_key: str = Field(..., alias="subjectKey", description="Unique subject identifier")
dv_term: str = Field(..., alias="dvTerm", description="Description of the deviation (DVTERM)")
dv_category: str = Field(
...,
alias="dvCategory",
description="Deviation category, e.g., ELIGIBILITY, CONSENT, PROCEDURE (DVCAT)",
)
dv_severity: str = Field(
...,
alias="dvSeverity",
description="Deviation classification: MAJOR, MINOR, CRITICAL",
)
dv_date: datetime = Field(..., alias="dvDate", description="Date/time of deviation (DVSTDTC)")
dv_status: str = Field(
"Unreviewed",
alias="dvStatus",
description="Triage status: Unreviewed, Approved, Escalated",
)
[docs]class DeviceDeficiency(ImednetBaseModel):
"""Canonical CDISC-aligned Device Deficiency (DD) reporting model."""
subject_key: str = Field(..., alias="subjectKey", description="Unique subject identifier")
dd_term: str = Field(..., alias="ddTerm", description="Deficiency term (DDTERM)")
dd_category: str = Field(..., alias="ddCategory", description="Category of deficiency (DDCAT)")
dd_serious: bool = Field(
False,
alias="ddSerious",
description="Serious Adverse Event relation flag (DDSPID)",
)
dd_date: datetime = Field(
..., alias="ddDate", description="Date/time of deficiency occurrence (DDSTDTC)"
)
[docs]class SubjectLevelAnalysis(ImednetBaseModel):
"""Subject-Level Analysis Dataset (ADSL)."""
model_config = {"extra": "allow"} # noqa: RUF012
subject_key: str = Field(..., alias="subjectKey")
[docs]class AnalysisAdverseEvent(ImednetBaseModel):
"""Analysis Adverse Event Dataset (ADAE)."""
model_config = {"extra": "allow"} # noqa: RUF012
subject_key: str = Field(..., alias="subjectKey")
[docs]class AnalysisLabResult(ImednetBaseModel):
"""Analysis Lab Result Dataset (ADLB)."""
model_config = {"extra": "allow"} # noqa: RUF012
subject_key: str = Field(..., alias="subjectKey")