diff --git a/care/emr/api/viewsets/facility.py b/care/emr/api/viewsets/facility.py index c4d53aff5c..3bacdd0975 100644 --- a/care/emr/api/viewsets/facility.py +++ b/care/emr/api/viewsets/facility.py @@ -84,7 +84,7 @@ class FacilityViewSet(EMRModelViewSet): filter_backends = [DjangoFilterBackend] def get_queryset(self): - qs = super().get_queryset() + qs = super().get_queryset().select_related("geo_organization") if self.request.user.is_superuser: return qs organization_ids = list( @@ -217,4 +217,6 @@ class AllFacilityViewSet(EMRModelReadOnlyViewSet): search_fields = ["name"] def get_queryset(self): - return Facility.objects.filter(is_public=True).select_related() + return Facility.objects.filter(is_public=True).select_related( + "geo_organization" + ) diff --git a/care/emr/api/viewsets/location.py b/care/emr/api/viewsets/location.py index f83c67775b..abaeab7a94 100644 --- a/care/emr/api/viewsets/location.py +++ b/care/emr/api/viewsets/location.py @@ -176,14 +176,14 @@ def get_queryset(self): def organizations(self, request, *args, **kwargs): # AuthZ is controlled from the get_queryset method, no need to repeat instance = self.get_object() - encounter_organizations = FacilityLocationOrganization.objects.filter( + location_organizations = FacilityLocationOrganization.objects.filter( location=instance ).select_related("organization") data = [ FacilityOrganizationReadSpec.serialize( - encounter_organization.organization + location_organization.organization ).to_json() - for encounter_organization in encounter_organizations + for location_organization in location_organizations ] return Response({"results": data}) diff --git a/care/emr/api/viewsets/organization.py b/care/emr/api/viewsets/organization.py index 92ded69c12..842309330c 100644 --- a/care/emr/api/viewsets/organization.py +++ b/care/emr/api/viewsets/organization.py @@ -325,4 +325,6 @@ def get_queryset(self): raise PermissionDenied( "User does not have the required permissions to list users" ) - return OrganizationUser.objects.filter(organization=organization) + return OrganizationUser.objects.filter( + organization=organization + ).select_related("role") diff --git a/care/emr/api/viewsets/patient.py b/care/emr/api/viewsets/patient.py index 43bfbb0d3a..da87d4312e 100644 --- a/care/emr/api/viewsets/patient.py +++ b/care/emr/api/viewsets/patient.py @@ -15,6 +15,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, @@ -90,11 +91,7 @@ def validate_data(self, instance, model_obj=None): raise ValidationError("Year of birth cannot be after the year of death") def get_queryset(self): - qs = ( - super() - .get_queryset() - .select_related("created_by", "updated_by", "geo_organization") - ) + qs = super().get_queryset().select_related("geo_organization") if self.action != "list": patient = get_object_or_404( Patient, external_id=self.kwargs.get("external_id") @@ -200,7 +197,9 @@ def search(self, request, *args, **kwargs): if not request_data.phone_number and not request_data.config: raise ValidationError("Either phone number or config is required") if request_data.phone_number: - queryset = Patient.objects.filter(phone_number=request_data.phone_number) + queryset = Patient.objects.filter( + phone_number=request_data.phone_number + ).select_related("geo_organization") partial = True else: config_queryset = PatientIdentifierConfig.objects.filter( @@ -243,7 +242,7 @@ def search(self, request, *args, **kwargs): queryset = Patient.objects.filter( id__in=identifier_queryset.values("patient_id") - ) + ).select_related("geo_organization") if config.config.get("retrieve_config", {}).get( "retrieve_with_year_of_birth" @@ -268,7 +267,9 @@ class SearchRetrieveRequestSpec(BaseModel): @action(detail=False, methods=["POST"]) def search_retrieve(self, request, *args, **kwargs): request_data = self.SearchRetrieveRequestSpec(**request.data) - queryset = Patient.objects.filter(phone_number=request_data.phone_number) + queryset = Patient.objects.filter( + phone_number=request_data.phone_number + ).select_related("geo_organization") queryset = queryset.filter(year_of_birth=request_data.year_of_birth) for patient in queryset: if str(patient.external_id)[:5] == request_data.partial_id: @@ -285,7 +286,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_id) for patient_user in patient_users ] return Response({"results": data}) @@ -305,7 +306,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/availability.py b/care/emr/api/viewsets/scheduling/availability.py index 3bb41dc1c4..634f4e7032 100644 --- a/care/emr/api/viewsets/scheduling/availability.py +++ b/care/emr/api/viewsets/scheduling/availability.py @@ -253,7 +253,7 @@ def get_slots_for_day_handler( start_datetime__date=request_data.day, end_datetime__date=request_data.day, resource=resource, - ) + ).select_related("availability") if is_public is True: created_slots = created_slots.filter(availability__schedule__is_public=True) for slot in created_slots: diff --git a/care/emr/api/viewsets/scheduling/booking.py b/care/emr/api/viewsets/scheduling/booking.py index 232fc52345..a3bbca11f0 100644 --- a/care/emr/api/viewsets/scheduling/booking.py +++ b/care/emr/api/viewsets/scheduling/booking.py @@ -29,6 +29,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, ) @@ -277,7 +278,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/base.py b/care/emr/resources/base.py index c05e743f74..37c5cf9583 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/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..2e8e3b5e0c 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,9 @@ 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() + if user: + history["updated_by"] = model_from_cache(UserSpec, id=user) else: - history["updated_by"] = {} # Edge Case + history["updated_by"] = {} edit_history.append(history) mapping["edit_history"] = edit_history diff --git a/care/emr/resources/encounter/spec.py b/care/emr/resources/encounter/spec.py index 4ea072e906..c53965fdb4 100644 --- a/care/emr/resources/encounter/spec.py +++ b/care/emr/resources/encounter/spec.py @@ -161,7 +161,9 @@ def perform_extra_serialization(cls, mapping, obj): mapping["appointment"] = TokenBookingReadSpec.serialize( obj.appointment ).to_json() - organizations = EncounterOrganization.objects.filter(encounter=obj) + organizations = EncounterOrganization.objects.filter( + encounter=obj + ).select_related("organization") mapping["organizations"] = [ FacilityOrganizationReadSpec.serialize(encounter_org.organization).to_json() for encounter_org in organizations diff --git a/care/emr/resources/facility/spec.py b/care/emr/resources/facility/spec.py index 5cb0db567c..5f5e8e02d4 100644 --- a/care/emr/resources/facility/spec.py +++ b/care/emr/resources/facility/spec.py @@ -6,7 +6,7 @@ from care.emr.models import Organization from care.emr.models.patient import PatientIdentifierConfigCache -from care.emr.resources.base import EMRResource, cacheable, model_from_cache +from care.emr.resources.base import EMRResource, cacheable 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 ( @@ -105,12 +105,9 @@ class FacilityReadSpec(FacilityBaseSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): - from care.emr.resources.user.spec import UserSpec - mapping["id"] = obj.external_id mapping["read_cover_image_url"] = obj.read_cover_image_url() - if obj.created_by: - mapping["created_by"] = model_from_cache(UserSpec, id=obj.created_by_id) + 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..a2d57e4d02 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): @@ -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"] = UserSpec.serialize(obj.updated_by) + 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/healthcare_service/spec.py b/care/emr/resources/healthcare_service/spec.py index 19a7925870..99d6172ef7 100644 --- a/care/emr/resources/healthcare_service/spec.py +++ b/care/emr/resources/healthcare_service/spec.py @@ -3,7 +3,6 @@ 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.facility_organization.spec import FacilityOrganizationReadSpec @@ -69,18 +68,13 @@ 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: - locations.append( - FacilityLocationListSpec.serialize( - FacilityLocation.objects.get(id=location) - ).to_json() - ) - except Exception: # noqa S110 - pass - mapping["locations"] = locations + mapping["locations"] = [ + FacilityLocationListSpec.serialize(location).to_json() + for location in FacilityLocation.objects.filter(id__in=obj.locations) + ] if obj.managing_organization: mapping["managing_organization"] = FacilityOrganizationReadSpec.serialize( obj.managing_organization diff --git a/care/emr/resources/location/spec.py b/care/emr/resources/location/spec.py index 4a885b2b14..d58ef99149 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): @@ -151,10 +150,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/medication/dispense/dispense_order.py b/care/emr/resources/medication/dispense/dispense_order.py index 29f1263121..ef9af4f87e 100644 --- a/care/emr/resources/medication/dispense/dispense_order.py +++ b/care/emr/resources/medication/dispense/dispense_order.py @@ -60,7 +60,8 @@ class MedicationDispenseOrderReadSpec(BaseMedicationDispenseOrderSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id - mapping["location"] = FacilityLocationListSpec.serialize(obj.location).to_json() + location = FacilityLocation.objects.get(id=obj.location_id) + mapping["location"] = FacilityLocationListSpec.serialize(location).to_json() mapping["patient"] = PatientListSpec.serialize(obj.patient).to_json() @@ -74,5 +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"] = FacilityLocationListSpec.serialize(obj.location).to_json() + 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/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..9e52320576 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) - if obj.data_entered_by: - mapping["data_entered_by"] = UserSpec.serialize(obj.data_entered_by) + cls.serialize_audit_users(mapping, obj) + if obj.data_entered_by_id: + mapping["data_entered_by"] = model_from_cache( + UserSpec, id=obj.data_entered_by_id + ) class ObservationRetrieveSpec(ObservationReadSpec): diff --git a/care/emr/resources/organization/organization_user_spec.py b/care/emr/resources/organization/organization_user_spec.py index b9fa81dbb4..434b7ac021 100644 --- a/care/emr/resources/organization/organization_user_spec.py +++ b/care/emr/resources/organization/organization_user_spec.py @@ -1,7 +1,7 @@ from pydantic import UUID4, field_validator from care.emr.models.organization import OrganizationUser -from care.emr.resources.base import EMRResource +from care.emr.resources.base import EMRResource, model_from_cache from care.emr.resources.role.spec import RoleReadSpec from care.emr.resources.user.spec import UserSpec from care.security.models import RoleModel @@ -52,6 +52,6 @@ class OrganizationUserReadSpec(OrganizationUserBaseSpec): @classmethod def perform_extra_serialization(cls, mapping, obj): mapping["id"] = obj.external_id - mapping["user"] = UserSpec.serialize(obj.user).to_json() + mapping["user"] = model_from_cache(UserSpec, id=obj.user_id) mapping["role"] = RoleReadSpec.serialize(obj.role).to_json() return mapping 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 dbb29fd63d..4a4d669c31 100644 --- a/care/emr/resources/questionnaire_response/spec.py +++ b/care/emr/resources/questionnaire_response/spec.py @@ -73,7 +73,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..4ac181d702 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 @@ -147,13 +147,10 @@ def perform_extra_serialization(cls, mapping, obj): mapping["related_patient"] = PatientListSpec.serialize( obj.related_patient ).to_json() - if obj.assigned_to: - mapping["assigned_to"] = UserSpec.serialize(obj.assigned_to).to_json() + if obj.assigned_to_id: + 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/scheduling/resource/spec.py b/care/emr/resources/scheduling/resource/spec.py index 63b43c0b0c..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 FacilityLocationListSpec.serialize(obj.location).to_json() + 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 00cedd92c6..cb123032ba 100644 --- a/care/emr/resources/service_request/spec.py +++ b/care/emr/resources/service_request/spec.py @@ -166,11 +166,10 @@ class ServiceRequestRetrieveSpec(ServiceRequestReadSpec): @classmethod 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()) - - mapping["locations"] = locations + mapping["locations"] = [ + FacilityLocationListSpec.serialize(location).to_json() + for location in FacilityLocation.objects.filter(id__in=obj.locations) + ] if obj.healthcare_service: mapping["healthcare_service"] = HealthcareServiceReadSpec.serialize( obj.healthcare_service diff --git a/care/emr/resources/user/spec.py b/care/emr/resources/user/spec.py index 0e84295d9a..591f9d4e29 100644 --- a/care/emr/resources/user/spec.py +++ b/care/emr/resources/user/spec.py @@ -192,7 +192,7 @@ def perform_extra_serialization(cls, mapping, obj: User) -> None: ) ) mapping["organizations"] = [ - OrganizationReadSpec.serialize(obj).to_json() for obj in organizations + OrganizationReadSpec.serialize(org).to_json() for org in organizations ] user_facilities = Facility.objects.filter( 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()