88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
"""
|
|
Strongly typed domain models for Patient Onboarding state management.
|
|
"""
|
|
|
|
from typing import Any, Dict, List, Optional, Union
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class SymptomItem(BaseModel):
|
|
name: str
|
|
canonical_name: Optional[str] = None
|
|
duration: Optional[str] = None
|
|
severity: Optional[str] = None
|
|
location: Optional[str] = None
|
|
frequency: Optional[str] = None
|
|
onset: Optional[str] = None
|
|
pattern: Optional[str] = None
|
|
trigger: Optional[str] = None
|
|
relieving_factor: Optional[str] = None
|
|
associated_findings: Optional[str] = None
|
|
|
|
|
|
class MedicationItem(BaseModel):
|
|
name: str
|
|
canonical_name: Optional[str] = None
|
|
dosage: Optional[str] = None
|
|
frequency: Optional[str] = None
|
|
duration: Optional[str] = None
|
|
purpose: Optional[str] = None
|
|
|
|
|
|
class AllergyItem(BaseModel):
|
|
name: str
|
|
canonical_name: Optional[str] = None
|
|
type: Optional[str] = None # e.g., 'drug', 'food', 'environment'
|
|
reaction: Optional[str] = None # e.g., 'rash', 'swelling'
|
|
|
|
|
|
class MedicalHistoryItem(BaseModel):
|
|
condition: str
|
|
canonical_name: Optional[str] = None
|
|
duration: Optional[str] = None
|
|
status: Optional[str] = "active"
|
|
details: Optional[str] = None
|
|
|
|
|
|
class SurgicalHistoryItem(BaseModel):
|
|
procedure: str
|
|
body_site: Optional[str] = None
|
|
approximate_date: Optional[str] = None
|
|
reason: Optional[str] = None
|
|
|
|
|
|
class PreviousEpisodeItem(BaseModel):
|
|
description: str
|
|
time: Optional[str] = None
|
|
outcome: Optional[str] = None
|
|
|
|
|
|
class FamilyHistoryItem(BaseModel):
|
|
relation: str # e.g., 'father', 'mother', 'sibling'
|
|
condition: str
|
|
canonical_name: Optional[str] = None
|
|
|
|
|
|
class FieldContainer(BaseModel):
|
|
status: str = "not_collected" # 'not_collected' | 'reported' | 'confirmed_none' | 'unknown' | 'declined'
|
|
items: List[Dict[str, Any]] = Field(default_factory=list)
|
|
|
|
|
|
class SpecialtyConfidence(BaseModel):
|
|
code: str
|
|
name: str
|
|
confidence: float = 1.0
|
|
evidence: List[str] = Field(default_factory=list)
|
|
|
|
|
|
class PatientState(BaseModel):
|
|
reason_for_visit: Optional[str] = None
|
|
symptoms: List[SymptomItem] = Field(default_factory=list)
|
|
medical_history: Union[FieldContainer, List[MedicalHistoryItem], Dict[str, Any]] = Field(default_factory=list)
|
|
medications: Union[FieldContainer, List[MedicationItem], Dict[str, Any]] = Field(default_factory=list)
|
|
allergies: Union[FieldContainer, List[AllergyItem], Dict[str, Any]] = Field(default_factory=list)
|
|
surgical_history: List[SurgicalHistoryItem] = Field(default_factory=list)
|
|
previous_episodes: List[PreviousEpisodeItem] = Field(default_factory=list)
|
|
family_history: List[FamilyHistoryItem] = Field(default_factory=list)
|
|
additional_information: List[Dict[str, Any]] = Field(default_factory=list)
|