this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat:added diagnostic report context builder (#3480)

authored by

Nandkishor R and committed by
GitHub
2b5f733e 294670cd

+144 -93
+38
care/emr/reports/context_builder/data_points/diagnostic_report.py
··· 1 + from care.emr.models.diagnostic_report import DiagnosticReport 2 + from care.emr.reports.context_builder.data_points.base import ( 3 + Field, 4 + QuerysetContextBuilder, 5 + ) 6 + from care.emr.reports.context_builder.data_points.observation import ( 7 + ObservationContextBuilder, 8 + ) 9 + 10 + 11 + class DiagnosticReportContextBuilder(QuerysetContextBuilder): 12 + def get_context(self): 13 + return DiagnosticReport.objects.filter(encounter=self.parent_context) 14 + 15 + title = Field( 16 + display="Title", 17 + preview_value="Chest X-Ray Report", 18 + description="Title of the diagnostic report", 19 + mapping=lambda dr: dr.code.get("display") 20 + if dr.code and dr.code.get("display") 21 + else "", 22 + ) 23 + observations = Field( 24 + display="Observations", 25 + preview_value="", 26 + description="Observations summary included in the diagnostic report", 27 + target_context=ObservationContextBuilder, 28 + ) 29 + conclusion = Field( 30 + display="Conclusion", 31 + preview_value="No abnormalities detected.", 32 + description="Conclusion of the diagnostic report", 33 + ) 34 + note = Field( 35 + display="Notes", 36 + preview_value="Patient is in good health.", 37 + description="Additional notes regarding the diagnostic report", 38 + )
+22 -7
care/emr/reports/context_builder/data_points/encounter.py
··· 13 13 from care.emr.reports.context_builder.data_points.diagnosis import ( 14 14 DiagnosisContextBuilder, 15 15 ) 16 + from care.emr.reports.context_builder.data_points.diagnostic_report import ( 17 + DiagnosticReportContextBuilder, 18 + ) 16 19 from care.emr.reports.context_builder.data_points.facility import FacilityContextBuilder 17 20 from care.emr.reports.context_builder.data_points.medication import ( 18 21 MedicationPrescriptionContextBuilder, ··· 22 25 ) 23 26 from care.emr.reports.context_builder.data_points.questionnaire import ( 24 27 QuestionnaireContextBuilder, 25 - ) 26 - from care.emr.reports.context_builder.data_points.service_request import ( 27 - ServiceRequestDataPointBuilder, 28 28 ) 29 29 from care.emr.reports.context_builder.data_points.symptom import SymptomsContextBuilder 30 30 from care.emr.reports.context_builder.data_points.user import SingleUserIdContextBuilder ··· 137 137 description="Details of the patient associated with the encounter", 138 138 ) 139 139 140 - service_requests = Field( 141 - display="Service Requests", 142 - target_context=ServiceRequestDataPointBuilder, 140 + diagnostic_reports = Field( 141 + display="Diagnostic Reports", 143 142 preview_value="", 144 - description="Service requests associated with the encounter", 143 + description="Diagnostic reports associated with the encounter", 144 + target_context=DiagnosticReportContextBuilder, 145 145 ) 146 146 147 147 facility = Field( ··· 155 155 target_context=EncounterFacilityLocationContextBuilder, 156 156 preview_value="", 157 157 description="Current location within the facility for the encounter", 158 + ) 159 + 160 + start_time = Field( 161 + display="Encounter Start Time", 162 + mapping=lambda e: e.period.get("start") if e.period else None, 163 + preview_value="2026-01-12T10:01:45.088000Z", 164 + description="Start time of the encounter", 165 + ) 166 + end_time = Field( 167 + display="Encounter End Time", 168 + mapping=lambda e: e.period.get("end") 169 + if e.period and e.period.get("end") 170 + else "Ongoing", 171 + preview_value="2026-01-12T10:01:45.088000Z", 172 + description="End time of the encounter", 158 173 ) 159 174 160 175
+84
care/emr/reports/context_builder/data_points/observation.py
··· 1 + from care.emr.reports.context_builder.data_points.base import ( 2 + Field, 3 + QuerysetContextBuilder, 4 + SingleObjectContextBuilder, 5 + ) 6 + from care.emr.resources.observation.spec import Observation 7 + 8 + 9 + class ObservationValueContextBuilder(SingleObjectContextBuilder): 10 + def get_context(self): 11 + return getattr(self.parent_context, self.parent_attribute) 12 + 13 + value = Field( 14 + display="Observation Value", 15 + preview_value="12", 16 + mapping=lambda o: o.get("value") if o and o.get("value") else None, 17 + description="The value of the observation recorded", 18 + ) 19 + 20 + unit = Field( 21 + display="Observation Unit", 22 + preview_value="%", 23 + mapping=lambda o: o.get("unit").get("code") 24 + if o and o.get("unit") and o.get("unit").get("code") 25 + else None, 26 + description="The unit of measurement for the observation", 27 + ) 28 + 29 + 30 + class ObservationComponentContextBuilder(QuerysetContextBuilder): 31 + def get_context(self): 32 + return self.parent_context.component 33 + 34 + title = Field( 35 + display="Observation Component Title", 36 + preview_value="Hemoglobin A1c", 37 + mapping=lambda o: o.get("code").get("display") 38 + if o and o.get("code") and o.get("code").get("display") 39 + else "", 40 + description="The code representing the observation", 41 + ) 42 + result = Field( 43 + display="Observation Component Result", 44 + preview_value="", 45 + target_context=ObservationValueContextBuilder, 46 + description="The result value of the observation component", 47 + ) 48 + 49 + 50 + class ObservationContextBuilder(QuerysetContextBuilder): 51 + def get_context(self): 52 + return Observation.objects.filter(diagnostic_report=self.parent_context) 53 + 54 + title = Field( 55 + display="Observation Title", 56 + preview_value="Blood Glucose Level", 57 + mapping=lambda o: o.main_code.get("display") 58 + if o.main_code and o.main_code.get("display") 59 + else "", 60 + description="The code representing the observation", 61 + ) 62 + value = Field( 63 + display="Observation Value", 64 + preview_value="", 65 + target_context=ObservationValueContextBuilder, 66 + description="The value of the observation recorded", 67 + ) 68 + component = Field( 69 + display="Observation Component", 70 + preview_value="", 71 + target_context=ObservationComponentContextBuilder, 72 + description="Components of the observation", 73 + ) 74 + status = Field( 75 + display="Observation Status", 76 + preview_value="final", 77 + description="The status of the observation", 78 + ) 79 + 80 + effective_datetime = Field( 81 + display="Effective DateTime", 82 + preview_value="2023-10-01T10:00:00Z", 83 + description="The date and time when the observation was made", 84 + )
-86
care/emr/reports/context_builder/data_points/service_request.py
··· 1 - from django_filters import rest_framework as filters 2 - 3 - from care.emr.models.service_request import ServiceRequest 4 - from care.emr.reports.context_builder.data_points.base import ( 5 - Field, 6 - QuerysetContextBuilder, 7 - ) 8 - from care.emr.reports.context_builder.data_points.user import ( 9 - SingleUserRelatedContextBuilder, 10 - ) 11 - 12 - STATUS_CHOICE = { 13 - "draft": "Draft", 14 - "active": "Active", 15 - "on_hold": "On Hold", 16 - "entered_in_error": "Entered in Error", 17 - "ended": "Ended", 18 - "completed": "Completed", 19 - "revoked": "Revoked", 20 - } 21 - 22 - INTENT_CHOICE = { 23 - "proposal": "Proposal", 24 - "plan": "Plan", 25 - "directive": "Directive", 26 - "order": "Order", 27 - } 28 - 29 - CATEGORY_CHOICE = { 30 - "laboratory": "Laboratory", 31 - "imaging": "Imaging", 32 - "counselling": "Counselling", 33 - "surgical_procedure": "Surgical Procedure", 34 - } 35 - 36 - 37 - class ServiceRequestReportFilterSet(filters.FilterSet): 38 - status = filters.CharFilter(field_name="status", lookup_expr="iexact") 39 - intent = filters.CharFilter(field_name="intent", lookup_expr="iexact") 40 - category = filters.CharFilter(field_name="category", lookup_expr="iexact") 41 - priority = filters.CharFilter(field_name="priority", lookup_expr="iexact") 42 - 43 - 44 - class ServiceRequestDataPointBuilder(QuerysetContextBuilder): 45 - filterset_class = ServiceRequestReportFilterSet 46 - __filterset_backends__ = [filters.DjangoFilterBackend] 47 - 48 - title = Field( 49 - display="Title", 50 - preview_value="Complete Blood Count", 51 - description="Title of the service request", 52 - ) 53 - status = Field( 54 - display="Status", 55 - preview_value="Active", 56 - mapping=lambda sr: STATUS_CHOICE.get(sr.status, sr.status.title()) 57 - if sr.status 58 - else "", 59 - description="Current status of the service request", 60 - ) 61 - intent = Field( 62 - display="Intent", 63 - preview_value="Order", 64 - mapping=lambda sr: INTENT_CHOICE.get(sr.intent, sr.intent.title()) 65 - if sr.intent 66 - else "", 67 - description="Intent of the service request", 68 - ) 69 - category = Field( 70 - display="Category", 71 - preview_value="Laboratory", 72 - mapping=lambda sr: CATEGORY_CHOICE.get(sr.category, sr.category.title()) 73 - if sr.category 74 - else "", 75 - description="Category of the service request", 76 - ) 77 - 78 - requester = Field( 79 - display="Requester", 80 - target_context=SingleUserRelatedContextBuilder, 81 - preview_value="", 82 - description="User who requested the service", 83 - ) 84 - 85 - def get_context(self): 86 - return ServiceRequest.objects.filter(encounter=self.parent_context)