diff --git a/model/patientTemplate.py b/model/patientTemplate.py index 48774fb..b7e5cfc 100644 --- a/model/patientTemplate.py +++ b/model/patientTemplate.py @@ -1,57 +1,43 @@ -from dataclasses import dataclass, field -from typing import List, Optional -from model.patientTemplateModuleA import PacientTemplateModuleA as MA -from model.patientTemplateModuleB1 import PacientTemplateModuleB1 as MB1 -from model.patientTemplateModuleB2 import PacientTemplateModuleB2 as MB2 -from model.patientTemplateModuleC import PacientTemplateModuleC as MC - -# from model.patientTemplateModuleB2 import PacientTemplateModuleB2 as MB2 +from pydantic import BaseModel, Field, ConfigDict +from typing import Optional +from datetime import date +from model.types import Gender + +from model.patientTemplateModuleA import PacientParameters, emptyPacientParameters +from model.patientTemplateModuleB1 import DiagnosisB1, emptyDiagnosisB1 +# from model.patientTemplateModuleB2 import DiagnosisB2 # from model.patientTemplateModuleC import PacientTemplateModuleC as MC -@dataclass -class AnoNeUdaje: - ano: str - ne: str - udaj_neni_k_dispozici: str - - -@dataclass -class IdentifikatorPacienta: - typ: str # Typ identifikátoru (např. rodné číslo, pas) +class Identifier(BaseModel): + typ: str # Typ identifikátoru (např. rodné číslo, pas) TODO identifikator: str # Identifikátor osoby -@dataclass -class M_1_1: # Identifikace pacienta - M_1_1_1: List[str] = field(default_factory=list) # Křestní jméno – Povinné, 1..* - M_1_1_2: List[str] = field(default_factory=list) # Příjmení – Povinné, 1..* - M_1_1_4: int = 0 # Identifikátor pacienta - M_1_1_6: str = "" # Úřední pohlaví – can set a default like "U" or leave empty - M_1_1_3: Optional[str] = None # Datum narození – Optional - M_1_1_5: List[str] = field(default_factory=list) # Státní občanství - M_1_1_7: List[str] = field(default_factory=list) # Komunikační jazyk +class PacientIdentification(BaseModel): # M.1.1 + firstName: str = Field(default=None, alias="M.1.1.1") # Křestní jméno (First name) + lastName: str = Field(default=None, alias="M.1.1.2") # Příjmení (Surname) + dateOfBirth: date = Field(default=None, alias="M.1.1.3") # Datum narození (Date of Birth) + identifier: Identifier = Field(default=None, alias="M.1.1.4") # Identifikátor pacienta + nationality: Optional[str] = Field(default=None, alias="M.1.1.5") # Státní občanství (Citizenship) + gender: Optional[Gender] = Field(default=None, alias="M.1.1.6") # Úřední pohlaví (Legal Gender) + language: Optional[str] = Field(default=None, alias="M.1.1.7") # Komunikační jazyk (Communication Language) -@dataclass -class M_1_2: # Zdravotní pojištění - M_1_2_1: str = "" # Kód zdravotní pojišťovny – Podmíněně povinné, 1..1 - M_1_2_2: str = "" # Název zdravotní pojišťovny – Podmíněně povinné, 1..1 - M_1_2_3: List[str] = field( - default_factory=list - ) # Číslo zdravotního pojištění – Podmíněně povinné, 1..1 (0..1 dětská MDS) +class HealthInsurance(BaseModel): # M.1.2 + code: int = Field(default=None, alias="M.1.2.1") # Kód zdravotní pojišťovny + company: str = Field(default=None, alias="M.1.2.2") # Název zdravotní pojišťovny + insuranceNumber: str = Field(default=None, alias="M.1.2.3") # Číslo zdravotního pojištění -@dataclass -class M_1: # Hlavička dokumentu - M_1_1: "M_1_1" = field(default_factory=M_1_1) # Identifikace pacienta – 1..1 - M_1_2: "M_1_2" = field(default_factory=M_1_2) # Zdravotní pojištění – 1..1 +class DocumentHeader(BaseModel): # Hlavička dokumentu + pacientIdentification: PacientIdentification = Field(alias="M_1_1") # Identifikace pacienta – 1..1 + healthInsurance: HealthInsurance = Field(alias="M_1_2") # Zdravotní pojištění – 1..1 -@dataclass -class PacientTemplate: - M_1: "M_1" = field(default_factory=M_1) # Hlavička dokumentu – 1..1 - M_A: "MA" = field(default_factory=MA) # Pacient – 1..1 - M_B_1: "MB1" = field(default_factory=MB1) # Pacient – 1..1 - M_B_2: Optional[List["MB2"]] = field(default_factory=list) # Optional list of MB2 - M_C: Optional[List["MC"]] = field(default_factory=list) # Optional list of MC +class PacientTemplate(BaseModel): + documentHeader: DocumentHeader = Field(alias="M_1") + pacientParameters: PacientParameters = Field(alias="M_A") + diagnosisB1: DiagnosisB1 = Field(alias="M_B_1") + # diagnosisB2: Optional[DiagnosisB2] = Field(default=None, alias="M_B_2") # Optional list of MB2 + # M_C: Optional[List["MC"]] = field(default_factory=list) # Optional list of MC diff --git a/model/patientTemplateModuleA.py b/model/patientTemplateModuleA.py index 47b00f3..37ba9a8 100644 --- a/model/patientTemplateModuleA.py +++ b/model/patientTemplateModuleA.py @@ -1,214 +1,154 @@ -from dataclasses import dataclass, field +from pydantic import BaseModel, Field from typing import List, Optional - -@dataclass -class AnoNeUdaje: - ano: str - ne: str - udaj_neni_k_dispozici: str +from model.types import YesNoType, Smoker, Alcohol, DrugAddiction # --- M.A.1.1 --- -@dataclass -class MA11: - M_A_1_1_1: str = "" # Relevantní nádorový predispoziční syndrom – Podmíněně povinné, 1..1 - M_A_1_1_2: List[str] = field(default_factory=list) # Název predispozičního syndromu – Povinné, 1..* - M_A_1_1_2_1: Optional[str] = "" # Jiný predispoziční syndrom – Povinné if M_A_1_1_2 includes "Jiný" - M_A_1_1_3: Optional[str] = None # Komentář – Volitelné +class TumorSyndrome(BaseModel): + relevantTumorSyndrome: str = Field(default="", alias="M_A_1_1_1") + syndromeNames: List[str] = Field(default=None, alias="M_A_1_1_2") + otherSyndrome: Optional[str] = Field(default="", alias="M_A_1_1_2_1") + comment: Optional[str] = Field(default=None, alias="M_A_1_1_3") # --- M.A.1.2 --- -@dataclass -class MA12: - M_A_1_2_1: str = "" # Příbuzenský stav – Podmíněně povinné, 1..1 - M_A_1_2_2: str = "" # Onkologické onemocnění – specifikace – Podmíněně povinné, 1..1 - M_A_1_2_3: Optional[List[str]] = field(default_factory=list) # Onkologické onemocnění – kód MKN-10 – Volitelné, 0..* +class OncoFamilyHistory(BaseModel): + familialRelation: str = Field(default="", alias="M_A_1_2_1") + cancerDiagnosisDetail: str = Field(default="", alias="M_A_1_2_2") + cancerICD10Codes: Optional[List[str]] = Field(default=None, alias="M_A_1_2_3") # --- M.A.1.3 --- -@dataclass -class DiseaseWithComment: - diagnózy: List[str] # Výčet z číselníku – Povinné, 1..* - komentář: Optional[str] = None # Komentář – Podmíněně povinné, 0..1 - - -@dataclass -class MA13: - # Non-default fields first - M_A_1_3_1: str = "" # Srdce a cévy - M_A_1_3_2: str = "" # Metabolické - M_A_1_3_3: str = "" # Plicní - M_A_1_3_4: str = "" # GIT - M_A_1_3_5: str = "" # Ledviny - M_A_1_3_6: str = "" # Autoimunitní - M_A_1_3_7: str = "" # Závažné endokrinologické onemocnění - M_A_1_3_8: str = "" # Neuropsychiatrické onemocnění - M_A_1_3_9: str = "" # Gynekologické onemocnění + anamnéza - M_A_1_3_10: str = "" # Závažné infekční onemocnění - M_A_1_3_11: AnoNeUdaje = field(default_factory=AnoNeUdaje) # Orgánová transplantace ANO/NE/údaj není k dispozici - M_A_1_3_11_1: List[str] = field(default_factory=list) # Organy - - # Default fields after - M_A_1_3_1_1: Optional[str] = None # Srdce a cévy - komentář - M_A_1_3_2_1: Optional[str] = None # Metabolické - komentář - M_A_1_3_3_1: Optional[str] = None # Plicní - komentář - M_A_1_3_4_1: Optional[str] = None # GIT - komentář - M_A_1_3_5_1: Optional[str] = None # Ledviny - komentář - M_A_1_3_6_1: Optional[str] = None # Autoimunitní - komentář - M_A_1_3_7_1: Optional[str] = None # Závažné endokrinologické onemocnění - komentář - M_A_1_3_8_1: Optional[str] = None # Neuropsychiatrické onemocnění - komentář - M_A_1_3_9_1: Optional[str] = None # Onemocnění / funkční stav - komentář - M_A_1_3_9_2: Optional[str] = None # HPV pozitivita - M_A_1_3_9_3: Optional[str] = None # Menopauza (Rok) - M_A_1_3_9_4: Optional[str] = None # Hormonoterapie - M_A_1_3_9_5: Optional[str] = None # Antikoncepce - M_A_1_3_10_1: Optional[str] = None # Závažné infekční onemocnění - komentář - M_A_1_3_11_1_1: Optional[str] = None # Jiné organy - M_A_1_3_11_2: Optional[str] = None # Rok transplantace - M_A_1_3_11_3: Optional[str] = None # Komentář - M_A_1_3_12: Optional[str] = None # jine relevantni zdravotni nalezy +class DiseaseWithComment(BaseModel): + diagnoses: List[str] # Výčet z číselníku – Povinné, 1..* + comment: Optional[str] = None # Komentář – Podmíněně povinné, 0..1 + + +class RelevantDisease(BaseModel): + cardiovascular: str = Field(default="", alias="M_A_1_3_1") + metabolic: str = Field(default="", alias="M_A_1_3_2") + pulmonary: str = Field(default="", alias="M_A_1_3_3") + git: str = Field(default="", alias="M_A_1_3_4") + renal: str = Field(default="", alias="M_A_1_3_5") + autoimmune: str = Field(default="", alias="M_A_1_3_6") + endocrinological: str = Field(default="", alias="M_A_1_3_7") + neuropsychiatric: str = Field(default="", alias="M_A_1_3_8") + gynecological: str = Field(default="", alias="M_A_1_3_9") + infectious: str = Field(default="", alias="M_A_1_3_10") + organTransplant: YesNoType = Field(default=None, alias="M_A_1_3_11") + transplantedOrgans: List[str] = Field(default=None, alias="M_A_1_3_11_1") + + cardiovascularComment: Optional[str] = Field(default=None, alias="M_A_1_3_1_1") + metabolicComment: Optional[str] = Field(default=None, alias="M_A_1_3_2_1") + pulmonaryComment: Optional[str] = Field(default=None, alias="M_A_1_3_3_1") + gitComment: Optional[str] = Field(default=None, alias="M_A_1_3_4_1") + renalComment: Optional[str] = Field(default=None, alias="M_A_1_3_5_1") + autoimmuneComment: Optional[str] = Field(default=None, alias="M_A_1_3_6_1") + endocrinologicalComment: Optional[str] = Field(default=None, alias="M_A_1_3_7_1") + neuropsychiatricComment: Optional[str] = Field(default=None, alias="M_A_1_3_8_1") + gynecologicalComment: Optional[str] = Field(default=None, alias="M_A_1_3_9_1") + hpvStatus: Optional[str] = Field(default=None, alias="M_A_1_3_9_2") + menopauseYear: Optional[str] = Field(default=None, alias="M_A_1_3_9_3") + hormoneTherapy: Optional[str] = Field(default=None, alias="M_A_1_3_9_4") + contraception: Optional[str] = Field(default=None, alias="M_A_1_3_9_5") + infectiousComment: Optional[str] = Field(default=None, alias="M_A_1_3_10_1") + otherTransplantedOrgans: Optional[str] = Field(default=None, alias="M_A_1_3_11_1_1") + transplantYear: Optional[str] = Field(default=None, alias="M_A_1_3_11_2") + transplantComment: Optional[str] = Field(default=None, alias="M_A_1_3_11_3") + otherRelevantFindings: Optional[str] = Field(default=None, alias="M_A_1_3_12") # --- M.A.1.5 --- -@dataclass -class MA15: - M_A_1_5_1: AnoNeUdaje # Předchozí onkologické onemocnění – Povinné, 1..1 - M_A_1_5_1_1: Optional[str] = ( - None # Onemocnění/funkční stav - komentář – Podmíněně povinné, 1..1 - ) - M_A_1_5_1_2: Optional[str] = None # Rok diagnózy – Volitelné, 0..1 - M_A_1_5_1_3: Optional[str] = ( - None # Léčen(a) ve zdravotnickém zařízení – Volitelné, 0..1 - ) - M_A_1_5_1_4: Optional[str] = ( - None # Onkologické nemocnění - kód MKN-O-3 – Volitelné, 0..1 - ) +class PreviousOncologicalDisease(BaseModel): + hadCancer: YesNoType = Field(default=None, alias="M_A_1_5_1") + previousCancerComment: Optional[str] = Field(default=None, alias="M_A_1_5_1_1") + diagnosisYear: Optional[str] = Field(default=None, alias="M_A_1_5_1_2") + treatedFacility: Optional[str] = Field(default=None, alias="M_A_1_5_1_3") + icdOCode: Optional[str] = Field(default=None, alias="M_A_1_5_1_4") # --- M.A.1.6 --- -@dataclass -class MA16: - # Non-default fields first - M_A_1_6_1: str # Mamografický screening – Povinné, 1..1 - M_A_1_6_2: str # Screening nádoru děložního hrdla – Povinné, 1..1 - M_A_1_6_3: str # Screening kolorektálního karcinomu – Povinné, 1..1 - M_A_1_6_4: str # Plicní screening – Povinné, 1..1 - M_A_1_6_5: str # Screening prostaty – Povinné, 1..1 - - # Default fields after - M_A_1_6_1_1: Optional[str] = None # Rok posledního vyšetření – Volitelné, 0..1 - M_A_1_6_2_1: Optional[str] = None # Rok posledního vyšetření – Volitelné, 0..1 - M_A_1_6_3_1: Optional[str] = None # Rok posledního vyšetření – Volitelné, 0..1 - M_A_1_6_3_2: Optional[str] = None # Forma screeningu – Volitelné, 0..1 - M_A_1_6_4_1: Optional[str] = None # Rok posledního vyšetření – Volitelné, 0..1 - M_A_1_6_5_1: Optional[str] = None # Rok posledního vyšetření – Volitelné, 0..1 - +class OncologicalScreening(BaseModel): + mammography: str = Field(default=None, alias="M_A_1_6_1") + cervical: str = Field(default=None, alias="M_A_1_6_2") + colorectal: str = Field(default=None, alias="M_A_1_6_3") + lung: str = Field(default=None, alias="M_A_1_6_4") + prostate: str = Field(default=None, alias="M_A_1_6_5") -# --- M.A.1.7 --- -@dataclass -class MA17: - # Non-default fields first - M_A_1_7_1: AnoNeUdaje # Léková alergie – Povinné, 1..1 - M_A_1_7_2: AnoNeUdaje # Alergie na jód/kontrastní látky – Povinné, 1..1 - M_A_1_7_3: AnoNeUdaje # Jiné alergie (např. potravinové, pyly, prach) – Povinné, 1..1 + mammographyYear: Optional[str] = Field(default=None, alias="M_A_1_6_1_1") + cervicalYear: Optional[str] = Field(default=None, alias="M_A_1_6_2_1") + colorectalYear: Optional[str] = Field(default=None, alias="M_A_1_6_3_1") + colorectalForm: Optional[str] = Field(default=None, alias="M_A_1_6_3_2") + lungYear: Optional[str] = Field(default=None, alias="M_A_1_6_4_1") + prostateYear: Optional[str] = Field(default=None, alias="M_A_1_6_5_1") - # Default fields after - M_A_1_7_1_1: Optional[str] = None # Specifikace lékové alergie – Podmíněně povinné, 0..1 - M_A_1_7_2_1: Optional[str] = None # Specifikace jód/kontrast – Podmíněně povinné, 0..1 - M_A_1_7_3_1: Optional[str] = None # Specifikace jiných alergií – Podmíněně povinné, 0..1 +# --- M.A.1.7 --- +class Alergy(BaseModel): + drug: YesNoType = Field(default=None, alias="M_A_1_7_1") + iodine: YesNoType = Field(default=None, alias="M_A_1_7_2") + other: YesNoType = Field(default=None, alias="M_A_1_7_3") -@dataclass -class Kurak: - aktivniKurak: str - byvalyKurak: str - pasivniKurak: str - nekurak: str - udaj_neni_k_dispozici: str + drugSpec: Optional[str] = Field(default=None, alias="M_A_1_7_1_1") + iodineSpec: Optional[str] = Field(default=None, alias="M_A_1_7_2_1") + otherSpec: Optional[str] = Field(default=None, alias="M_A_1_7_3_1") -@dataclass -class Alkohol: - abstinent: str - prilezitostniKonzumace: str - denniKonzumace: str - udaj_neni_k_dispozici: str +# --- M.A.1.8 --- +class Abusus(BaseModel): + smoker: Smoker = Field(default=None, alias="M_A_1_8_1") + alcohol: Alcohol = Field(default=None, alias="M_A_1_8_2") + drugAddiction: DrugAddiction = Field(default=None, alias="M_A_1_8_3") + cigarettesPerDay: Optional[int] = Field(default=None, alias="M_A_1_8_1_1") + smokingYears: Optional[float] = Field(default=None, alias="M_A_1_8_1_2") + packYears: Optional[int] = Field(default=None, alias="M_A_1_8_1_3") + smokingComment: Optional[str] = Field(default=None, alias="M_A_1_8_1_4") + alcoholComment: Optional[str] = Field(default=None, alias="M_A_1_8_2_1") + drugComment: Optional[str] = Field(default=None, alias="M_A_1_8_3_1") -@dataclass -class Drogovazavislost: - aktualneDrogoveZavislost: str - nikdyDrogoveZavislost: str - drogoveZavislostVMinulosti: str - udaj_neni_k_dispozici: str +# --- M.A.2 --- +class AntropometricData(BaseModel): + measurementDate: str = Field(default="", alias="M_A_2_1") + heightCm: float = Field(default=0, alias="M_A_2_2") + weightKg: float = Field(default=0, alias="M_A_2_3") + bmi: Optional[float] = Field(default=None, alias="M_A_2_4") + bsa: Optional[float] = Field(default=None, alias="M_A_2_5") -# --- M.A.1.8 --- -@dataclass -class MA18: - # Non-default fields first - M_A_1_8_1: Kurak = field(default_factory=Kurak) # Kouření – Povinné, 1..1 výběr {Aktivní kuřák, Bývalý kuřák, Pasivní kuřák, Nekuřák, údaj není k dispozici} - M_A_1_8_2: Alkohol = field(default_factory=Alkohol) # Alkohol – Povinné, 1..1 výběr {Abstinent, Příležitostní konzumace, Denní konzumace, údaj není k dispozici} - M_A_1_8_3: Drogovazavislost = field(default_factory=Drogovazavislost) # Drogová závislost – Povinné, 1..1 výběr {Aktuálně drogově závislý(á), Nikdy drogově závislý(á), Drogově závislý(á) v minulosti, Údaj není k dispozici} - - # Default fields after - M_A_1_8_1_1: Optional[float] = None # Počet denně vykouřených balíčků/krabiček – Podmíněně povinné, 0..1 - M_A_1_8_1_2: Optional[float] = None # Počet let kouření – Podmíněně povinné, 0..1 - M_A_1_8_1_3: Optional[float] = None # Počet balíčkoroků – Podmíněně povinné, 0..1 - M_A_1_8_1_4: Optional[str] = None # Kouření – komentář – Volitelné, 0..1 - M_A_1_8_2_1: Optional[str] = None # Alkohol – komentář – Volitelné, 0..1 - M_A_1_8_3_1: Optional[str] = None # Drogová závislost – komentář – Volitelné, 0..1 - - -@dataclass -class MA2: - M_A_2_1: str = "" # Datum měření – Povinné - M_A_2_2: float = 0 # Výška v cm – Povinné, 1..1 - M_A_2_3: float = 0 # Hmotnost v kg – Povinné, 1..1 - M_A_2_4: Optional[float] = ( - None # BMI – Podmíněně povinné (automatický výpočet), 1..1 - ) - M_A_2_5: Optional[float] = ( - None # BSA – Podmíněně povinné (automatický výpočet), 1..1 - ) # --- M.A.3 --- -@dataclass -class MA3: - M_A_3_1_1: Optional[int] = None # Performance status (ECOG) – 0 to 5 - M_A_3_1_2: Optional[str] = None # Datum hodnocení +class OverallPacientState(BaseModel): + ecogStatus: Optional[int] = Field(default=None, alias="M_A_3_1_1") + ecogDate: Optional[str] = Field(default=None, alias="M_A_3_1_2") -@dataclass -class MA32: - M_A_3_2_1: Optional[int] = None # Karnofského index – 0 to 100 - M_A_3_2_2: Optional[str] = None # Datum hodnocení +# @dataclass +# class MA32: +# M_A_3_2_1: Optional[int] = None # Karnofského index – 0 to 100 +# M_A_3_2_2: Optional[str] = None # Datum hodnocení # --- M.A.4 --- -@dataclass -class MA4: - M_A_4_1: str = "" # Typ opatření - M_A_4_2: Optional[str] = None # Datum provedení/zahájení opatření - M_A_4_3: Optional[str] = None # Místo uložení vzorku - M_A_4_4: Optional[str] = None # Volitelný komentář - +class FertilityPreservationMeasures(BaseModel): + measureType: str = Field(default="", alias="M_A_4_1") + dateStarted: Optional[str] = Field(default=None, alias="M_A_4_2") + storageLocation: Optional[str] = Field(default=None, alias="M_A_4_3") + optionalComment: Optional[str] = Field(default=None, alias="M_A_4_4") # --- M.A.1 --- -@dataclass -class MA1: - M_A_1_1: "MA11" = field(default_factory=MA11) - M_A_1_2: Optional[List[MA12]] = field(default_factory=list) - M_A_1_3: Optional[MA13] = None - M_A_1_5: Optional[List[MA15]] = field(default_factory=list) - M_A_1_6: Optional[MA16] = None - M_A_1_7: Optional[MA17] = None - M_A_1_8: Optional[MA18] = None +class RelevantFactors(BaseModel): + tumorSyndrome: TumorSyndrome = Field(default=None, alias="M_A_1_1") + familyHistory: Optional[OncoFamilyHistory] = Field(default=None, alias="M_A_1_2") + relevantDisease: Optional[RelevantDisease] = Field(default=None, alias="M_A_1_3") + previousCancer: Optional[PreviousOncologicalDisease] = Field(default=None, alias="M_A_1_5") + screening: Optional[OncologicalScreening] = Field(default=None, alias="M_A_1_6") + alergy: Optional[Alergy] = Field(default=None, alias="M_A_1_7") + abusus: Optional[Abusus] = Field(default=None, alias="M_A_1_8") # --- Modul A --- -@dataclass -class PacientTemplateModuleA: - M_A_1: "MA1" = field(default_factory=MA1) - M_A_2: Optional[List[MA2]] = field(default_factory=list) - M_A_3: Optional[List[MA3]] = field(default_factory=list) - M_A_3_2: Optional[List[MA32]] = field(default_factory=list) - M_A_4: Optional[List[MA4]] = field(default_factory=list) +class PacientParameters(BaseModel): + relevantFactors: RelevantFactors = Field(alias="M_A_1") + antropometricData: Optional[AntropometricData] = Field(alias="M_A_2") + overallPacientState: Optional[OverallPacientState] = Field(alias="M_A_3") + # M_A_3_2: Optional[List[MA32]] = field(default_factory=list) #Opatření k zachování plodnosti před onkologickou léčbou TODO duplicate? error in template? + fertilityPreservationMeasures: Optional[FertilityPreservationMeasures] = Field(alias="M_A_4") diff --git a/model/patientTemplateModuleB1.py b/model/patientTemplateModuleB1.py index bb832e8..3d320f1 100644 --- a/model/patientTemplateModuleB1.py +++ b/model/patientTemplateModuleB1.py @@ -1,95 +1,68 @@ -from dataclasses import dataclass, field -from typing import List, Optional, Union +from pydantic import BaseModel, Field +from typing import List, Optional +from model.types import Laterality, BiologicalBehaviour, tnmCounts, tnmCM, tnmCN, tnmCT, DiagnosticModalities, MetastasisLocation -# --- Value Sets --- -@dataclass -class Lateralita: - VPRAVO: str = "vpravo" - VLEVO: str = "vlevo" - OBOUSTRANNE: str = "oboustranně" - ODPADA: str = "odpadá" - NEZNAMO: str = "neznámo" -@dataclass -class BiologickeChovani: - BENIGNI: str = "0" - NEJISTE_NEZNAME: str = "1" - IN_SITU: str = "2" - MALIGNI_PRIMARNI: str = "3" - MALIGNI_SEKUNDARNI: str = "6" +class DiagnosisB1(BaseModel): + diagnosisOrder: str = Field(default=None, alias="M_B_1_2_1") # Pořadové číslo onkologické diagnózy + diagnosisText: str = Field(default=None, alias="M_B_1_2_3") # Diagnóza (slovně) + diagnosisCode: str = Field(default=None, alias="M_B_1_2_4") # Diagnóza – kód MKN + laterality: Laterality = Field(default=None, alias="M_B_1_2_5") # Lateralita + topography: str = Field(default=None, alias="M_B_1_2_8") # Topografie + diagnosticGroup: str = Field(default=None, alias="M_B_1_4_1") # Výběr diagnostické skupiny + relapseDate: str = Field(default=None, alias="M_B_3_2_2") # Datum relapsu/progrese + relapseType: str = Field(default=None, alias="M_B_3_2_2_1") # Typ relapsu -@dataclass -class TNM_CT: - value: str # one of ["X", "0", "is", "1", "2", "3", "4"] + # Optional fields + sequenceNumber: Optional[int] = Field(default=None, alias="M_B_1_1") + diagnosticModalities: Optional[List[DiagnosticModalities]] = Field(default=None, alias="M_B_1_2_2") + morphologyText: Optional[str] = Field(default=None, alias="M_B_1_2_6") + morphologyType: Optional[str] = Field(default=None, alias="M_B_1_2_7") + combinedMorphology: Optional[str] = Field(default=None, alias="M_B_1_2_9") + morphologyCode: Optional[str] = Field(default=None, alias="M_B_1_2_10") + biologicalBehavior: Optional[BiologicalBehaviour] = Field(default=None, alias="M_B_1_2_11") + grading: Optional[str] = Field(default=None, alias="M_B_1_2_12") + mknoVersion: Optional[str] = Field(default=None, alias="M_B_1_2_13") + diagnosisComment: Optional[str] = Field(default=None, alias="M_B_1_2_14") + orphaCode: Optional[str] = Field(default=None, alias="M_B_1_2_15") -@dataclass -class TNM_CETNOST: - value: str # one of ["1", "2", "3", "m"] + # Clinical TNM + cT: Optional[tnmCT] = Field(default=None, alias="M_B_1_3_1_1") + frequency: Optional[tnmCounts] = Field(default=None, alias="M_B_1_3_1_2") + cN: Optional[tnmCN] = Field(default=None, alias="M_B_1_3_1_3") + cM: Optional[tnmCM] = Field(default=None, alias="M_B_1_3_1_4") -@dataclass -class TNM_CN: - value: str # one of ["X", "0", "1", "2", "3"] + # Pathological TNM + pY: Optional[int] = Field(default=None, alias="M_B_1_3_2_1") + pR: Optional[int] = Field(default=None, alias="M_B_1_3_2_2") + pA: Optional[int] = Field(default=None, alias="M_B_1_3_2_3") + pT: Optional[tnmCM] = Field(default=None, alias="M_B_1_3_2_4") + pFrequency: Optional[tnmCounts] = Field(default=None, alias="M_B_1_3_2_5") + pN: Optional[tnmCN] = Field(default=None, alias="M_B_1_3_2_6") + pSn: Optional[str] = Field(default=None, alias="M_B_1_3_2_7") + positiveSentinelNodes: Optional[int] = Field(default=None, alias="M_B_1_3_2_8") + totalSentinelNodes: Optional[int] = Field(default=None, alias="M_B_1_3_2_9") + positiveOtherNodes: Optional[int] = Field(default=None, alias="M_B_1_3_2_10") + totalOtherNodes: Optional[int] = Field(default=None, alias="M_B_1_3_2_11") + pM: Optional[tnmCM] = Field(default=None, alias="M_B_1_3_2_12") -@dataclass -class TNM_CM: - value: str # one of ["X", "0", "1"] + stage: Optional[str] = Field(default=None, alias="M_B_1_3_3") # Stádium + metastasisLocation: Optional[List[MetastasisLocation]] = Field(default=None, alias="M_B_1_3_4") # Lokalizace metastáz + metastasisComment: Optional[str] = Field(default=None, alias="M_B_1_3_4_1") + lymphInvasion: Optional[str] = Field(default=None, alias="M_B_1_3_5") # L + venousInvasion: Optional[str] = Field(default=None, alias="M_B_1_3_6") # V + perineuralInvasion: Optional[str] = Field(default=None, alias="M_B_1_3_7") # Pn + classificationR: Optional[str] = Field(default=None, alias="M_B_1_3_8") # R + stagingInfo: Optional[str] = Field(default=None, alias="M_B_1_3_9") # Staging - doplňující informace -@dataclass -class MB1: - # Non-default fields first - M_B_1_2_1: str = "" - M_B_1_2_3: str = "" - M_B_1_2_4: str = "" - M_B_1_2_5: Lateralita = field(default_factory=Lateralita) - M_B_1_2_8: str = "" - M_B_1_4_1: str = "" # Výběr diagnostické skupiny (Povinné) - M_B_3_2_2: str = "" # Datum relapsu/progrese - M_B_3_2_2_1: str = "" # Typ relapsu + treatmentOngoing: Optional[bool] = Field(default=None, alias="M_B_3_2_1") # Trvá léčebná odpověď + additionalComment: Optional[str] = Field(default=None, alias="M_B_3_2_3") # Volitelný komentář - # Default fields after - M_B_1_1: Optional[int] = None - M_B_1_2_2: Optional[List[str]] = None - M_B_1_2_6: Optional[str] = None - M_B_1_2_7: Optional[str] = None - M_B_1_2_9: Optional[str] = None - M_B_1_2_10: Optional[str] = None - M_B_1_2_11: Optional[BiologickeChovani] = None - M_B_1_2_12: Optional[str] = None - M_B_1_2_13: Optional[str] = None - M_B_1_2_14: Optional[str] = None - M_B_1_2_15: Optional[str] = None - M_B_1_3_1_1: Optional[TNM_CT] = None - M_B_1_3_1_2: Optional[TNM_CETNOST] = None - M_B_1_3_1_3: Optional[TNM_CN] = None - M_B_1_3_1_4: Optional[TNM_CM] = None +class PacientTemplateModuleB1(BaseModel): + diagnosisModuleB1: DiagnosisB1 = Field(default=None, alias="M_B_1") + # diagnosisModuleB2Adult - M_B_1_3_2_1: Optional[int] = None - M_B_1_3_2_2: Optional[int] = None - M_B_1_3_2_3: Optional[int] = None - M_B_1_3_2_4: Optional[TNM_CT] = None - M_B_1_3_2_5: Optional[TNM_CETNOST] = None - M_B_1_3_2_6: Optional[TNM_CN] = None - M_B_1_3_2_7: Optional[str] = None - M_B_1_3_2_8: Optional[int] = None - M_B_1_3_2_9: Optional[int] = None - M_B_1_3_2_10: Optional[int] = None - M_B_1_3_2_11: Optional[int] = None - M_B_1_3_2_12: Optional[TNM_CM] = None - M_B_1_3_3: Optional[str] = None - M_B_1_3_4: Optional[List[str]] = None - M_B_1_3_4_1: Optional[str] = None - M_B_1_3_5: Optional[str] = None - M_B_1_3_6: Optional[str] = None - M_B_1_3_7: Optional[str] = None - M_B_1_3_8: Optional[str] = None - M_B_1_3_9: Optional[str] = None - - # M_B_2_XX: Optional[str] = None # Volitelný komentář / doplnění / slovní popis diagnózy - M_B_3_2_1: Optional[bool] = None # Trvá léčebná odpověď - M_B_3_2_3: Optional[str] = None # Volitelný komentář - -@dataclass -class PacientTemplateModuleB1: - M_B_1 : MB1 = field(default_factory=MB1) \ No newline at end of file +def emptyDiagnosisB1() -> DiagnosisB1: + return DiagnosisB1() \ No newline at end of file diff --git a/model/types.py b/model/types.py new file mode 100644 index 0000000..910554e --- /dev/null +++ b/model/types.py @@ -0,0 +1,62 @@ +from typing import Literal +from enum import Enum + + +type YesNoType = Literal['Ano', 'Ne', 'Není k dispozici'] +type Gender = Literal["Muž", "Žena", "Jiné"] # Undifferentiated = Jiné + +# A +type Smoker = Literal[ + "Aktivní kuřák", "Bývalý kuřák", "Pasivní kuřák", "Nekuřák", "Údaj není k dispozici" +] +type Alcohol = Literal[ + "Abstinent", "Příležitostní konzumace", "Denní konzumace", "Údaj není k dispozici" +] +type DrugAddiction = Literal[ + "Aktuálně drogově závislý(á)", "Nikdy drogově závislý(á)", "Drogově závislý(á) v minulosti", "Údaj není k dispozici" +] + +# B1 +# TODO maybe use the codes +# https://www.wikiskripta.eu/w/MKN-O#:~:text=Klasifikace%20je%20vyj%C3%A1d%C5%99ena%20kombinac%C3%AD%20t%C5%99%C3%AD,%C4%8D%C3%ADslice%20za%20lom%C3%ADtkem%20biologick%C3%A9%20chov%C3%A1n%C3%AD. + +# class BiologickeChovani(Enum): +# Benigní = 0, +# Nejisté_neznámé = 1, +# In_situ = 2, +# Maligní_primární = 3, +# Maligní_sekundární = 6 + + +type Laterality = Literal[ + "Vpravo", "Vlevo", "Oboustranně", "Odpadá", "Neznámo" +] +type BiologicalBehaviour = Literal[ + "Benigní", "Nejisté/neznámé", "In situ", "Maligní primární", "Maligní sekundární" +] + +type tnmCT = Literal[ + "X", "0", "is", "1", "2", "3", "4" +] + +type tnmCounts = Literal[ + "1", "2", "3", "m" +] + +type tnmCN = Literal[ + "X", "0", "1", "2", "3" +] + +type tnmCM = Literal[ + "X", "0", "1" +] + +type DiagnosticModalities = Literal[ + "Klinicky jasné", "Klinické vyšetření", "Laboratorní vyšetření/nádorové markery", + "Cytologie", "Histologie metastázy", "Histologie primárního nádoru", + "Molekulárně-biologické vyšetření", "Pitva", "DCO" +] + +type MetastasisLocation = Literal[ + "Mozek", "Plíce", "Játra", "Viscerální mimo výše uvedené", "Kost", "Měkké tkáně", "Jiné", "Žádné" +] \ No newline at end of file