From fd499f0ebe4e952eec0eab30de972d9213aef349 Mon Sep 17 00:00:00 2001 From: Dalibor Trampota Date: Sun, 13 Apr 2025 22:48:01 +0200 Subject: [PATCH 1/6] pydantic model --- model/patientTemplate.py | 71 ++++++++---------- model/patientTemplateModuleA.py | 127 +++++++++++--------------------- model/types.py | 15 ++++ 3 files changed, 87 insertions(+), 126 deletions(-) create mode 100644 model/types.py diff --git a/model/patientTemplate.py b/model/patientTemplate.py index 48774fb..ebe73a6 100644 --- a/model/patientTemplate.py +++ b/model/patientTemplate.py @@ -1,57 +1,46 @@ -from dataclasses import dataclass, field +from pydantic import BaseModel, 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 datetime import date +from model.types import Gender, YesNoType -# from model.patientTemplateModuleB2 import PacientTemplateModuleB2 as MB2 +from model.patientTemplateModuleA import PacientParameters +from model.patientTemplateModuleB1 import DiagnosisB1 +from model.patientTemplateModuleB2 import DiagnosisB2 # from model.patientTemplateModuleC import PacientTemplateModuleC as MC - -@dataclass -class AnoNeUdaje: - ano: str - ne: str - udaj_neni_k_dispozici: str +# from model.patientTemplateModuleB2 import PacientTemplateModuleB2 as MB2 +# from model.patientTemplateModuleC import PacientTemplateModuleC as MC -@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: # Identifikace pacienta + name: str = Field(alias="M.1.1.1") # Povinné, 1..* + surname: str = Field(alias="M.1.1.2") # Povinné, 1..* + dateOfBirth: date + pacIdentifier: Identifier + nationality: Optional[str] = None + sex: Gender = Field(default_factory=list) + language: str = Field(default_factory=list) -@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: # Zdravotní pojištění + code: int = "" # Kód zdravotní pojišťovny – Podmíněně povinné, 1..1 + name: str = "" # Název zdravotní pojišťovny – Podmíněně povinné, 1..1 + id: str = Field(default_factory=list) # Číslo zdravotního pojištění – Podmíněně povinné, 1..1 (0..1 dětská MDS) -@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: # 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 + documentHeader: DocumentHeader = Field(alias="M_1") + pacientParameters: PacientParameters = Field(alias="M_A") + diagnosisB1: DiagnosisB1 = Field(alias="M_B_1") + diagnosisB2: Optional[DiagnosisB2] = Field(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..48bb29f 100644 --- a/model/patientTemplateModuleA.py +++ b/model/patientTemplateModuleA.py @@ -1,38 +1,29 @@ -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: +class TumorSyndrome(BaseModel): 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: List[str] # 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é # --- M.A.1.2 --- -@dataclass -class MA12: +class OncoFamilyHistory(BaseModel): 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..* + M_A_1_2_3: Optional[List[str]] # Onkologické onemocnění – kód MKN-10 – Volitelné, 0..* # --- M.A.1.3 --- -@dataclass -class DiseaseWithComment: +class DiseaseWithComment(BaseModel): 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: +class RelevantDisease(BaseModel): # Non-default fields first M_A_1_3_1: str = "" # Srdce a cévy M_A_1_3_2: str = "" # Metabolické @@ -44,8 +35,8 @@ class MA13: 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 + M_A_1_3_11: YesNoType # Orgánová transplantace ANO/NE/údaj není k dispozici + M_A_1_3_11_1: List[str] # Organy # Default fields after M_A_1_3_1_1: Optional[str] = None # Srdce a cévy - komentář @@ -69,9 +60,8 @@ class MA13: # --- M.A.1.5 --- -@dataclass -class MA15: - M_A_1_5_1: AnoNeUdaje # Předchozí onkologické onemocnění – Povinné, 1..1 +class PreviousOncologicalDisease(BaseModel): + M_A_1_5_1: YesNoType # 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 ) @@ -85,8 +75,7 @@ class MA15: # --- M.A.1.6 --- -@dataclass -class MA16: +class OncologicalScreening(BaseModel): # 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 @@ -104,12 +93,11 @@ class MA16: # --- M.A.1.7 --- -@dataclass -class MA17: +class Alergy(BaseModel): # 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 + M_A_1_7_1: YesNoType # Léková alergie – Povinné, 1..1 + M_A_1_7_2: YesNoType # Alergie na jód/kontrastní látky – Povinné, 1..1 + M_A_1_7_3: YesNoType # Jiné alergie (např. potravinové, pyly, prach) – Povinné, 1..1 # Default fields after M_A_1_7_1_1: Optional[str] = None # Specifikace lékové alergie – Podmíněně povinné, 0..1 @@ -117,38 +105,12 @@ class MA17: M_A_1_7_3_1: Optional[str] = None # Specifikace jiných alergií – Podmíněně povinné, 0..1 -@dataclass -class Kurak: - aktivniKurak: str - byvalyKurak: str - pasivniKurak: str - nekurak: str - udaj_neni_k_dispozici: str - - -@dataclass -class Alkohol: - abstinent: str - prilezitostniKonzumace: str - denniKonzumace: str - udaj_neni_k_dispozici: str - - -@dataclass -class Drogovazavislost: - aktualneDrogoveZavislost: str - nikdyDrogoveZavislost: str - drogoveZavislostVMinulosti: str - udaj_neni_k_dispozici: str - # --- 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} +class Abusus(BaseModel): # MA_1_8 + smoker: Smoker = Field(alias="M_A_1_8_1") # Kouření – Povinné, 1..1 + alcohol: Alcohol = Field(alias="M_A_1_8_2") # Alkohol – Povinné, 1..1 + drugAddiction: DrugAddiction = Field(alias="M_A_1_8_3") # Drogová závislost – Povinné, 1..1 # 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 @@ -159,8 +121,7 @@ class MA18: M_A_1_8_3_1: Optional[str] = None # Drogová závislost – komentář – Volitelné, 0..1 -@dataclass -class MA2: +class AntropometricData(BaseModel): 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 @@ -172,19 +133,17 @@ class MA2: ) # --- M.A.3 --- -@dataclass -class MA3: +class OverallPacientState(BaseModel): M_A_3_1_1: Optional[int] = None # Performance status (ECOG) – 0 to 5 M_A_3_1_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í +# @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: +class FertilityPreservationMeasures(BaseModel): 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 @@ -193,22 +152,20 @@ class MA4: # --- 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): + M_A_1_1: TumorSyndrome = Field(alias="M_A_1_1") + M_A_1_2: Optional[OncoFamilyHistory] = Field(alias="M_A_1_2") + M_A_1_3: Optional[RelevantDisease] = Field(alias="M_A_1_3") + M_A_1_5: Optional[PreviousOncologicalDisease] = Field(alias="M_A_1_5") + M_A_1_6: Optional[OncologicalScreening] = Field(alias="M_A_1_6") + M_A_1_7: Optional[Alergy] = Field(alias="M_A_1_7") + M_A_1_8: Optional[Abusus] = Field(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/types.py b/model/types.py new file mode 100644 index 0000000..7ada9ac --- /dev/null +++ b/model/types.py @@ -0,0 +1,15 @@ +from typing import Literal + + +type YesNoType = Literal['Ano', 'Ne', 'Není k dispozici'] +type Gender = Literal["Muž", "Žena", "Jiné"] # Undifferentiated = Jiné + +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" +] \ No newline at end of file From a89f2ed9f597437c9e4007081ca600d90a55fe75 Mon Sep 17 00:00:00 2001 From: Dalibor Trampota Date: Sun, 13 Apr 2025 22:50:58 +0200 Subject: [PATCH 2/6] chatgpt field rename WIP --- model/patientTemplateModuleA.py | 137 ++++++++++++++------------------ 1 file changed, 61 insertions(+), 76 deletions(-) diff --git a/model/patientTemplateModuleA.py b/model/patientTemplateModuleA.py index 48bb29f..8b1f6f6 100644 --- a/model/patientTemplateModuleA.py +++ b/model/patientTemplateModuleA.py @@ -4,23 +4,23 @@ # --- M.A.1.1 --- class TumorSyndrome(BaseModel): - 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] # 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é + relevantTumorSyndrome: str = Field(default="", alias="M_A_1_1_1") + syndromeNames: List[str] = Field(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 --- class OncoFamilyHistory(BaseModel): - 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]] # Onkologické onemocnění – kód MKN-10 – Volitelné, 0..* + 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(alias="M_A_1_2_3") # --- M.A.1.3 --- class DiseaseWithComment(BaseModel): - diagnózy: List[str] # Výčet z číselníku – Povinné, 1..* - komentář: Optional[str] = None # Komentář – Podmíněně povinné, 0..1 + diagnoses: List[str] # Výčet z číselníku – Povinné, 1..* + comment: Optional[str] = None # Komentář – Podmíněně povinné, 0..1 class RelevantDisease(BaseModel): @@ -61,81 +61,67 @@ class RelevantDisease(BaseModel): # --- M.A.1.5 --- class PreviousOncologicalDisease(BaseModel): - M_A_1_5_1: YesNoType # 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 - ) + hadCancer: YesNoType = Field(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 --- class OncologicalScreening(BaseModel): - # 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 + mammography: str = Field(alias="M_A_1_6_1") + cervical: str = Field(alias="M_A_1_6_2") + colorectal: str = Field(alias="M_A_1_6_3") + lung: str = Field(alias="M_A_1_6_4") + prostate: str = Field(alias="M_A_1_6_5") - # 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 + 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") # --- M.A.1.7 --- class Alergy(BaseModel): - # Non-default fields first - M_A_1_7_1: YesNoType # Léková alergie – Povinné, 1..1 - M_A_1_7_2: YesNoType # Alergie na jód/kontrastní látky – Povinné, 1..1 - M_A_1_7_3: YesNoType # Jiné alergie (např. potravinové, pyly, prach) – Povinné, 1..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 + drug: YesNoType = Field(alias="M_A_1_7_1") + iodine: YesNoType = Field(alias="M_A_1_7_2") + other: YesNoType = Field(alias="M_A_1_7_3") + 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") # --- M.A.1.8 --- -class Abusus(BaseModel): # MA_1_8 - smoker: Smoker = Field(alias="M_A_1_8_1") # Kouření – Povinné, 1..1 - alcohol: Alcohol = Field(alias="M_A_1_8_2") # Alkohol – Povinné, 1..1 - drugAddiction: DrugAddiction = Field(alias="M_A_1_8_3") # Drogová závislost – Povinné, 1..1 +class Abusus(BaseModel): + smoker: Smoker = Field(alias="M_A_1_8_1") + alcohol: Alcohol = Field(alias="M_A_1_8_2") + drugAddiction: DrugAddiction = Field(alias="M_A_1_8_3") - # 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 + 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") +# --- M.A.2 --- class AntropometricData(BaseModel): - 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 - ) + 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.3 --- class OverallPacientState(BaseModel): - M_A_3_1_1: Optional[int] = None # Performance status (ECOG) – 0 to 5 - M_A_3_1_2: Optional[str] = None # Datum hodnocení + 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: @@ -144,22 +130,21 @@ class OverallPacientState(BaseModel): # --- M.A.4 --- class FertilityPreservationMeasures(BaseModel): - 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ář - + 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 --- class RelevantFactors(BaseModel): - M_A_1_1: TumorSyndrome = Field(alias="M_A_1_1") - M_A_1_2: Optional[OncoFamilyHistory] = Field(alias="M_A_1_2") - M_A_1_3: Optional[RelevantDisease] = Field(alias="M_A_1_3") - M_A_1_5: Optional[PreviousOncologicalDisease] = Field(alias="M_A_1_5") - M_A_1_6: Optional[OncologicalScreening] = Field(alias="M_A_1_6") - M_A_1_7: Optional[Alergy] = Field(alias="M_A_1_7") - M_A_1_8: Optional[Abusus] = Field(alias="M_A_1_8") + tumorSyndrome: TumorSyndrome = Field(alias="M_A_1_1") + familyHistory: Optional[OncoFamilyHistory] = Field(alias="M_A_1_2") + relevantDisease: Optional[RelevantDisease] = Field(alias="M_A_1_3") + previousCancer: Optional[PreviousOncologicalDisease] = Field(alias="M_A_1_5") + screening: Optional[OncologicalScreening] = Field(alias="M_A_1_6") + alergy: Optional[Alergy] = Field(alias="M_A_1_7") + abusus: Optional[Abusus] = Field(alias="M_A_1_8") # --- Modul A --- From 869f2253561d161f203e1faa4eab54111ef3e206 Mon Sep 17 00:00:00 2001 From: Dalibor Trampota Date: Sun, 13 Apr 2025 22:53:33 +0200 Subject: [PATCH 3/6] chatgpt relevant deseases --- model/patientTemplate.py | 7 ++-- model/patientTemplateModuleA.py | 64 ++++++++++++++++----------------- 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/model/patientTemplate.py b/model/patientTemplate.py index ebe73a6..996cd11 100644 --- a/model/patientTemplate.py +++ b/model/patientTemplate.py @@ -1,16 +1,13 @@ from pydantic import BaseModel, Field -from typing import List, Optional +from typing import Optional from datetime import date -from model.types import Gender, YesNoType +from model.types import Gender from model.patientTemplateModuleA import PacientParameters from model.patientTemplateModuleB1 import DiagnosisB1 from model.patientTemplateModuleB2 import DiagnosisB2 # from model.patientTemplateModuleC import PacientTemplateModuleC as MC -# from model.patientTemplateModuleB2 import PacientTemplateModuleB2 as MB2 -# from model.patientTemplateModuleC import PacientTemplateModuleC as MC - class Identifier(BaseModel): typ: str # Typ identifikátoru (např. rodné číslo, pas) TODO diff --git a/model/patientTemplateModuleA.py b/model/patientTemplateModuleA.py index 8b1f6f6..3262c1b 100644 --- a/model/patientTemplateModuleA.py +++ b/model/patientTemplateModuleA.py @@ -24,39 +24,37 @@ class DiseaseWithComment(BaseModel): class RelevantDisease(BaseModel): - # 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: YesNoType # Orgánová transplantace ANO/NE/údaj není k dispozici - M_A_1_3_11_1: List[str] # 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 + 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(alias="M_A_1_3_11") + transplantedOrgans: List[str] = Field(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 --- From afdff8a1b9b86a9a4d1c5b0691f4f061aec52a34 Mon Sep 17 00:00:00 2001 From: Dalibor Trampota Date: Mon, 14 Apr 2025 10:19:37 +0200 Subject: [PATCH 4/6] Pacient chatGPT fill --- model/patientTemplate.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/model/patientTemplate.py b/model/patientTemplate.py index 996cd11..c8498c9 100644 --- a/model/patientTemplate.py +++ b/model/patientTemplate.py @@ -14,20 +14,20 @@ class Identifier(BaseModel): identifikator: str # Identifikátor osoby -class PacientIdentification: # Identifikace pacienta - name: str = Field(alias="M.1.1.1") # Povinné, 1..* - surname: str = Field(alias="M.1.1.2") # Povinné, 1..* - dateOfBirth: date - pacIdentifier: Identifier - nationality: Optional[str] = None - sex: Gender = Field(default_factory=list) - language: str = Field(default_factory=list) - - -class HealthInsurance: # Zdravotní pojištění - code: int = "" # Kód zdravotní pojišťovny – Podmíněně povinné, 1..1 - name: str = "" # Název zdravotní pojišťovny – Podmíněně povinné, 1..1 - id: str = Field(default_factory=list) # Číslo zdravotního pojištění – Podmíněně povinné, 1..1 (0..1 dětská MDS) +class PatientIdentification(BaseModel): # M.1.1 + firstName: str = Field(alias="M.1.1.1") # Křestní jméno (First name) + lastName: str = Field(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) + + +class HealthInsurance(BaseModel): # M.1.2 + code: int = Field(alias="M.1.2.1") # Kód zdravotní pojišťovny + company: str = Field(alias="M.1.2.2") # Název zdravotní pojišťovny + insuranceNumber: str = Field(alias="M.1.2.3") # Číslo zdravotního pojištění class DocumentHeader: # Hlavička dokumentu From 7e254896bee4a25d67f52e6124c219381a45e9d4 Mon Sep 17 00:00:00 2001 From: Dalibor Trampota Date: Mon, 14 Apr 2025 10:45:18 +0200 Subject: [PATCH 5/6] pacient B1 rename --- model/patientTemplate.py | 6 +- model/patientTemplateModuleB1.py | 141 ++++++++++++------------------- model/types.py | 47 +++++++++++ 3 files changed, 105 insertions(+), 89 deletions(-) diff --git a/model/patientTemplate.py b/model/patientTemplate.py index c8498c9..4529bbb 100644 --- a/model/patientTemplate.py +++ b/model/patientTemplate.py @@ -14,7 +14,7 @@ class Identifier(BaseModel): identifikator: str # Identifikátor osoby -class PatientIdentification(BaseModel): # M.1.1 +class PacientIdentification(BaseModel): # M.1.1 firstName: str = Field(alias="M.1.1.1") # Křestní jméno (First name) lastName: str = Field(alias="M.1.1.2") # Příjmení (Surname) dateOfBirth: date = Field(default=None, alias="M.1.1.3") # Datum narození (Date of Birth) @@ -30,12 +30,12 @@ class HealthInsurance(BaseModel): # M.1.2 insuranceNumber: str = Field(alias="M.1.2.3") # Číslo zdravotního pojištění -class DocumentHeader: # Hlavička dokumentu +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 -class PacientTemplate: +class PacientTemplate(BaseModel): documentHeader: DocumentHeader = Field(alias="M_1") pacientParameters: PacientParameters = Field(alias="M_A") diagnosisB1: DiagnosisB1 = Field(alias="M_B_1") diff --git a/model/patientTemplateModuleB1.py b/model/patientTemplateModuleB1.py index bb832e8..442d4af 100644 --- a/model/patientTemplateModuleB1.py +++ b/model/patientTemplateModuleB1.py @@ -1,95 +1,64 @@ -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(alias="M_B_1_2_1") # Pořadové číslo onkologické diagnózy + diagnosisText: str = Field(alias="M_B_1_2_3") # Diagnóza (slovně) + diagnosisCode: str = Field(alias="M_B_1_2_4") # Diagnóza – kód MKN + laterality: Laterality = Field(alias="M_B_1_2_5") # Lateralita + topography: str = Field(alias="M_B_1_2_8") # Topografie + diagnosticGroup: str = Field(alias="M_B_1_4_1") # Výběr diagnostické skupiny + relapseDate: str = Field(alias="M_B_3_2_2") # Datum relapsu/progrese + relapseType: str = Field(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 - - 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 +class PacientTemplateModuleB1(BaseModel): + diagnosisModuleB1: DiagnosisB1 = Field(alias="M_B_1") + # diagnosisModuleB2Adult diff --git a/model/types.py b/model/types.py index 7ada9ac..910554e 100644 --- a/model/types.py +++ b/model/types.py @@ -1,9 +1,11 @@ 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" ] @@ -12,4 +14,49 @@ ] 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 From abbdd56b701520908ea4fd292bb2085c37b44a47 Mon Sep 17 00:00:00 2001 From: Dalibor Trampota Date: Mon, 14 Apr 2025 11:56:41 +0200 Subject: [PATCH 6/6] default none --- model/patientTemplate.py | 20 +++++++------- model/patientTemplateModuleA.py | 46 ++++++++++++++++---------------- model/patientTemplateModuleB1.py | 22 ++++++++------- 3 files changed, 46 insertions(+), 42 deletions(-) diff --git a/model/patientTemplate.py b/model/patientTemplate.py index 4529bbb..b7e5cfc 100644 --- a/model/patientTemplate.py +++ b/model/patientTemplate.py @@ -1,11 +1,11 @@ -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, ConfigDict from typing import Optional from datetime import date from model.types import Gender -from model.patientTemplateModuleA import PacientParameters -from model.patientTemplateModuleB1 import DiagnosisB1 -from model.patientTemplateModuleB2 import DiagnosisB2 +from model.patientTemplateModuleA import PacientParameters, emptyPacientParameters +from model.patientTemplateModuleB1 import DiagnosisB1, emptyDiagnosisB1 +# from model.patientTemplateModuleB2 import DiagnosisB2 # from model.patientTemplateModuleC import PacientTemplateModuleC as MC @@ -15,8 +15,8 @@ class Identifier(BaseModel): class PacientIdentification(BaseModel): # M.1.1 - firstName: str = Field(alias="M.1.1.1") # Křestní jméno (First name) - lastName: str = Field(alias="M.1.1.2") # Příjmení (Surname) + 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) @@ -25,9 +25,9 @@ class PacientIdentification(BaseModel): # M.1.1 class HealthInsurance(BaseModel): # M.1.2 - code: int = Field(alias="M.1.2.1") # Kód zdravotní pojišťovny - company: str = Field(alias="M.1.2.2") # Název zdravotní pojišťovny - insuranceNumber: str = Field(alias="M.1.2.3") # Číslo zdravotního pojištění + 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í class DocumentHeader(BaseModel): # Hlavička dokumentu @@ -39,5 +39,5 @@ 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(alias="M_B_2") # Optional list of MB2 + # 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 3262c1b..37ba9a8 100644 --- a/model/patientTemplateModuleA.py +++ b/model/patientTemplateModuleA.py @@ -5,7 +5,7 @@ # --- M.A.1.1 --- class TumorSyndrome(BaseModel): relevantTumorSyndrome: str = Field(default="", alias="M_A_1_1_1") - syndromeNames: List[str] = Field(alias="M_A_1_1_2") + 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") @@ -14,7 +14,7 @@ class TumorSyndrome(BaseModel): 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(alias="M_A_1_2_3") + cancerICD10Codes: Optional[List[str]] = Field(default=None, alias="M_A_1_2_3") # --- M.A.1.3 --- @@ -34,8 +34,8 @@ class RelevantDisease(BaseModel): 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(alias="M_A_1_3_11") - transplantedOrgans: List[str] = Field(alias="M_A_1_3_11_1") + 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") @@ -59,7 +59,7 @@ class RelevantDisease(BaseModel): # --- M.A.1.5 --- class PreviousOncologicalDisease(BaseModel): - hadCancer: YesNoType = Field(alias="M_A_1_5_1") + 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") @@ -68,11 +68,11 @@ class PreviousOncologicalDisease(BaseModel): # --- M.A.1.6 --- class OncologicalScreening(BaseModel): - mammography: str = Field(alias="M_A_1_6_1") - cervical: str = Field(alias="M_A_1_6_2") - colorectal: str = Field(alias="M_A_1_6_3") - lung: str = Field(alias="M_A_1_6_4") - prostate: str = Field(alias="M_A_1_6_5") + 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") 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") @@ -84,9 +84,9 @@ class OncologicalScreening(BaseModel): # --- M.A.1.7 --- class Alergy(BaseModel): - drug: YesNoType = Field(alias="M_A_1_7_1") - iodine: YesNoType = Field(alias="M_A_1_7_2") - other: YesNoType = Field(alias="M_A_1_7_3") + 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") 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") @@ -95,9 +95,9 @@ class Alergy(BaseModel): # --- M.A.1.8 --- class Abusus(BaseModel): - smoker: Smoker = Field(alias="M_A_1_8_1") - alcohol: Alcohol = Field(alias="M_A_1_8_2") - drugAddiction: DrugAddiction = Field(alias="M_A_1_8_3") + 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") @@ -136,13 +136,13 @@ class FertilityPreservationMeasures(BaseModel): # --- M.A.1 --- class RelevantFactors(BaseModel): - tumorSyndrome: TumorSyndrome = Field(alias="M_A_1_1") - familyHistory: Optional[OncoFamilyHistory] = Field(alias="M_A_1_2") - relevantDisease: Optional[RelevantDisease] = Field(alias="M_A_1_3") - previousCancer: Optional[PreviousOncologicalDisease] = Field(alias="M_A_1_5") - screening: Optional[OncologicalScreening] = Field(alias="M_A_1_6") - alergy: Optional[Alergy] = Field(alias="M_A_1_7") - abusus: Optional[Abusus] = Field(alias="M_A_1_8") + 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 --- diff --git a/model/patientTemplateModuleB1.py b/model/patientTemplateModuleB1.py index 442d4af..3d320f1 100644 --- a/model/patientTemplateModuleB1.py +++ b/model/patientTemplateModuleB1.py @@ -4,14 +4,14 @@ class DiagnosisB1(BaseModel): - diagnosisOrder: str = Field(alias="M_B_1_2_1") # Pořadové číslo onkologické diagnózy - diagnosisText: str = Field(alias="M_B_1_2_3") # Diagnóza (slovně) - diagnosisCode: str = Field(alias="M_B_1_2_4") # Diagnóza – kód MKN - laterality: Laterality = Field(alias="M_B_1_2_5") # Lateralita - topography: str = Field(alias="M_B_1_2_8") # Topografie - diagnosticGroup: str = Field(alias="M_B_1_4_1") # Výběr diagnostické skupiny - relapseDate: str = Field(alias="M_B_3_2_2") # Datum relapsu/progrese - relapseType: str = Field(alias="M_B_3_2_2_1") # Typ relapsu + 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 # Optional fields sequenceNumber: Optional[int] = Field(default=None, alias="M_B_1_1") @@ -60,5 +60,9 @@ class DiagnosisB1(BaseModel): class PacientTemplateModuleB1(BaseModel): - diagnosisModuleB1: DiagnosisB1 = Field(alias="M_B_1") + diagnosisModuleB1: DiagnosisB1 = Field(default=None, alias="M_B_1") # diagnosisModuleB2Adult + + +def emptyDiagnosisB1() -> DiagnosisB1: + return DiagnosisB1() \ No newline at end of file