From 77ad843e33905e2c3be23e5760061dfb9fc2d3f8 Mon Sep 17 00:00:00 2001 From: Prafful Sharma Date: Tue, 13 Jan 2026 14:51:43 +0530 Subject: [PATCH 1/9] added user model cache --- care/emr/api/viewsets/patient.py | 5 +++-- care/emr/api/viewsets/scheduling/booking.py | 3 ++- care/emr/resources/allergy_intolerance/spec.py | 6 +----- care/emr/resources/condition/spec.py | 5 +---- care/emr/resources/consent/spec.py | 8 ++++---- care/emr/resources/device/history_spec.py | 9 ++------- care/emr/resources/facility/spec.py | 4 +--- care/emr/resources/facility_organization/spec.py | 6 +----- care/emr/resources/file_upload/spec.py | 12 ++++++------ care/emr/resources/location/spec.py | 6 +----- care/emr/resources/medication/administration/spec.py | 3 +-- care/emr/resources/meta_artifact/spec.py | 5 +---- care/emr/resources/notes/notes_spec.py | 6 +----- care/emr/resources/notes/thread_spec.py | 6 +----- care/emr/resources/observation/spec.py | 11 +++++------ care/emr/resources/organization/spec.py | 6 +----- care/emr/resources/patient/spec.py | 6 +----- care/emr/resources/questionnaire/spec.py | 5 +---- care/emr/resources/questionnaire_response/spec.py | 5 +---- care/emr/resources/resource_request/spec.py | 12 ++++-------- care/emr/resources/valueset/spec.py | 5 +---- 21 files changed, 40 insertions(+), 94 deletions(-) diff --git a/care/emr/api/viewsets/patient.py b/care/emr/api/viewsets/patient.py index 42d7fa4bf1..d43876ad33 100644 --- a/care/emr/api/viewsets/patient.py +++ b/care/emr/api/viewsets/patient.py @@ -14,6 +14,7 @@ from care.emr.models import Organization, PatientUser, TokenBooking from care.emr.models.patient import Patient, PatientIdentifier, PatientIdentifierConfig from care.emr.models.scheduling.token import Token +from care.emr.resources.base import model_from_cache from care.emr.resources.patient.spec import ( PatientCreateSpec, PatientIdentifierConfigRequest, @@ -278,7 +279,7 @@ def get_users(self, request, *args, **kwargs): patient = self.get_object() patient_users = PatientUser.objects.filter(patient=patient) data = [ - UserSpec.serialize(patient_user.user).to_json() + model_from_cache(UserSpec, id=patient_user.user) for patient_user in patient_users ] return Response({"results": data}) @@ -298,7 +299,7 @@ def add_user(self, request, *args, **kwargs): if PatientUser.objects.filter(user=user, patient=patient).exists(): raise ValidationError("User already exists") PatientUser.objects.create(user=user, patient=patient, role=role) - return Response(UserSpec.serialize(user).to_json()) + return Response(model_from_cache(UserSpec, id=user.id)) class PatientUserDeleteSpec(BaseModel): user: UUID4 diff --git a/care/emr/api/viewsets/scheduling/booking.py b/care/emr/api/viewsets/scheduling/booking.py index d624329fb7..8b84e0720b 100644 --- a/care/emr/api/viewsets/scheduling/booking.py +++ b/care/emr/api/viewsets/scheduling/booking.py @@ -27,6 +27,7 @@ ) from care.emr.models.scheduling import SchedulableResource, TokenBooking from care.emr.models.scheduling.token import Token, TokenCategory, TokenQueue +from care.emr.resources.base import model_from_cache from care.emr.resources.charge_item.handle_charge_item_cancel import ( handle_charge_item_cancel, ) @@ -275,7 +276,7 @@ def available_users(self, request, *args, **kwargs): return Response( { "users": [ - UserSpec.serialize(user_resource.user).to_json() + model_from_cache(UserSpec, id=user_resource.user_id) for user_resource in user_resources ] } diff --git a/care/emr/resources/allergy_intolerance/spec.py b/care/emr/resources/allergy_intolerance/spec.py index b56dffa37e..fee0e4eb58 100644 --- a/care/emr/resources/allergy_intolerance/spec.py +++ b/care/emr/resources/allergy_intolerance/spec.py @@ -8,7 +8,6 @@ from care.emr.resources.allergy_intolerance.valueset import CARE_ALLERGY_CODE_VALUESET from care.emr.resources.base import EMRResource from care.emr.resources.common.coding import Coding -from care.emr.resources.user.spec import UserSpec from care.emr.utils.valueset_coding_type import ValueSetBoundCoding @@ -134,9 +133,6 @@ class AllergyIntoleranceReadSpec(BaseAllergyIntoleranceSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) if obj.encounter: mapping["encounter"] = obj.encounter.external_id diff --git a/care/emr/resources/condition/spec.py b/care/emr/resources/condition/spec.py index 94a3e55ffe..460d7fee56 100644 --- a/care/emr/resources/condition/spec.py +++ b/care/emr/resources/condition/spec.py @@ -131,10 +131,7 @@ def perform_extra_serialization(cls, mapping, obj): if obj.encounter: mapping["encounter"] = obj.encounter.external_id - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) class ConditionUpdateSpec(BaseConditionSpec): diff --git a/care/emr/resources/consent/spec.py b/care/emr/resources/consent/spec.py index 00018603b0..5784bdf160 100644 --- a/care/emr/resources/consent/spec.py +++ b/care/emr/resources/consent/spec.py @@ -7,7 +7,7 @@ from care.emr.models import Encounter, FileUpload from care.emr.models.consent import Consent -from care.emr.resources.base import EMRResource, PeriodSpec +from care.emr.resources.base import EMRResource, PeriodSpec, model_from_cache from care.emr.resources.file_upload.spec import ( FileCategoryChoices, FileTypeChoices, @@ -117,9 +117,9 @@ def perform_extra_serialization(cls, mapping, obj): mapping["encounter"] = obj.encounter.external_id for verification in obj.verification_details: - verification["verified_by"] = UserSpec.serialize( - User.objects.get(external_id=verification["verified_by"]) - ).to_json() + verification["verified_by"] = model_from_cache( + UserSpec, external_id=verification["verified_by"] + ) mapping["verification_details"] = obj.verification_details diff --git a/care/emr/resources/device/history_spec.py b/care/emr/resources/device/history_spec.py index 35dda7b4f9..94f0a2a348 100644 --- a/care/emr/resources/device/history_spec.py +++ b/care/emr/resources/device/history_spec.py @@ -3,9 +3,8 @@ from pydantic import UUID4 from care.emr.models import DeviceServiceHistory -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.user.spec import UserSpec -from care.users.models import User class DeviceServiceHistorySpecBase(EMRResource): @@ -41,10 +40,6 @@ def perform_extra_serialization(cls, mapping, obj): edit_history = [] for history in obj.edit_history: user = history.get("updated_by") - user_obj = User.objects.filter(id=user).first() - if user_obj: - history["updated_by"] = UserSpec.serialize(user_obj).to_json() - else: - history["updated_by"] = {} # Edge Case + history["updated_by"] = model_from_cache(UserSpec, id=user) or {} edit_history.append(history) mapping["edit_history"] = edit_history diff --git a/care/emr/resources/facility/spec.py b/care/emr/resources/facility/spec.py index c45ba8c9f1..9f80c45254 100644 --- a/care/emr/resources/facility/spec.py +++ b/care/emr/resources/facility/spec.py @@ -15,7 +15,6 @@ ) from care.emr.resources.organization.spec import OrganizationReadSpec from care.emr.resources.permissions import FacilityPermissionsMixin -from care.emr.resources.user.spec import UserSpec from care.facility.models import ( REVERSE_FACILITY_TYPES, REVERSE_REVERSE_FACILITY_TYPES, @@ -109,8 +108,7 @@ class FacilityReadSpec(FacilityBaseSpec): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id mapping["read_cover_image_url"] = obj.read_cover_image_url() - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) + cls.serialize_audit_users(mapping, obj) mapping["facility_type"] = REVERSE_FACILITY_TYPES[obj.facility_type] if obj.geo_organization: mapping["geo_organization"] = OrganizationReadSpec.serialize( diff --git a/care/emr/resources/facility_organization/spec.py b/care/emr/resources/facility_organization/spec.py index 3dbb56bdaf..857b020e43 100644 --- a/care/emr/resources/facility_organization/spec.py +++ b/care/emr/resources/facility_organization/spec.py @@ -85,11 +85,7 @@ class FacilityOrganizationReadSpec(FacilityOrganizationBaseSpec): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id mapping["parent"] = obj.get_parent_json() - - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) class FacilityOrganizationRetrieveSpec(FacilityOrganizationReadSpec): diff --git a/care/emr/resources/file_upload/spec.py b/care/emr/resources/file_upload/spec.py index 41300f0183..4122793d03 100644 --- a/care/emr/resources/file_upload/spec.py +++ b/care/emr/resources/file_upload/spec.py @@ -6,7 +6,7 @@ from pydantic import UUID4, field_validator from care.emr.models import FileUpload -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.user.spec import UserSpec from care.utils.models.validators import file_name_validator @@ -92,10 +92,10 @@ def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id mapping["extension"] = obj.get_extension() mapping["mime_type"] = obj.meta.get("mime_type") - if obj.created_by: - mapping["uploaded_by"] = UserSpec.serialize(obj.created_by) - if obj.archived_by: - mapping["archived_by"] = UserSpec.serialize(obj.archived_by) + if obj.created_by_id: + mapping["uploaded_by"] = model_from_cache(UserSpec, id=obj.created_by_id) + if obj.archived_by_id: + mapping["archived_by"] = model_from_cache(UserSpec, id=obj.archived_by_id) class FileUploadRetrieveSpec(FileUploadListSpec): @@ -113,7 +113,7 @@ def perform_extra_serialization(cls, mapping, obj): mapping["read_signed_url"] = obj.files_manager.read_signed_url(obj) if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + mapping["updated_by"] = model_from_cache(UserSpec, id=obj.updated_by.id) class ConsentFileUploadCreateSpec(FileUploadBaseSpec): diff --git a/care/emr/resources/location/spec.py b/care/emr/resources/location/spec.py index fa52d1e3ac..9725fbd826 100644 --- a/care/emr/resources/location/spec.py +++ b/care/emr/resources/location/spec.py @@ -7,7 +7,6 @@ from care.emr.models.location import FacilityLocation from care.emr.resources.base import EMRResource from care.emr.resources.common import Coding -from care.emr.resources.user.spec import UserSpec class LocationEncounterAvailabilityStatusChoices(str, Enum): @@ -139,10 +138,7 @@ class FacilityLocationRetrieveSpec(FacilityLocationListSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): super().perform_extra_serialization(mapping, obj) - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) class FacilityLocationEncounterBaseSpec(EMRResource): diff --git a/care/emr/resources/medication/administration/spec.py b/care/emr/resources/medication/administration/spec.py index 496e3c7847..c69e2ce569 100644 --- a/care/emr/resources/medication/administration/spec.py +++ b/care/emr/resources/medication/administration/spec.py @@ -191,5 +191,4 @@ def perform_extra_serialization(cls, mapping, obj): obj.administered_product ) - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) + cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/meta_artifact/spec.py b/care/emr/resources/meta_artifact/spec.py index cbdfcea3ed..b81ed62dea 100644 --- a/care/emr/resources/meta_artifact/spec.py +++ b/care/emr/resources/meta_artifact/spec.py @@ -42,10 +42,7 @@ class MetaArtifactReadSpec(MetaArtifactBaseSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) class MetaArtifactCreateSpec(MetaArtifactBaseSpec): diff --git a/care/emr/resources/notes/notes_spec.py b/care/emr/resources/notes/notes_spec.py index 98dcc09ac6..78cda54fbe 100644 --- a/care/emr/resources/notes/notes_spec.py +++ b/care/emr/resources/notes/notes_spec.py @@ -48,8 +48,4 @@ class NoteMessageReadSpec(NoteMessageSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id - - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by).to_json() - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by).to_json() + cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/notes/thread_spec.py b/care/emr/resources/notes/thread_spec.py index 904c00f8e7..4688538c42 100644 --- a/care/emr/resources/notes/thread_spec.py +++ b/care/emr/resources/notes/thread_spec.py @@ -44,8 +44,4 @@ class NoteThreadReadSpec(NoteThreadSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id - - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by).to_json() - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by).to_json() + cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/observation/spec.py b/care/emr/resources/observation/spec.py index 0fb06eda2c..2fbeb6d88c 100644 --- a/care/emr/resources/observation/spec.py +++ b/care/emr/resources/observation/spec.py @@ -4,7 +4,7 @@ from pydantic import UUID4, BaseModel, Field from care.emr.models.observation import Observation -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.common import Coding from care.emr.resources.common.codable_concept import CodeableConcept from care.emr.resources.observation.valueset import ( @@ -130,12 +130,11 @@ def perform_extra_serialization(cls, mapping, obj): mapping["patient"] = None mapping["questionnaire_response"] = None - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) if obj.data_entered_by: - mapping["data_entered_by"] = UserSpec.serialize(obj.data_entered_by) + mapping["data_entered_by"] = model_from_cache( + UserSpec, id=obj.data_entered_by.id + ) class ObservationRetrieveSpec(ObservationReadSpec): diff --git a/care/emr/resources/organization/spec.py b/care/emr/resources/organization/spec.py index 4ea972a789..c90c9f41e8 100644 --- a/care/emr/resources/organization/spec.py +++ b/care/emr/resources/organization/spec.py @@ -4,7 +4,6 @@ from care.emr.models.organization import Organization from care.emr.resources.base import EMRResource -from care.emr.resources.user.spec import UserSpec from care.security.authorization import AuthorizationController @@ -71,7 +70,4 @@ def perform_extra_user_serialization(cls, mapping, obj, user): mapping["permissions"] = AuthorizationController.call( "get_permission_on_organization", obj, user ) - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/patient/spec.py b/care/emr/resources/patient/spec.py index 955b639530..aa07ddedec 100644 --- a/care/emr/resources/patient/spec.py +++ b/care/emr/resources/patient/spec.py @@ -261,17 +261,13 @@ class PatientRetrieveSpec(PatientListSpec, PatientPermissionsMixin): @classmethod def perform_extra_serialization(cls, mapping, obj, *args, **kwargs): from care.emr.resources.organization.spec import OrganizationReadSpec - from care.emr.resources.user.spec import UserSpec super().perform_extra_serialization(mapping, obj, *args, **kwargs) if obj.geo_organization: mapping["geo_organization"] = OrganizationReadSpec.serialize( obj.geo_organization ).to_json() - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by).to_json() - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by).to_json() + cls.serialize_audit_users(mapping, obj) if obj.instance_identifiers: mapping["instance_identifiers"] = [ { diff --git a/care/emr/resources/questionnaire/spec.py b/care/emr/resources/questionnaire/spec.py index 7acd55fa75..5b1c050020 100644 --- a/care/emr/resources/questionnaire/spec.py +++ b/care/emr/resources/questionnaire/spec.py @@ -290,10 +290,7 @@ def perform_extra_serialization(cls, mapping, obj): for tag in obj.tags: tags.append(QuestionnaireTag.get_tag(tag)) mapping["tags"] = tags - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) # Add this to handle recursive Question type diff --git a/care/emr/resources/questionnaire_response/spec.py b/care/emr/resources/questionnaire_response/spec.py index 3ba4ae0738..1113ef48b1 100644 --- a/care/emr/resources/questionnaire_response/spec.py +++ b/care/emr/resources/questionnaire_response/spec.py @@ -61,7 +61,4 @@ def perform_extra_serialization(cls, mapping, obj): mapping["encounter"] = obj.encounter.external_id else: mapping["encounter"] = None - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/resource_request/spec.py b/care/emr/resources/resource_request/spec.py index f92798c867..e5692339e7 100644 --- a/care/emr/resources/resource_request/spec.py +++ b/care/emr/resources/resource_request/spec.py @@ -6,7 +6,7 @@ from care.emr.models import Patient from care.emr.models.organization import FacilityOrganizationUser from care.emr.models.resource_request import ResourceRequest, ResourceRequestComment -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.facility.spec import FacilityReadSpec from care.emr.resources.patient.spec import PatientListSpec from care.emr.resources.user.spec import UserSpec @@ -148,12 +148,9 @@ def perform_extra_serialization(cls, mapping, obj): obj.related_patient ).to_json() if obj.assigned_to: - mapping["assigned_to"] = UserSpec.serialize(obj.assigned_to).to_json() + mapping["assigned_to"] = model_from_cache(UserSpec, id=obj.assigned_to.id) - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) class ResourceRequestCommentBaseSpec(EMRResource): @@ -173,8 +170,7 @@ class ResourceRequestCommentListSpec(ResourceRequestCommentBaseSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) + cls.serialize_audit_users(mapping, obj) class ResourceRequestCommentRetrieveSpec(ResourceRequestCommentListSpec): diff --git a/care/emr/resources/valueset/spec.py b/care/emr/resources/valueset/spec.py index 95137615f5..680af8d051 100644 --- a/care/emr/resources/valueset/spec.py +++ b/care/emr/resources/valueset/spec.py @@ -66,10 +66,7 @@ class ValueSetReadSpec(ValueSetBaseSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id - if obj.created_by: - mapping["created_by"] = UserSpec.serialize(obj.created_by) - if obj.updated_by: - mapping["updated_by"] = UserSpec.serialize(obj.updated_by) + cls.serialize_audit_users(mapping, obj) ValueSetSpec.model_rebuild() From 77015ed189c1539d1b5aff21c7121bf832ebebb6 Mon Sep 17 00:00:00 2001 From: Prafful Sharma Date: Tue, 13 Jan 2026 19:01:41 +0530 Subject: [PATCH 2/9] added FacilityLocationListSpec model cache --- care/emr/models/location.py | 3 ++- care/emr/resources/activity_definition/spec.py | 4 ++-- care/emr/resources/device/spec.py | 14 +++++++------- care/emr/resources/encounter/spec.py | 6 +++--- care/emr/resources/healthcare_service/spec.py | 7 ++----- .../emr/resources/inventory/inventory_item/spec.py | 6 ++++-- .../inventory/supply_delivery/delivery_order.py | 12 +++++++----- .../inventory/supply_request/request_order.py | 12 +++++++----- care/emr/resources/location/spec.py | 7 +++++-- .../medication/dispense/dispense_order.py | 6 ++++-- care/emr/resources/medication/dispense/spec.py | 6 ++++-- care/emr/resources/payment_reconciliation/spec.py | 8 ++++---- care/emr/resources/scheduling/resource/spec.py | 2 +- care/emr/resources/service_request/spec.py | 2 +- 14 files changed, 53 insertions(+), 42 deletions(-) diff --git a/care/emr/models/location.py b/care/emr/models/location.py index 3978aae2cb..c0b1f749a1 100644 --- a/care/emr/models/location.py +++ b/care/emr/models/location.py @@ -38,6 +38,7 @@ class FacilityLocation(EMRBaseModel): cache_expiry_days = 15 def get_parent_json(self): + from care.emr.resources.base import model_from_cache from care.emr.resources.location.spec import FacilityLocationListSpec if self.parent_id: @@ -46,7 +47,7 @@ def get_parent_json(self): ): return self.cached_parent_json self.parent.get_parent_json() - temp_data = FacilityLocationListSpec.serialize(self.parent).to_json() + temp_data = model_from_cache(FacilityLocationListSpec, id=self.parent.id) temp_data["cache_expiry"] = str( timezone.now() + timedelta(days=self.cache_expiry_days) ) diff --git a/care/emr/resources/activity_definition/spec.py b/care/emr/resources/activity_definition/spec.py index 840b7a5e49..abd878f5e9 100644 --- a/care/emr/resources/activity_definition/spec.py +++ b/care/emr/resources/activity_definition/spec.py @@ -12,7 +12,7 @@ from care.emr.resources.activity_definition.valueset import ( ACTIVITY_DEFINITION_PROCEDURE_CODE_VALUESET, ) -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.charge_item_definition.spec import ChargeItemDefinitionReadSpec from care.emr.resources.healthcare_service.spec import HealthcareServiceReadSpec from care.emr.resources.location.spec import FacilityLocationListSpec @@ -150,7 +150,7 @@ def perform_extra_serialization(cls, mapping, obj): location_obj = FacilityLocation.objects.filter(id=location).first() if not location_obj: continue - locations.append(FacilityLocationListSpec.serialize(location_obj).to_json()) + locations.append(model_from_cache(FacilityLocationListSpec, id=location)) mapping["locations"] = locations if obj.healthcare_service: mapping["healthcare_service"] = HealthcareServiceReadSpec.serialize( diff --git a/care/emr/resources/device/spec.py b/care/emr/resources/device/spec.py index 3f9bce4c13..9230c14ac2 100644 --- a/care/emr/resources/device/spec.py +++ b/care/emr/resources/device/spec.py @@ -5,7 +5,7 @@ from care.emr.models import Device, DeviceEncounterHistory, DeviceLocationHistory from care.emr.registries.device_type.device_registry import DeviceTypeRegistry -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.common.contact_point import ContactPoint from care.emr.resources.encounter.spec import EncounterListSpec from care.emr.resources.facility_organization.spec import FacilityOrganizationReadSpec @@ -97,9 +97,9 @@ def perform_extra_serialization(cls, mapping, obj): mapping["current_location"] = None mapping["current_encounter"] = None if obj.current_location: - mapping["current_location"] = FacilityLocationListSpec.serialize( - obj.current_location - ).to_json() + mapping["current_location"] = model_from_cache( + FacilityLocationListSpec, id=obj.current_location.id + ) if obj.current_encounter: mapping["current_encounter"] = EncounterListSpec.serialize( obj.current_encounter @@ -131,9 +131,9 @@ class DeviceLocationHistoryListSpec(EMRResource): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id if obj.location: - mapping["location"] = FacilityLocationListSpec.serialize( - obj.location - ).to_json() + mapping["location"] = model_from_cache( + FacilityLocationListSpec, id=obj.location.id + ) cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/encounter/spec.py b/care/emr/resources/encounter/spec.py index 49dc297a49..e33484164e 100644 --- a/care/emr/resources/encounter/spec.py +++ b/care/emr/resources/encounter/spec.py @@ -163,9 +163,9 @@ def perform_extra_serialization(cls, mapping, obj): ] mapping["current_location"] = None if obj.current_location: - mapping["current_location"] = FacilityLocationListSpec.serialize( - obj.current_location - ).to_json() + mapping["current_location"] = model_from_cache( + FacilityLocationListSpec, id=obj.current_location.id + ) mapping["location_history"] = [ FacilityLocationEncounterListSpecWithLocation.serialize(i) for i in FacilityLocationEncounter.objects.filter(encounter=obj).order_by( diff --git a/care/emr/resources/healthcare_service/spec.py b/care/emr/resources/healthcare_service/spec.py index 19a7925870..dfb2c79cfa 100644 --- a/care/emr/resources/healthcare_service/spec.py +++ b/care/emr/resources/healthcare_service/spec.py @@ -3,9 +3,8 @@ from pydantic import UUID4 from care.emr.models.healthcare_service import HealthcareService -from care.emr.models.location import FacilityLocation from care.emr.models.organization import FacilityOrganization -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.facility_organization.spec import FacilityOrganizationReadSpec from care.emr.resources.healthcare_service.valueset import ( HEALTHCARE_SERVICE_TYPE_CODE_VALUESET, @@ -74,9 +73,7 @@ def perform_extra_serialization(cls, mapping, obj): for location in obj.locations: try: locations.append( - FacilityLocationListSpec.serialize( - FacilityLocation.objects.get(id=location) - ).to_json() + model_from_cache(FacilityLocationListSpec, id=location) ) except Exception: # noqa S110 pass diff --git a/care/emr/resources/inventory/inventory_item/spec.py b/care/emr/resources/inventory/inventory_item/spec.py index b4d5e21aa9..41b941bb3e 100644 --- a/care/emr/resources/inventory/inventory_item/spec.py +++ b/care/emr/resources/inventory/inventory_item/spec.py @@ -3,7 +3,7 @@ from pydantic import UUID4 from care.emr.models.inventory_item import InventoryItem -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.inventory.product.spec import ProductReadSpec from care.emr.resources.location.spec import FacilityLocationListSpec @@ -40,7 +40,9 @@ class InventoryItemReadSpec(BaseInventoryItemSpec): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id mapping["product"] = ProductReadSpec.serialize(obj.product).to_json() - mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() + mapping["location"] = model_from_cache( + FacilityLocationListSpec, id=obj.location.id + ) class InventoryItemRetrieveSpec(InventoryItemReadSpec): diff --git a/care/emr/resources/inventory/supply_delivery/delivery_order.py b/care/emr/resources/inventory/supply_delivery/delivery_order.py index 05f20c55e8..d0de6f86d9 100644 --- a/care/emr/resources/inventory/supply_delivery/delivery_order.py +++ b/care/emr/resources/inventory/supply_delivery/delivery_order.py @@ -7,7 +7,7 @@ from care.emr.models.location import FacilityLocation from care.emr.models.organization import Organization from care.emr.models.supply_delivery import DeliveryOrder -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.location.spec import FacilityLocationListSpec from care.emr.resources.organization.spec import ( OrganizationReadSpec, @@ -78,10 +78,12 @@ class SupplyDeliveryOrderReadSpec(BaseSupplyDeliveryOrderSpec): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id if obj.origin: - mapping["origin"] = FacilityLocationListSpec.serialize(obj.origin).to_json() - mapping["destination"] = FacilityLocationListSpec.serialize( - obj.destination - ).to_json() + mapping["origin"] = model_from_cache( + FacilityLocationListSpec, id=obj.origin.id + ) + mapping["destination"] = model_from_cache( + FacilityLocationListSpec, id=obj.destination.id + ) if obj.supplier: mapping["supplier"] = OrganizationReadSpec.serialize(obj.supplier).to_json() mapping["tags"] = SingleFacilityTagManager().render_tags(obj) diff --git a/care/emr/resources/inventory/supply_request/request_order.py b/care/emr/resources/inventory/supply_request/request_order.py index 835f38fcac..96f94a5583 100644 --- a/care/emr/resources/inventory/supply_request/request_order.py +++ b/care/emr/resources/inventory/supply_request/request_order.py @@ -5,7 +5,7 @@ from care.emr.models.location import FacilityLocation from care.emr.models.supply_request import RequestOrder -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.location.spec import FacilityLocationListSpec from care.emr.resources.organization.spec import ( Organization, @@ -110,8 +110,10 @@ def perform_extra_serialization(cls, mapping, obj): if obj.supplier: mapping["supplier"] = OrganizationReadSpec.serialize(obj.supplier).to_json() if obj.origin: - mapping["origin"] = FacilityLocationListSpec.serialize(obj.origin).to_json() - mapping["destination"] = FacilityLocationListSpec.serialize( - obj.destination - ).to_json() + mapping["origin"] = model_from_cache( + FacilityLocationListSpec, id=obj.origin.id + ) + mapping["destination"] = model_from_cache( + FacilityLocationListSpec, id=obj.destination.id + ) mapping["tags"] = SingleFacilityTagManager().render_tags(obj) diff --git a/care/emr/resources/location/spec.py b/care/emr/resources/location/spec.py index 9725fbd826..8e35f8f852 100644 --- a/care/emr/resources/location/spec.py +++ b/care/emr/resources/location/spec.py @@ -5,7 +5,7 @@ from care.emr.models import Encounter, FacilityLocationEncounter from care.emr.models.location import FacilityLocation -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, cacheable, model_from_cache from care.emr.resources.common import Coding @@ -112,6 +112,7 @@ def perform_extra_deserialization(self, is_update, obj): obj.parent = None +@cacheable class FacilityLocationListSpec(FacilityLocationSpec): parent: dict mode: str @@ -189,7 +190,9 @@ class FacilityLocationEncounterListSpecWithLocation(FacilityLocationEncounterLis @classmethod def perform_extra_serialization(cls, mapping, obj): super().perform_extra_serialization(mapping, obj) - mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() + mapping["location"] = model_from_cache( + FacilityLocationListSpec, id=obj.location.id + ) class FacilityLocationEncounterReadSpec(FacilityLocationEncounterBaseSpec): diff --git a/care/emr/resources/medication/dispense/dispense_order.py b/care/emr/resources/medication/dispense/dispense_order.py index 47c73e9103..43d7431c14 100644 --- a/care/emr/resources/medication/dispense/dispense_order.py +++ b/care/emr/resources/medication/dispense/dispense_order.py @@ -6,7 +6,7 @@ from care.emr.models.location import FacilityLocation from care.emr.models.medication_dispense import DispenseOrder from care.emr.models.patient import Patient -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.location.spec import FacilityLocationListSpec from care.emr.resources.patient.spec import PatientListSpec from care.utils.shortcuts import get_object_or_404 @@ -61,4 +61,6 @@ class MedicationDispenseOrderReadSpec(BaseMedicationDispenseOrderSpec): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id mapping["patient"] = PatientListSpec.serialize(obj.patient).to_json() - mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() + mapping["location"] = model_from_cache( + FacilityLocationListSpec, id=obj.location.id + ) diff --git a/care/emr/resources/medication/dispense/spec.py b/care/emr/resources/medication/dispense/spec.py index 070e4cc465..ffc562a1b7 100644 --- a/care/emr/resources/medication/dispense/spec.py +++ b/care/emr/resources/medication/dispense/spec.py @@ -9,7 +9,7 @@ from care.emr.models.location import FacilityLocation from care.emr.models.medication_dispense import DispenseOrder, MedicationDispense from care.emr.models.medication_request import MedicationRequest -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.charge_item.spec import ChargeItemReadSpec from care.emr.resources.inventory.inventory_item.spec import InventoryItemReadSpec from care.emr.resources.location.spec import FacilityLocationListSpec @@ -212,7 +212,9 @@ def perform_extra_serialization(cls, mapping, obj): mapping["charge_item"] = ChargeItemReadSpec.serialize( obj.charge_item ).to_json() - mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() + mapping["location"] = model_from_cache( + FacilityLocationListSpec, id=obj.location.id + ) if obj.authorizing_request: mapping["authorizing_request"] = MedicationRequestReadSpec.serialize( obj.authorizing_request diff --git a/care/emr/resources/payment_reconciliation/spec.py b/care/emr/resources/payment_reconciliation/spec.py index 11900a7209..507efab214 100644 --- a/care/emr/resources/payment_reconciliation/spec.py +++ b/care/emr/resources/payment_reconciliation/spec.py @@ -8,7 +8,7 @@ from care.emr.models.location import FacilityLocation from care.emr.models.payment_reconciliation import PaymentReconciliation from care.emr.resources.account.spec import AccountReadSpec -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.location.spec import FacilityLocationListSpec from care.emr.resources.patient.spec import PatientRetrieveSpec @@ -146,7 +146,7 @@ def perform_extra_serialization(cls, mapping, obj): obj.account.patient, facility=obj.account.facility ).to_json() if obj.location: - mapping["location"] = FacilityLocationListSpec.serialize( - obj.location - ).to_json() + mapping["location"] = model_from_cache( + FacilityLocationListSpec, id=obj.location.id + ) cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/scheduling/resource/spec.py b/care/emr/resources/scheduling/resource/spec.py index 63b43c0b0c..618ab0d6a7 100644 --- a/care/emr/resources/scheduling/resource/spec.py +++ b/care/emr/resources/scheduling/resource/spec.py @@ -11,5 +11,5 @@ def serialize_resource(obj): if obj.resource_type == SchedulableResourceTypeOptions.healthcare_service.value: return HealthcareServiceReadSpec.serialize(obj.healthcare_service).to_json() if obj.resource_type == SchedulableResourceTypeOptions.location.value: - return FacilityLocationListSpec.serialize(obj.location).to_json() + return model_from_cache(FacilityLocationListSpec, id=obj.location.id) return {} diff --git a/care/emr/resources/service_request/spec.py b/care/emr/resources/service_request/spec.py index 00cedd92c6..5c93b09d5b 100644 --- a/care/emr/resources/service_request/spec.py +++ b/care/emr/resources/service_request/spec.py @@ -168,7 +168,7 @@ def perform_extra_serialization(cls, mapping, obj): super().perform_extra_serialization(mapping, obj) locations = [] for location in FacilityLocation.objects.filter(id__in=obj.locations): - locations.append(FacilityLocationListSpec.serialize(location).to_json()) + locations.append(model_from_cache(FacilityLocationListSpec, id=location.id)) mapping["locations"] = locations if obj.healthcare_service: From c54501c4902cfe085dbb7cf07eee29018a95eb3b Mon Sep 17 00:00:00 2001 From: Prafful Sharma Date: Tue, 13 Jan 2026 19:43:28 +0530 Subject: [PATCH 3/9] added OrganizationReadSpec model cache --- care/emr/api/viewsets/questionnaire.py | 5 +++-- care/emr/resources/facility/spec.py | 14 +++++++------- .../inventory/supply_delivery/delivery_order.py | 4 +++- .../inventory/supply_request/request_order.py | 4 +++- care/emr/resources/organization/spec.py | 3 ++- care/emr/resources/patient/spec.py | 7 ++++--- care/emr/resources/tag/config_spec.py | 7 ++++--- care/emr/resources/user/spec.py | 8 ++++---- 8 files changed, 30 insertions(+), 22 deletions(-) diff --git a/care/emr/api/viewsets/questionnaire.py b/care/emr/api/viewsets/questionnaire.py index 7728ba5aec..c4c87900a1 100644 --- a/care/emr/api/viewsets/questionnaire.py +++ b/care/emr/api/viewsets/questionnaire.py @@ -16,6 +16,7 @@ QuestionnaireTag, ) from care.emr.models.questionnaire import FormSubmission, QuestionnaireResponse +from care.emr.resources.base import model_from_cache from care.emr.resources.form_submission.spec import FormSubmissionStatusChoices from care.emr.resources.organization.spec import OrganizationReadSpec from care.emr.resources.questionnaire.spec import ( @@ -188,7 +189,7 @@ def get_organizations(self, request, *args, **kwargs): questionnaire=questionnaire ).select_related("organization") organizations_serialized = [ - OrganizationReadSpec.serialize(obj.organization).to_json() + model_from_cache(OrganizationReadSpec, id=obj.organization.id) for obj in questionnaire_organizations ] return Response( @@ -247,7 +248,7 @@ def set_organizations(self, request, *args, **kwargs): questionnaire=questionnaire, organization=organization ) organizations_serialized = [ - OrganizationReadSpec.serialize(obj.organization).to_json() + model_from_cache(OrganizationReadSpec, id=obj.organization.id) for obj in QuestionnaireOrganization.objects.filter( questionnaire=questionnaire ).select_related("organization") diff --git a/care/emr/resources/facility/spec.py b/care/emr/resources/facility/spec.py index 9f80c45254..bf15d95515 100644 --- a/care/emr/resources/facility/spec.py +++ b/care/emr/resources/facility/spec.py @@ -7,7 +7,7 @@ from care.emr.models import Organization from care.emr.models.patient import PatientIdentifierConfigCache -from care.emr.resources.base import EMRResource, cacheable +from care.emr.resources.base import EMRResource, cacheable, model_from_cache from care.emr.resources.common.coding import Coding from care.emr.resources.common.monetary_component import MonetaryComponentDefinition from care.emr.resources.invoice.default_expression_evaluator import ( @@ -111,9 +111,9 @@ def perform_extra_serialization(cls, mapping, obj): cls.serialize_audit_users(mapping, obj) mapping["facility_type"] = REVERSE_FACILITY_TYPES[obj.facility_type] if obj.geo_organization: - mapping["geo_organization"] = OrganizationReadSpec.serialize( - obj.geo_organization - ).to_json() + mapping["geo_organization"] = model_from_cache( + OrganizationReadSpec, id=obj.geo_organization.id + ) class FacilityRetrieveSpec(FacilityReadSpec, FacilityPermissionsMixin): @@ -213,6 +213,6 @@ def perform_extra_serialization(cls, mapping, obj): mapping["read_cover_image_url"] = obj.read_cover_image_url() mapping["facility_type"] = REVERSE_FACILITY_TYPES[obj.facility_type] if obj.geo_organization: - mapping["geo_organization"] = OrganizationReadSpec.serialize( - obj.geo_organization - ).to_json() + mapping["geo_organization"] = model_from_cache( + OrganizationReadSpec, id=obj.geo_organization.id + ) diff --git a/care/emr/resources/inventory/supply_delivery/delivery_order.py b/care/emr/resources/inventory/supply_delivery/delivery_order.py index d0de6f86d9..4c97bd34e7 100644 --- a/care/emr/resources/inventory/supply_delivery/delivery_order.py +++ b/care/emr/resources/inventory/supply_delivery/delivery_order.py @@ -85,5 +85,7 @@ def perform_extra_serialization(cls, mapping, obj): FacilityLocationListSpec, id=obj.destination.id ) if obj.supplier: - mapping["supplier"] = OrganizationReadSpec.serialize(obj.supplier).to_json() + mapping["supplier"] = model_from_cache( + OrganizationReadSpec, id=obj.supplier.id + ) mapping["tags"] = SingleFacilityTagManager().render_tags(obj) diff --git a/care/emr/resources/inventory/supply_request/request_order.py b/care/emr/resources/inventory/supply_request/request_order.py index 96f94a5583..6f9af7befb 100644 --- a/care/emr/resources/inventory/supply_request/request_order.py +++ b/care/emr/resources/inventory/supply_request/request_order.py @@ -108,7 +108,9 @@ class SupplyRequestOrderReadSpec(BaseSupplyRequestOrderSpec): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id if obj.supplier: - mapping["supplier"] = OrganizationReadSpec.serialize(obj.supplier).to_json() + mapping["supplier"] = model_from_cache( + OrganizationReadSpec, id=obj.supplier.id + ) if obj.origin: mapping["origin"] = model_from_cache( FacilityLocationListSpec, id=obj.origin.id diff --git a/care/emr/resources/organization/spec.py b/care/emr/resources/organization/spec.py index c90c9f41e8..3cf001679c 100644 --- a/care/emr/resources/organization/spec.py +++ b/care/emr/resources/organization/spec.py @@ -3,7 +3,7 @@ from pydantic import UUID4, model_validator from care.emr.models.organization import Organization -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, cacheable from care.security.authorization import AuthorizationController @@ -50,6 +50,7 @@ def perform_extra_deserialization(self, is_update, obj): obj.parent = None +@cacheable class OrganizationReadSpec(OrganizationBaseSpec): level_cache: int = 0 system_generated: bool diff --git a/care/emr/resources/patient/spec.py b/care/emr/resources/patient/spec.py index aa07ddedec..7380a47a42 100644 --- a/care/emr/resources/patient/spec.py +++ b/care/emr/resources/patient/spec.py @@ -260,13 +260,14 @@ class PatientRetrieveSpec(PatientListSpec, PatientPermissionsMixin): @classmethod def perform_extra_serialization(cls, mapping, obj, *args, **kwargs): + from care.emr.resources.base import model_from_cache from care.emr.resources.organization.spec import OrganizationReadSpec super().perform_extra_serialization(mapping, obj, *args, **kwargs) if obj.geo_organization: - mapping["geo_organization"] = OrganizationReadSpec.serialize( - obj.geo_organization - ).to_json() + mapping["geo_organization"] = model_from_cache( + OrganizationReadSpec, id=obj.geo_organization.id + ) cls.serialize_audit_users(mapping, obj) if obj.instance_identifiers: mapping["instance_identifiers"] = [ diff --git a/care/emr/resources/tag/config_spec.py b/care/emr/resources/tag/config_spec.py index d9f5bee43e..82dcfc668a 100644 --- a/care/emr/resources/tag/config_spec.py +++ b/care/emr/resources/tag/config_spec.py @@ -169,6 +169,7 @@ class TagConfigRetrieveSpec(TagConfigReadSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): + from care.emr.resources.base import model_from_cache from care.emr.resources.facility_organization.spec import ( FacilityOrganizationReadSpec, ) @@ -181,9 +182,9 @@ def perform_extra_serialization(cls, mapping, obj): obj.facility_organization ).to_json() if obj.organization: - mapping["organization"] = OrganizationReadSpec.serialize( - obj.organization - ).to_json() + mapping["organization"] = model_from_cache( + OrganizationReadSpec, id=obj.organization.id + ) post_save.connect( diff --git a/care/emr/resources/user/spec.py b/care/emr/resources/user/spec.py index 687cf19a9f..4900ded65a 100644 --- a/care/emr/resources/user/spec.py +++ b/care/emr/resources/user/spec.py @@ -152,9 +152,9 @@ def perform_extra_serialization(cls, mapping, obj: User): if obj.created_by_id: mapping["created_by"] = model_from_cache(UserSpec, id=obj.created_by_id) if obj.geo_organization: - mapping["geo_organization"] = OrganizationReadSpec.serialize( - obj.geo_organization - ).to_json() + mapping["geo_organization"] = model_from_cache( + OrganizationReadSpec, id=obj.geo_organization.id + ) mapping["flags"] = obj.get_all_flags() @@ -190,7 +190,7 @@ def perform_extra_serialization(cls, mapping, obj: User) -> None: ) ) mapping["organizations"] = [ - OrganizationReadSpec.serialize(obj).to_json() for obj in organizations + model_from_cache(OrganizationReadSpec, id=obj.id) for obj in organizations ] user_facilities = Facility.objects.filter( From 4414f889bdb966536b48c6b2e3f06603c8b2afa2 Mon Sep 17 00:00:00 2001 From: Prafful Sharma Date: Wed, 14 Jan 2026 00:50:44 +0530 Subject: [PATCH 4/9] added FacilityOrganizationReadSpec model cache --- care/emr/api/viewsets/encounter.py | 11 +++++++---- care/emr/api/viewsets/location.py | 11 +++++++---- care/emr/resources/device/spec.py | 6 +++--- care/emr/resources/encounter/spec.py | 4 +++- care/emr/resources/facility_organization/spec.py | 3 ++- care/emr/resources/healthcare_service/spec.py | 6 +++--- care/emr/resources/tag/config_spec.py | 6 +++--- 7 files changed, 28 insertions(+), 19 deletions(-) diff --git a/care/emr/api/viewsets/encounter.py b/care/emr/api/viewsets/encounter.py index 5b91e52f84..31539987d8 100644 --- a/care/emr/api/viewsets/encounter.py +++ b/care/emr/api/viewsets/encounter.py @@ -31,6 +31,7 @@ ) from care.emr.models.patient import PatientIdentifier, PatientIdentifierConfig from care.emr.reports import discharge_summary +from care.emr.resources.base import model_from_cache from care.emr.resources.encounter.constants import COMPLETED_CHOICES, StatusChoices from care.emr.resources.encounter.spec import ( EncounterCareTeamMemberWriteSpec, @@ -256,9 +257,9 @@ def organizations(self, request, *args, **kwargs): encounter=instance ).select_related("organization") data = [ - FacilityOrganizationReadSpec.serialize( - encounter_organization.organization - ).to_json() + model_from_cache( + FacilityOrganizationReadSpec, id=encounter_organization.organization.id + ) for encounter_organization in encounter_organizations ] return Response({"results": data}) @@ -288,7 +289,9 @@ def organizations_add(self, request, *args, **kwargs): EncounterOrganization.objects.create( encounter=instance, organization=organization ) - return Response(FacilityOrganizationReadSpec.serialize(organization).to_json()) + return Response( + model_from_cache(FacilityOrganizationReadSpec, id=organization.id) + ) @extend_schema( request=EncounterOrganizationManageSpec, diff --git a/care/emr/api/viewsets/location.py b/care/emr/api/viewsets/location.py index f83c67775b..7a39ef6058 100644 --- a/care/emr/api/viewsets/location.py +++ b/care/emr/api/viewsets/location.py @@ -16,6 +16,7 @@ FacilityLocationOrganization, ) from care.emr.models.organization import FacilityOrganization, FacilityOrganizationUser +from care.emr.resources.base import model_from_cache from care.emr.resources.encounter.constants import COMPLETED_CHOICES from care.emr.resources.facility_organization.spec import FacilityOrganizationReadSpec from care.emr.resources.location.spec import ( @@ -180,9 +181,9 @@ def organizations(self, request, *args, **kwargs): location=instance ).select_related("organization") data = [ - FacilityOrganizationReadSpec.serialize( - encounter_organization.organization - ).to_json() + model_from_cache( + FacilityOrganizationReadSpec, id=encounter_organization.organization.id + ) for encounter_organization in encounter_organizations ] return Response({"results": data}) @@ -219,7 +220,9 @@ def organizations_add(self, request, *args, **kwargs): FacilityLocationOrganization.objects.create( location=instance, organization=organization ) - return Response(FacilityOrganizationReadSpec.serialize(organization).to_json()) + return Response( + model_from_cache(FacilityOrganizationReadSpec, id=organization.id) + ) @extend_schema( request=FacilityLocationOrganizationManageSpec, responses={200: None} diff --git a/care/emr/resources/device/spec.py b/care/emr/resources/device/spec.py index 9230c14ac2..fce81c5c4e 100644 --- a/care/emr/resources/device/spec.py +++ b/care/emr/resources/device/spec.py @@ -110,9 +110,9 @@ def perform_extra_serialization(cls, mapping, obj): mapping["care_metadata"] = care_device_class().retrieve(obj) if obj.managing_organization: - mapping["managing_organization"] = FacilityOrganizationReadSpec.serialize( - obj.managing_organization - ).to_json() + mapping["managing_organization"] = model_from_cache( + FacilityOrganizationReadSpec, id=obj.managing_organization.id + ) class DeviceLocationHistoryListSpec(EMRResource): diff --git a/care/emr/resources/encounter/spec.py b/care/emr/resources/encounter/spec.py index e33484164e..f24313433e 100644 --- a/care/emr/resources/encounter/spec.py +++ b/care/emr/resources/encounter/spec.py @@ -158,7 +158,9 @@ def perform_extra_serialization(cls, mapping, obj): ).to_json() organizations = EncounterOrganization.objects.filter(encounter=obj) mapping["organizations"] = [ - FacilityOrganizationReadSpec.serialize(encounter_org.organization).to_json() + model_from_cache( + FacilityOrganizationReadSpec, id=encounter_org.organization.id + ) for encounter_org in organizations ] mapping["current_location"] = None diff --git a/care/emr/resources/facility_organization/spec.py b/care/emr/resources/facility_organization/spec.py index 857b020e43..962d4fbf61 100644 --- a/care/emr/resources/facility_organization/spec.py +++ b/care/emr/resources/facility_organization/spec.py @@ -3,7 +3,7 @@ from pydantic import UUID4, field_validator, model_validator from care.emr.models.organization import FacilityOrganization -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, cacheable from care.emr.resources.user.spec import UserSpec from care.facility.models import Facility from care.security.authorization import AuthorizationController @@ -71,6 +71,7 @@ def perform_extra_deserialization(self, is_update, obj): obj.parent = None +@cacheable class FacilityOrganizationReadSpec(FacilityOrganizationBaseSpec): org_type: FacilityOrganizationTypeChoices parent: UUID4 | None = None diff --git a/care/emr/resources/healthcare_service/spec.py b/care/emr/resources/healthcare_service/spec.py index dfb2c79cfa..0faa141ea1 100644 --- a/care/emr/resources/healthcare_service/spec.py +++ b/care/emr/resources/healthcare_service/spec.py @@ -79,6 +79,6 @@ def perform_extra_serialization(cls, mapping, obj): pass mapping["locations"] = locations if obj.managing_organization: - mapping["managing_organization"] = FacilityOrganizationReadSpec.serialize( - obj.managing_organization - ).to_json() + mapping["managing_organization"] = model_from_cache( + FacilityOrganizationReadSpec, id=obj.managing_organization.id + ) diff --git a/care/emr/resources/tag/config_spec.py b/care/emr/resources/tag/config_spec.py index 82dcfc668a..e62153084d 100644 --- a/care/emr/resources/tag/config_spec.py +++ b/care/emr/resources/tag/config_spec.py @@ -178,9 +178,9 @@ def perform_extra_serialization(cls, mapping, obj): super().perform_extra_serialization(mapping, obj) cls.serialize_audit_users(mapping, obj) if obj.facility_organization: - mapping["facility_organization"] = FacilityOrganizationReadSpec.serialize( - obj.facility_organization - ).to_json() + mapping["facility_organization"] = model_from_cache( + FacilityOrganizationReadSpec, id=obj.facility_organization.id + ) if obj.organization: mapping["organization"] = model_from_cache( OrganizationReadSpec, id=obj.organization.id From b571c98441f41e12a887448a816d91be3d372e24 Mon Sep 17 00:00:00 2001 From: Prafful Sharma Date: Wed, 14 Jan 2026 16:19:56 +0530 Subject: [PATCH 5/9] coderabbit comments --- care/emr/api/viewsets/questionnaire.py | 12 ++++++------ care/emr/resources/file_upload/spec.py | 4 ++-- care/emr/resources/resource_request/spec.py | 4 ++-- care/emr/resources/scheduling/resource/spec.py | 2 +- care/emr/resources/service_request/spec.py | 5 ++--- care/emr/resources/user/spec.py | 13 +++++++++---- 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/care/emr/api/viewsets/questionnaire.py b/care/emr/api/viewsets/questionnaire.py index c4c87900a1..dc3fd43790 100644 --- a/care/emr/api/viewsets/questionnaire.py +++ b/care/emr/api/viewsets/questionnaire.py @@ -187,10 +187,10 @@ def get_organizations(self, request, *args, **kwargs): questionnaire = self.get_object() questionnaire_organizations = QuestionnaireOrganization.objects.filter( questionnaire=questionnaire - ).select_related("organization") + ).values_list("organization_id", flat=True) organizations_serialized = [ - model_from_cache(OrganizationReadSpec, id=obj.organization.id) - for obj in questionnaire_organizations + model_from_cache(OrganizationReadSpec, id=org_id) + for org_id in questionnaire_organizations ] return Response( { @@ -248,10 +248,10 @@ def set_organizations(self, request, *args, **kwargs): questionnaire=questionnaire, organization=organization ) organizations_serialized = [ - model_from_cache(OrganizationReadSpec, id=obj.organization.id) - for obj in QuestionnaireOrganization.objects.filter( + model_from_cache(OrganizationReadSpec, id=org_id) + for org_id in QuestionnaireOrganization.objects.filter( questionnaire=questionnaire - ).select_related("organization") + ).values_list("organization_id", flat=True) ] return Response( { diff --git a/care/emr/resources/file_upload/spec.py b/care/emr/resources/file_upload/spec.py index 4122793d03..a2d57e4d02 100644 --- a/care/emr/resources/file_upload/spec.py +++ b/care/emr/resources/file_upload/spec.py @@ -112,8 +112,8 @@ def perform_extra_serialization(cls, mapping, obj): else: mapping["read_signed_url"] = obj.files_manager.read_signed_url(obj) - if obj.updated_by: - mapping["updated_by"] = model_from_cache(UserSpec, id=obj.updated_by.id) + if obj.updated_by_id: + mapping["updated_by"] = model_from_cache(UserSpec, id=obj.updated_by_id) class ConsentFileUploadCreateSpec(FileUploadBaseSpec): diff --git a/care/emr/resources/resource_request/spec.py b/care/emr/resources/resource_request/spec.py index e5692339e7..4ac181d702 100644 --- a/care/emr/resources/resource_request/spec.py +++ b/care/emr/resources/resource_request/spec.py @@ -147,8 +147,8 @@ def perform_extra_serialization(cls, mapping, obj): mapping["related_patient"] = PatientListSpec.serialize( obj.related_patient ).to_json() - if obj.assigned_to: - mapping["assigned_to"] = model_from_cache(UserSpec, id=obj.assigned_to.id) + if obj.assigned_to_id: + mapping["assigned_to"] = model_from_cache(UserSpec, id=obj.assigned_to_id) cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/scheduling/resource/spec.py b/care/emr/resources/scheduling/resource/spec.py index 618ab0d6a7..14ff7a7a30 100644 --- a/care/emr/resources/scheduling/resource/spec.py +++ b/care/emr/resources/scheduling/resource/spec.py @@ -11,5 +11,5 @@ def serialize_resource(obj): if obj.resource_type == SchedulableResourceTypeOptions.healthcare_service.value: return HealthcareServiceReadSpec.serialize(obj.healthcare_service).to_json() if obj.resource_type == SchedulableResourceTypeOptions.location.value: - return model_from_cache(FacilityLocationListSpec, id=obj.location.id) + return model_from_cache(FacilityLocationListSpec, id=obj.location_id) return {} diff --git a/care/emr/resources/service_request/spec.py b/care/emr/resources/service_request/spec.py index 5c93b09d5b..b8c86c3284 100644 --- a/care/emr/resources/service_request/spec.py +++ b/care/emr/resources/service_request/spec.py @@ -6,7 +6,6 @@ from care.emr.models.diagnostic_report import DiagnosticReport from care.emr.models.encounter import Encounter from care.emr.models.healthcare_service import HealthcareService -from care.emr.models.location import FacilityLocation from care.emr.models.service_request import ServiceRequest from care.emr.models.specimen import Specimen from care.emr.resources.activity_definition.spec import ( @@ -167,8 +166,8 @@ class ServiceRequestRetrieveSpec(ServiceRequestReadSpec): def perform_extra_serialization(cls, mapping, obj): super().perform_extra_serialization(mapping, obj) locations = [] - for location in FacilityLocation.objects.filter(id__in=obj.locations): - locations.append(model_from_cache(FacilityLocationListSpec, id=location.id)) + for location_id in obj.locations: + locations.append(model_from_cache(FacilityLocationListSpec, id=location_id)) mapping["locations"] = locations if obj.healthcare_service: diff --git a/care/emr/resources/user/spec.py b/care/emr/resources/user/spec.py index 4900ded65a..9fd67467e9 100644 --- a/care/emr/resources/user/spec.py +++ b/care/emr/resources/user/spec.py @@ -182,15 +182,20 @@ def perform_extra_serialization(cls, mapping, obj: User) -> None: super().perform_extra_serialization(mapping, obj) if obj.is_superuser: - organizations = Organization.objects.filter(parent__isnull=True) + organization_ids = list( + Organization.objects.filter(parent__isnull=True).values_list( + "id", flat=True + ) + ) else: - organizations = Organization.objects.filter( - id__in=OrganizationUser.objects.filter(user=obj).values_list( + organization_ids = list( + OrganizationUser.objects.filter(user=obj).values_list( "organization_id", flat=True ) ) mapping["organizations"] = [ - model_from_cache(OrganizationReadSpec, id=obj.id) for obj in organizations + model_from_cache(OrganizationReadSpec, id=org_id) + for org_id in organization_ids ] user_facilities = Facility.objects.filter( From 1e68dbef1ccf3ff28edebf722461f53d4ea81016 Mon Sep 17 00:00:00 2001 From: Prafful Sharma Date: Wed, 14 Jan 2026 16:46:16 +0530 Subject: [PATCH 6/9] coderabbit comments --- care/emr/api/viewsets/patient.py | 2 +- care/emr/resources/device/history_spec.py | 5 ++++- care/emr/resources/medication/dispense/dispense_order.py | 7 ++++--- care/emr/resources/observation/spec.py | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/care/emr/api/viewsets/patient.py b/care/emr/api/viewsets/patient.py index d43876ad33..c4f4c54bf2 100644 --- a/care/emr/api/viewsets/patient.py +++ b/care/emr/api/viewsets/patient.py @@ -279,7 +279,7 @@ def get_users(self, request, *args, **kwargs): patient = self.get_object() patient_users = PatientUser.objects.filter(patient=patient) data = [ - model_from_cache(UserSpec, id=patient_user.user) + model_from_cache(UserSpec, id=patient_user.user_id) for patient_user in patient_users ] return Response({"results": data}) diff --git a/care/emr/resources/device/history_spec.py b/care/emr/resources/device/history_spec.py index 94f0a2a348..2e8e3b5e0c 100644 --- a/care/emr/resources/device/history_spec.py +++ b/care/emr/resources/device/history_spec.py @@ -40,6 +40,9 @@ def perform_extra_serialization(cls, mapping, obj): edit_history = [] for history in obj.edit_history: user = history.get("updated_by") - history["updated_by"] = model_from_cache(UserSpec, id=user) or {} + if user: + history["updated_by"] = model_from_cache(UserSpec, id=user) + else: + history["updated_by"] = {} edit_history.append(history) mapping["edit_history"] = edit_history diff --git a/care/emr/resources/medication/dispense/dispense_order.py b/care/emr/resources/medication/dispense/dispense_order.py index 43d7431c14..71e8edbdee 100644 --- a/care/emr/resources/medication/dispense/dispense_order.py +++ b/care/emr/resources/medication/dispense/dispense_order.py @@ -61,6 +61,7 @@ class MedicationDispenseOrderReadSpec(BaseMedicationDispenseOrderSpec): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id mapping["patient"] = PatientListSpec.serialize(obj.patient).to_json() - mapping["location"] = model_from_cache( - FacilityLocationListSpec, id=obj.location.id - ) + if obj.location_id: + mapping["location"] = model_from_cache( + FacilityLocationListSpec, id=obj.location_id + ) diff --git a/care/emr/resources/observation/spec.py b/care/emr/resources/observation/spec.py index 2fbeb6d88c..9e52320576 100644 --- a/care/emr/resources/observation/spec.py +++ b/care/emr/resources/observation/spec.py @@ -131,9 +131,9 @@ def perform_extra_serialization(cls, mapping, obj): mapping["questionnaire_response"] = None cls.serialize_audit_users(mapping, obj) - if obj.data_entered_by: + if obj.data_entered_by_id: mapping["data_entered_by"] = model_from_cache( - UserSpec, id=obj.data_entered_by.id + UserSpec, id=obj.data_entered_by_id ) From 832f0783f3eec7e29ef03ebead0b1a6f6e7c1680 Mon Sep 17 00:00:00 2001 From: Prafful Sharma Date: Wed, 14 Jan 2026 17:13:51 +0530 Subject: [PATCH 7/9] fix test cases --- care/emr/resources/base.py | 6 +++--- .../inventory/supply_request/request_order.py | 11 ++++++----- care/emr/resources/user/spec.py | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/care/emr/resources/base.py b/care/emr/resources/base.py index fb17dea32b..fb21a693dd 100644 --- a/care/emr/resources/base.py +++ b/care/emr/resources/base.py @@ -162,9 +162,9 @@ def to_json(self): def serialize_audit_users(cls, mapping, obj): from care.emr.resources.user.spec import UserSpec - if obj.created_by_id: + if hasattr(obj, "created_by_id") and obj.created_by_id: mapping["created_by"] = model_from_cache(UserSpec, id=obj.created_by_id) - if obj.updated_by_id: + if hasattr(obj, "updated_by_id") and obj.updated_by_id: mapping["updated_by"] = model_from_cache(UserSpec, id=obj.updated_by_id) @@ -272,7 +272,7 @@ def model_from_cache(model: EMRResource, quiet=True, **kwargs) -> dict[str, Any] data = model.serialize(obj) cache.set(model_cache_key(model_string(db_model), model.__name__, pk), data) - return dict(data) + return data.model_dump(mode="json") # TODO: add param for manually adding dependencies for cache invalidation diff --git a/care/emr/resources/inventory/supply_request/request_order.py b/care/emr/resources/inventory/supply_request/request_order.py index 6f9af7befb..eb2ecd3699 100644 --- a/care/emr/resources/inventory/supply_request/request_order.py +++ b/care/emr/resources/inventory/supply_request/request_order.py @@ -111,11 +111,12 @@ def perform_extra_serialization(cls, mapping, obj): mapping["supplier"] = model_from_cache( OrganizationReadSpec, id=obj.supplier.id ) - if obj.origin: + if obj.origin_id: mapping["origin"] = model_from_cache( - FacilityLocationListSpec, id=obj.origin.id + FacilityLocationListSpec, id=obj.origin_id + ) + if obj.destination_id: + mapping["destination"] = model_from_cache( + FacilityLocationListSpec, id=obj.destination_id ) - mapping["destination"] = model_from_cache( - FacilityLocationListSpec, id=obj.destination.id - ) mapping["tags"] = SingleFacilityTagManager().render_tags(obj) diff --git a/care/emr/resources/user/spec.py b/care/emr/resources/user/spec.py index 9fd67467e9..db2fb255ca 100644 --- a/care/emr/resources/user/spec.py +++ b/care/emr/resources/user/spec.py @@ -151,9 +151,9 @@ def perform_extra_serialization(cls, mapping, obj: User): super().perform_extra_serialization(mapping, obj) if obj.created_by_id: mapping["created_by"] = model_from_cache(UserSpec, id=obj.created_by_id) - if obj.geo_organization: + if obj.geo_organization_id: mapping["geo_organization"] = model_from_cache( - OrganizationReadSpec, id=obj.geo_organization.id + OrganizationReadSpec, id=obj.geo_organization_id ) mapping["flags"] = obj.get_all_flags() From fbc57c5fb79656eb6dcd5cc3c62907048ac8d7a7 Mon Sep 17 00:00:00 2001 From: Prafful Sharma Date: Thu, 22 Jan 2026 02:48:07 +0530 Subject: [PATCH 8/9] minor fix from merge conflict --- .../resources/medication/dispense/dispense_order.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/care/emr/resources/medication/dispense/dispense_order.py b/care/emr/resources/medication/dispense/dispense_order.py index 9f20cb30eb..3a68c9ffb7 100644 --- a/care/emr/resources/medication/dispense/dispense_order.py +++ b/care/emr/resources/medication/dispense/dispense_order.py @@ -60,7 +60,9 @@ class MedicationDispenseOrderReadSpec(BaseMedicationDispenseOrderSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id - mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() + mapping["location"] = model_from_cache( + FacilityLocationListSpec, id=obj.location_id + ) mapping["patient"] = PatientListSpec.serialize(obj.patient).to_json() @@ -74,9 +76,7 @@ class MedicationDispenseOrderRetrieveSpec(MedicationDispenseOrderReadSpec): def perform_extra_serialization(cls, mapping, obj): cls.serialize_audit_users(mapping, obj) mapping["id"] = obj.external_id - mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() + mapping["location"] = model_from_cache( + FacilityLocationListSpec, id=obj.location_id + ) mapping["patient"] = PatientRetrieveSpec.serialize(obj.patient).to_json() - if obj.location_id: - mapping["location"] = model_from_cache( - FacilityLocationListSpec, id=obj.location_id - ) From afd3d75ec51f1966bf86251563acb88585128bda Mon Sep 17 00:00:00 2001 From: Prafful Sharma Date: Fri, 23 Jan 2026 12:35:53 +0530 Subject: [PATCH 9/9] remove FacilityLocationListSpec from cache --- care/emr/models/location.py | 3 +-- care/emr/resources/activity_definition/spec.py | 4 ++-- care/emr/resources/device/spec.py | 12 ++++++------ care/emr/resources/encounter/spec.py | 6 +++--- care/emr/resources/healthcare_service/spec.py | 5 ++++- care/emr/resources/inventory/inventory_item/spec.py | 6 ++---- .../inventory/supply_delivery/delivery_order.py | 10 ++++------ .../inventory/supply_request/request_order.py | 12 ++++++------ care/emr/resources/location/spec.py | 7 ++----- .../resources/medication/dispense/dispense_order.py | 12 +++++------- care/emr/resources/medication/dispense/spec.py | 6 ++---- care/emr/resources/payment_reconciliation/spec.py | 8 ++++---- care/emr/resources/scheduling/resource/spec.py | 4 +++- care/emr/resources/service_request/spec.py | 5 ++++- 14 files changed, 48 insertions(+), 52 deletions(-) diff --git a/care/emr/models/location.py b/care/emr/models/location.py index c0b1f749a1..3978aae2cb 100644 --- a/care/emr/models/location.py +++ b/care/emr/models/location.py @@ -38,7 +38,6 @@ class FacilityLocation(EMRBaseModel): cache_expiry_days = 15 def get_parent_json(self): - from care.emr.resources.base import model_from_cache from care.emr.resources.location.spec import FacilityLocationListSpec if self.parent_id: @@ -47,7 +46,7 @@ def get_parent_json(self): ): return self.cached_parent_json self.parent.get_parent_json() - temp_data = model_from_cache(FacilityLocationListSpec, id=self.parent.id) + temp_data = FacilityLocationListSpec.serialize(self.parent).to_json() temp_data["cache_expiry"] = str( timezone.now() + timedelta(days=self.cache_expiry_days) ) diff --git a/care/emr/resources/activity_definition/spec.py b/care/emr/resources/activity_definition/spec.py index abd878f5e9..840b7a5e49 100644 --- a/care/emr/resources/activity_definition/spec.py +++ b/care/emr/resources/activity_definition/spec.py @@ -12,7 +12,7 @@ from care.emr.resources.activity_definition.valueset import ( ACTIVITY_DEFINITION_PROCEDURE_CODE_VALUESET, ) -from care.emr.resources.base import EMRResource, model_from_cache +from care.emr.resources.base import EMRResource from care.emr.resources.charge_item_definition.spec import ChargeItemDefinitionReadSpec from care.emr.resources.healthcare_service.spec import HealthcareServiceReadSpec from care.emr.resources.location.spec import FacilityLocationListSpec @@ -150,7 +150,7 @@ def perform_extra_serialization(cls, mapping, obj): location_obj = FacilityLocation.objects.filter(id=location).first() if not location_obj: continue - locations.append(model_from_cache(FacilityLocationListSpec, id=location)) + locations.append(FacilityLocationListSpec.serialize(location_obj).to_json()) mapping["locations"] = locations if obj.healthcare_service: mapping["healthcare_service"] = HealthcareServiceReadSpec.serialize( diff --git a/care/emr/resources/device/spec.py b/care/emr/resources/device/spec.py index fce81c5c4e..88d4c2bf4c 100644 --- a/care/emr/resources/device/spec.py +++ b/care/emr/resources/device/spec.py @@ -97,9 +97,9 @@ def perform_extra_serialization(cls, mapping, obj): mapping["current_location"] = None mapping["current_encounter"] = None if obj.current_location: - mapping["current_location"] = model_from_cache( - FacilityLocationListSpec, id=obj.current_location.id - ) + mapping["current_location"] = FacilityLocationListSpec.serialize( + obj.current_location + ).to_json() if obj.current_encounter: mapping["current_encounter"] = EncounterListSpec.serialize( obj.current_encounter @@ -131,9 +131,9 @@ class DeviceLocationHistoryListSpec(EMRResource): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id if obj.location: - mapping["location"] = model_from_cache( - FacilityLocationListSpec, id=obj.location.id - ) + mapping["location"] = FacilityLocationListSpec.serialize( + obj.location + ).to_json() cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/encounter/spec.py b/care/emr/resources/encounter/spec.py index f24313433e..b562b7563e 100644 --- a/care/emr/resources/encounter/spec.py +++ b/care/emr/resources/encounter/spec.py @@ -165,9 +165,9 @@ def perform_extra_serialization(cls, mapping, obj): ] mapping["current_location"] = None if obj.current_location: - mapping["current_location"] = model_from_cache( - FacilityLocationListSpec, id=obj.current_location.id - ) + mapping["current_location"] = FacilityLocationListSpec.serialize( + obj.current_location + ).to_json() mapping["location_history"] = [ FacilityLocationEncounterListSpecWithLocation.serialize(i) for i in FacilityLocationEncounter.objects.filter(encounter=obj).order_by( diff --git a/care/emr/resources/healthcare_service/spec.py b/care/emr/resources/healthcare_service/spec.py index 0faa141ea1..77088e27c1 100644 --- a/care/emr/resources/healthcare_service/spec.py +++ b/care/emr/resources/healthcare_service/spec.py @@ -68,12 +68,15 @@ class HealthcareServiceRetrieveSpec(HealthcareServiceReadSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): + from care.emr.models.location import FacilityLocation + super().perform_extra_serialization(mapping, obj) locations = [] for location in obj.locations: try: + location_obj = FacilityLocation.objects.get(id=location) locations.append( - model_from_cache(FacilityLocationListSpec, id=location) + FacilityLocationListSpec.serialize(location_obj).to_json() ) except Exception: # noqa S110 pass diff --git a/care/emr/resources/inventory/inventory_item/spec.py b/care/emr/resources/inventory/inventory_item/spec.py index 3ec66760ef..5617776c69 100644 --- a/care/emr/resources/inventory/inventory_item/spec.py +++ b/care/emr/resources/inventory/inventory_item/spec.py @@ -4,7 +4,7 @@ from pydantic import UUID4, Field from care.emr.models.inventory_item import InventoryItem -from care.emr.resources.base import EMRResource, model_from_cache +from care.emr.resources.base import EMRResource from care.emr.resources.inventory.product.spec import ProductReadSpec from care.emr.resources.location.spec import FacilityLocationListSpec @@ -41,9 +41,7 @@ class InventoryItemReadSpec(BaseInventoryItemSpec): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id mapping["product"] = ProductReadSpec.serialize(obj.product).to_json() - mapping["location"] = model_from_cache( - FacilityLocationListSpec, id=obj.location.id - ) + mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() class InventoryItemRetrieveSpec(InventoryItemReadSpec): diff --git a/care/emr/resources/inventory/supply_delivery/delivery_order.py b/care/emr/resources/inventory/supply_delivery/delivery_order.py index e652fb25df..cfd90ca7fd 100644 --- a/care/emr/resources/inventory/supply_delivery/delivery_order.py +++ b/care/emr/resources/inventory/supply_delivery/delivery_order.py @@ -94,12 +94,10 @@ class SupplyDeliveryOrderReadSpec(BaseSupplyDeliveryOrderSpec): def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id if obj.origin: - mapping["origin"] = model_from_cache( - FacilityLocationListSpec, id=obj.origin.id - ) - mapping["destination"] = model_from_cache( - FacilityLocationListSpec, id=obj.destination.id - ) + mapping["origin"] = FacilityLocationListSpec.serialize(obj.origin).to_json() + mapping["destination"] = FacilityLocationListSpec.serialize( + obj.destination + ).to_json() if obj.supplier: mapping["supplier"] = model_from_cache( OrganizationReadSpec, id=obj.supplier.id diff --git a/care/emr/resources/inventory/supply_request/request_order.py b/care/emr/resources/inventory/supply_request/request_order.py index eb2ecd3699..41c0c5056f 100644 --- a/care/emr/resources/inventory/supply_request/request_order.py +++ b/care/emr/resources/inventory/supply_request/request_order.py @@ -112,11 +112,11 @@ def perform_extra_serialization(cls, mapping, obj): OrganizationReadSpec, id=obj.supplier.id ) if obj.origin_id: - mapping["origin"] = model_from_cache( - FacilityLocationListSpec, id=obj.origin_id - ) + origin = FacilityLocation.objects.get(id=obj.origin_id) + mapping["origin"] = FacilityLocationListSpec.serialize(origin).to_json() if obj.destination_id: - mapping["destination"] = model_from_cache( - FacilityLocationListSpec, id=obj.destination_id - ) + destination = FacilityLocation.objects.get(id=obj.destination_id) + mapping["destination"] = FacilityLocationListSpec.serialize( + destination + ).to_json() mapping["tags"] = SingleFacilityTagManager().render_tags(obj) diff --git a/care/emr/resources/location/spec.py b/care/emr/resources/location/spec.py index 8e35f8f852..9725fbd826 100644 --- a/care/emr/resources/location/spec.py +++ b/care/emr/resources/location/spec.py @@ -5,7 +5,7 @@ from care.emr.models import Encounter, FacilityLocationEncounter from care.emr.models.location import FacilityLocation -from care.emr.resources.base import EMRResource, cacheable, model_from_cache +from care.emr.resources.base import EMRResource from care.emr.resources.common import Coding @@ -112,7 +112,6 @@ def perform_extra_deserialization(self, is_update, obj): obj.parent = None -@cacheable class FacilityLocationListSpec(FacilityLocationSpec): parent: dict mode: str @@ -190,9 +189,7 @@ class FacilityLocationEncounterListSpecWithLocation(FacilityLocationEncounterLis @classmethod def perform_extra_serialization(cls, mapping, obj): super().perform_extra_serialization(mapping, obj) - mapping["location"] = model_from_cache( - FacilityLocationListSpec, id=obj.location.id - ) + mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() class FacilityLocationEncounterReadSpec(FacilityLocationEncounterBaseSpec): diff --git a/care/emr/resources/medication/dispense/dispense_order.py b/care/emr/resources/medication/dispense/dispense_order.py index 3a68c9ffb7..ef9af4f87e 100644 --- a/care/emr/resources/medication/dispense/dispense_order.py +++ b/care/emr/resources/medication/dispense/dispense_order.py @@ -6,7 +6,7 @@ from care.emr.models.location import FacilityLocation from care.emr.models.medication_dispense import DispenseOrder from care.emr.models.patient import Patient -from care.emr.resources.base import EMRResource, model_from_cache +from care.emr.resources.base import EMRResource from care.emr.resources.location.spec import FacilityLocationListSpec from care.emr.resources.patient.spec import PatientListSpec, PatientRetrieveSpec from care.utils.shortcuts import get_object_or_404 @@ -60,9 +60,8 @@ class MedicationDispenseOrderReadSpec(BaseMedicationDispenseOrderSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id - mapping["location"] = model_from_cache( - FacilityLocationListSpec, id=obj.location_id - ) + location = FacilityLocation.objects.get(id=obj.location_id) + mapping["location"] = FacilityLocationListSpec.serialize(location).to_json() mapping["patient"] = PatientListSpec.serialize(obj.patient).to_json() @@ -76,7 +75,6 @@ class MedicationDispenseOrderRetrieveSpec(MedicationDispenseOrderReadSpec): def perform_extra_serialization(cls, mapping, obj): cls.serialize_audit_users(mapping, obj) mapping["id"] = obj.external_id - mapping["location"] = model_from_cache( - FacilityLocationListSpec, id=obj.location_id - ) + location = FacilityLocation.objects.get(id=obj.location_id) + mapping["location"] = FacilityLocationListSpec.serialize(location).to_json() mapping["patient"] = PatientRetrieveSpec.serialize(obj.patient).to_json() diff --git a/care/emr/resources/medication/dispense/spec.py b/care/emr/resources/medication/dispense/spec.py index f53a6ddb10..883815fb58 100644 --- a/care/emr/resources/medication/dispense/spec.py +++ b/care/emr/resources/medication/dispense/spec.py @@ -10,7 +10,7 @@ from care.emr.models.location import FacilityLocation from care.emr.models.medication_dispense import DispenseOrder, MedicationDispense from care.emr.models.medication_request import MedicationRequest -from care.emr.resources.base import EMRResource, model_from_cache +from care.emr.resources.base import EMRResource from care.emr.resources.charge_item.spec import ChargeItemReadSpec from care.emr.resources.inventory.inventory_item.spec import InventoryItemReadSpec from care.emr.resources.location.spec import FacilityLocationListSpec @@ -219,9 +219,7 @@ def perform_extra_serialization(cls, mapping, obj): mapping["charge_item"] = ChargeItemReadSpec.serialize( obj.charge_item ).to_json() - mapping["location"] = model_from_cache( - FacilityLocationListSpec, id=obj.location.id - ) + mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() if obj.authorizing_request: mapping["authorizing_request"] = MedicationRequestReadSpec.serialize( obj.authorizing_request diff --git a/care/emr/resources/payment_reconciliation/spec.py b/care/emr/resources/payment_reconciliation/spec.py index a6a132425c..4afcfb9897 100644 --- a/care/emr/resources/payment_reconciliation/spec.py +++ b/care/emr/resources/payment_reconciliation/spec.py @@ -11,7 +11,7 @@ from care.emr.models.location import FacilityLocation from care.emr.models.payment_reconciliation import PaymentReconciliation from care.emr.resources.account.spec import AccountReadSpec -from care.emr.resources.base import EMRResource, model_from_cache +from care.emr.resources.base import EMRResource from care.emr.resources.location.spec import FacilityLocationListSpec from care.emr.resources.patient.spec import PatientRetrieveSpec @@ -151,7 +151,7 @@ def perform_extra_serialization(cls, mapping, obj): obj.account.patient, facility=obj.account.facility ).to_json() if obj.location: - mapping["location"] = model_from_cache( - FacilityLocationListSpec, id=obj.location.id - ) + mapping["location"] = FacilityLocationListSpec.serialize( + obj.location + ).to_json() cls.serialize_audit_users(mapping, obj) diff --git a/care/emr/resources/scheduling/resource/spec.py b/care/emr/resources/scheduling/resource/spec.py index 14ff7a7a30..3026b20c07 100644 --- a/care/emr/resources/scheduling/resource/spec.py +++ b/care/emr/resources/scheduling/resource/spec.py @@ -1,3 +1,4 @@ +from care.emr.models.location import FacilityLocation from care.emr.resources.base import model_from_cache from care.emr.resources.healthcare_service.spec import HealthcareServiceReadSpec from care.emr.resources.location.spec import FacilityLocationListSpec @@ -11,5 +12,6 @@ def serialize_resource(obj): if obj.resource_type == SchedulableResourceTypeOptions.healthcare_service.value: return HealthcareServiceReadSpec.serialize(obj.healthcare_service).to_json() if obj.resource_type == SchedulableResourceTypeOptions.location.value: - return model_from_cache(FacilityLocationListSpec, id=obj.location_id) + location = FacilityLocation.objects.get(id=obj.location_id) + return FacilityLocationListSpec.serialize(location).to_json() return {} diff --git a/care/emr/resources/service_request/spec.py b/care/emr/resources/service_request/spec.py index b8c86c3284..337d313e7e 100644 --- a/care/emr/resources/service_request/spec.py +++ b/care/emr/resources/service_request/spec.py @@ -6,6 +6,7 @@ from care.emr.models.diagnostic_report import DiagnosticReport from care.emr.models.encounter import Encounter from care.emr.models.healthcare_service import HealthcareService +from care.emr.models.location import FacilityLocation from care.emr.models.service_request import ServiceRequest from care.emr.models.specimen import Specimen from care.emr.resources.activity_definition.spec import ( @@ -167,7 +168,9 @@ def perform_extra_serialization(cls, mapping, obj): super().perform_extra_serialization(mapping, obj) locations = [] for location_id in obj.locations: - locations.append(model_from_cache(FacilityLocationListSpec, id=location_id)) + location = FacilityLocation.objects.filter(id=location_id).first() + if location: + locations.append(FacilityLocationListSpec.serialize(location).to_json()) mapping["locations"] = locations if obj.healthcare_service: