Skip to content

Commit 7c6dc73

Browse files
authored
Merge pull request #2694 from ohcnetwork/medicine_administration
Fixed encounter validation in medicine administration spec
2 parents 363e40d + e843369 commit 7c6dc73

File tree

2 files changed

+71
-7
lines changed

2 files changed

+71
-7
lines changed

care/emr/resources/medication/administration/spec.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from pydantic import UUID4, BaseModel, Field, field_validator
55

66
from care.emr.fhir.schema.base import Coding, Quantity
7+
from care.emr.models.encounter import Encounter
78
from care.emr.models.medication_administration import MedicationAdministration
89
from care.emr.models.medication_request import MedicationRequest
910
from care.emr.registries.care_valueset.care_valueset import validate_valueset
@@ -15,7 +16,6 @@
1516
from care.emr.resources.medication.valueset.medication import CARE_MEDICATION_VALUESET
1617
from care.emr.resources.medication.valueset.route import CARE_ROUTE_VALUESET
1718
from care.emr.resources.user.spec import UserSpec
18-
from care.facility.models.patient_consultation import PatientConsultation
1919
from care.users.models import User
2020

2121

@@ -182,7 +182,7 @@ class MedicationAdministrationSpec(BaseMedicationAdministrationSpec):
182182
@field_validator("encounter")
183183
@classmethod
184184
def validate_encounter_exists(cls, encounter):
185-
if not PatientConsultation.objects.filter(external_id=encounter).exists():
185+
if not Encounter.objects.filter(external_id=encounter).exists():
186186
err = "Encounter not found"
187187
raise ValueError(err)
188188
return encounter
@@ -215,7 +215,7 @@ def validate_status_reason(cls, code):
215215

216216
def perform_extra_deserialization(self, is_update, obj):
217217
if not is_update:
218-
obj.encounter = PatientConsultation.objects.get(
218+
obj.encounter = Encounter.objects.get(
219219
external_id=self.encounter
220220
) # Needs more validation
221221
obj.patient = obj.encounter.patient

care/emr/resources/medication/request/spec.py

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from care.emr.fhir.schema.base import Coding
77
from care.emr.models.encounter import Encounter
88
from care.emr.models.medication_request import MedicationRequest
9+
from care.emr.registries.care_valueset.care_valueset import validate_valueset
910
from care.emr.resources.base import EMRResource
1011
from care.emr.resources.medication.valueset.additional_instruction import (
1112
CARE_ADDITIONAL_INSTRUCTION_VALUESET,
@@ -127,18 +128,72 @@ class DosageInstruction(BaseModel):
127128
timing: Timing | None = None
128129
as_needed_boolean: bool | None = None
129130
as_needed_for: Coding | None = Field(
130-
json_schema_extra={"slug": CARE_AS_NEEDED_REASON_VALUESET.slug}
131+
None, json_schema_extra={"slug": CARE_AS_NEEDED_REASON_VALUESET.slug}
131132
)
132133
site: Coding | None = Field(
133-
json_schema_extra={"slug": CARE_BODY_SITE_VALUESET.slug}
134+
None, json_schema_extra={"slug": CARE_BODY_SITE_VALUESET.slug}
135+
)
136+
route: Coding | None = Field(
137+
None, json_schema_extra={"slug": CARE_ROUTE_VALUESET.slug}
134138
)
135-
route: Coding | None = Field(json_schema_extra={"slug": CARE_ROUTE_VALUESET.slug})
136139
method: Coding | None = Field(
137-
json_schema_extra={"slug": CARE_ADMINISTRATION_METHOD_VALUESET.slug}
140+
None, json_schema_extra={"slug": CARE_ADMINISTRATION_METHOD_VALUESET.slug}
138141
)
139142
dose_and_rate: DoseAndRate | None = None
140143
max_dose_per_period: DoseRange | None = None
141144

145+
@field_validator("additional_instruction")
146+
@classmethod
147+
def validate_additional_instruction(cls, codes):
148+
return [
149+
validate_valueset(
150+
"additional_instruction",
151+
cls.model_fields["additional_instruction"].json_schema_extra["slug"],
152+
code,
153+
)
154+
for code in codes
155+
]
156+
157+
@field_validator("as_needed_for")
158+
@classmethod
159+
def validate_as_needed_for(cls, code, values):
160+
if values.data.get("as_needed_boolean", False) and not code:
161+
err = "as_needed_for is required when as_needed_boolean is True"
162+
raise ValueError(err)
163+
164+
return validate_valueset(
165+
"as_needed_for",
166+
cls.model_fields["as_needed_for"].json_schema_extra["slug"],
167+
code,
168+
)
169+
170+
@field_validator("site")
171+
@classmethod
172+
def validate_site(cls, code):
173+
return validate_valueset(
174+
"site",
175+
cls.model_fields["site"].json_schema_extra["slug"],
176+
code,
177+
)
178+
179+
@field_validator("route")
180+
@classmethod
181+
def validate_route(cls, code):
182+
return validate_valueset(
183+
"route",
184+
cls.model_fields["route"].json_schema_extra["slug"],
185+
code,
186+
)
187+
188+
@field_validator("method")
189+
@classmethod
190+
def validate_method(cls, code):
191+
return validate_valueset(
192+
"method",
193+
cls.model_fields["method"].json_schema_extra["slug"],
194+
code,
195+
)
196+
142197

143198
class BaseMedicationRequestSpec(EMRResource):
144199
__model__ = MedicationRequest
@@ -197,6 +252,15 @@ def validate_encounter_exists(cls, encounter):
197252
raise ValueError(err)
198253
return encounter
199254

255+
@field_validator("medication")
256+
@classmethod
257+
def validate_medication(cls, code):
258+
return validate_valueset(
259+
"medication",
260+
cls.model_fields["medication"].json_schema_extra["slug"],
261+
code,
262+
)
263+
200264
def perform_extra_deserialization(self, is_update, obj):
201265
if not is_update:
202266
obj.encounter = Encounter.objects.get(

0 commit comments

Comments
 (0)