|
6 | 6 | from care.emr.fhir.schema.base import Coding
|
7 | 7 | from care.emr.models.encounter import Encounter
|
8 | 8 | from care.emr.models.medication_request import MedicationRequest
|
| 9 | +from care.emr.registries.care_valueset.care_valueset import validate_valueset |
9 | 10 | from care.emr.resources.base import EMRResource
|
10 | 11 | from care.emr.resources.medication.valueset.additional_instruction import (
|
11 | 12 | CARE_ADDITIONAL_INSTRUCTION_VALUESET,
|
@@ -127,18 +128,72 @@ class DosageInstruction(BaseModel):
|
127 | 128 | timing: Timing | None = None
|
128 | 129 | as_needed_boolean: bool | None = None
|
129 | 130 | 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} |
131 | 132 | )
|
132 | 133 | 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} |
134 | 138 | )
|
135 |
| - route: Coding | None = Field(json_schema_extra={"slug": CARE_ROUTE_VALUESET.slug}) |
136 | 139 | 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} |
138 | 141 | )
|
139 | 142 | dose_and_rate: DoseAndRate | None = None
|
140 | 143 | max_dose_per_period: DoseRange | None = None
|
141 | 144 |
|
| 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 | + |
142 | 197 |
|
143 | 198 | class BaseMedicationRequestSpec(EMRResource):
|
144 | 199 | __model__ = MedicationRequest
|
@@ -197,6 +252,15 @@ def validate_encounter_exists(cls, encounter):
|
197 | 252 | raise ValueError(err)
|
198 | 253 | return encounter
|
199 | 254 |
|
| 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 | + |
200 | 264 | def perform_extra_deserialization(self, is_update, obj):
|
201 | 265 | if not is_update:
|
202 | 266 | obj.encounter = Encounter.objects.get(
|
|
0 commit comments