class PatientSampleSerializer(serializers.ModelSerializer): id = serializers.UUIDField(source="external_id", read_only=True) patient_name = serializers.CharField(read_only=True, source="patient.name") patient_has_sari = serializers.BooleanField(read_only=True, source="patient.has_SARI") patient_has_confirmed_contact = serializers.BooleanField( read_only=True, source="patient.contact_with_confirmed_carrier") patient_has_suspected_contact = serializers.BooleanField( read_only=True, source="patient.contact_with_suspected_carrier") patient_travel_history = serializers.CharField( read_only=True, source="patient.countries_travelled") facility = ExternalIdSerializerField(read_only=True, source="consultation.facility") facility_object = FacilityBasicInfoSerializer( source="consultation.facility", read_only=True) sample_type = ChoiceField(choices=SAMPLE_TYPE_CHOICES, required=False) status = ChoiceField(choices=PatientSample.SAMPLE_TEST_FLOW_CHOICES, required=False) result = ChoiceField(choices=PatientSample.SAMPLE_TEST_RESULT_CHOICES, required=False) icmr_category = ChoiceField(choices=PatientSample.PATIENT_ICMR_CATEGORY, required=False) patient = ExternalIdSerializerField( required=False, queryset=PatientRegistration.objects.all()) consultation = ExternalIdSerializerField( required=False, queryset=PatientConsultation.objects.all()) date_of_sample = serializers.DateTimeField(required=False) date_of_result = serializers.DateTimeField(required=False) notes = serializers.CharField(required=False, allow_blank=True) testing_facility = ExternalIdSerializerField( queryset=Facility.objects.all(), required=False) testing_facility_object = FacilityBasicInfoSerializer( source="testing_facility", read_only=True) class Meta: model = PatientSample read_only_fields = ( "id", "facility", ) exclude = TIMESTAMP_FIELDS + ("external_id", ) def create(self, validated_data): validated_data.pop("status", None) validated_data.pop("result", None) return super(PatientSampleSerializer, self).create(validated_data)
class PatientScopedSearchSerializer(serializers.ModelSerializer): gender = ChoiceField(choices=GENDER_CHOICES) facility = FacilityBasicInfoSerializer() id = serializers.CharField(source="patient_external_id") facility = serializers.UUIDField(source="facility.external_id", allow_null=True, read_only=True) facility_object = FacilityBasicInfoSerializer(source="facility", read_only=True) class Meta: model = PatientSearch exclude = ("patient_id", "external_id")
class PatientListSerializer(serializers.ModelSerializer): id = serializers.CharField(source="external_id", read_only=True) facility = serializers.UUIDField(source="facility.external_id", allow_null=True, read_only=True) facility_object = FacilityBasicInfoSerializer(source="facility", read_only=True) ward_object = WardSerializer(source="ward", read_only=True) local_body_object = LocalBodySerializer(source="local_body", read_only=True) district_object = DistrictSerializer(source="district", read_only=True) state_object = StateSerializer(source="state", read_only=True) blood_group = ChoiceField(choices=BLOOD_GROUP_CHOICES, required=True) disease_status = ChoiceField(choices=DISEASE_STATUS_CHOICES, default=DiseaseStatusEnum.SUSPECTED.value) source = ChoiceField(choices=PatientRegistration.SourceChoices) class Meta: model = PatientRegistration exclude = ( "created_by", "deleted", "ongoing_medication", "patient_search_id", "year_of_birth", "meta_info", "countries_travelled_old", "allergies", "external_id", ) read_only = TIMESTAMP_FIELDS
class PatientTransferSerializer(serializers.ModelSerializer): facility_object = FacilityBasicInfoSerializer(source="facility", read_only=True) facility = ExternalIdSerializerField(write_only=True, queryset=Facility.objects.all()) patient = serializers.UUIDField(source="external_id", read_only=True) class Meta: model = PatientRegistration fields = ("facility", "date_of_birth", "patient", "facility_object") def validate_date_of_birth(self, value): if self.instance and self.instance.date_of_birth != value: raise serializers.ValidationError("Date of birth does not match") return value def create(self, validated_data): raise NotImplementedError def save(self, **kwargs): self.instance.facility = self.validated_data["facility"] PatientConsultation.objects.filter(patient=self.instance, discharge_date__isnull=True).update( discharge_date=localtime(now())) self.instance.save()
class PrescriptionSupplierSerializer(serializers.ModelSerializer): id = serializers.CharField(source="external_id", read_only=True) scheme = ChoiceField(choices=PrescriptionSupplier.SchemeChoices) status = ChoiceField(choices=PrescriptionSupplier.StatusChoices) consultation_object = PrescriptionSupplierConsultationSerializer( source="consultation", read_only=True) facility_object = FacilityBasicInfoSerializer(source="facility", read_only=True) consultation = ExternalIdSerializerField( required=True, queryset=PatientConsultation.objects.all()) facility = ExternalIdSerializerField(required=True, queryset=Facility.objects.all()) class Meta: model = PrescriptionSupplier exclude = ("deleted", "external_id") read_only_fields = TIMESTAMP_FIELDS def create(self, validated_data): instance = super().create(validated_data) instance.updated_user = self.context["request"].user instance.save() def update(self, instance, validated_data): instance = super().update(instance, validated_data) instance.updated_user = self.context["request"].user instance.save() return instance
class PatientSampleSerializer(serializers.ModelSerializer): patient_name = serializers.CharField(read_only=True, source="patient.name") patient_has_sari = serializers.BooleanField(read_only=True, source="patient.has_SARI") patient_has_confirmed_contact = serializers.BooleanField( read_only=True, source="patient.contact_with_confirmed_carrier") patient_has_suspected_contact = serializers.BooleanField( read_only=True, source="patient.contact_with_suspected_carrier") patient_travel_history = serializers.CharField( read_only=True, source="patient.countries_travelled") facility = serializers.IntegerField(read_only=True, source="consultation.facility_id") facility_object = FacilityBasicInfoSerializer( source="consultation.facility", read_only=True) status = ChoiceField(choices=PatientSample.SAMPLE_TEST_FLOW_CHOICES, required=False) result = ChoiceField(choices=PatientSample.SAMPLE_TEST_RESULT_CHOICES, required=False) patient = serializers.IntegerField(required=False, source="patient_id") consultation = serializers.IntegerField(required=False, source="consultation_id") date_of_sample = serializers.DateTimeField(required=False) date_of_result = serializers.DateTimeField(required=False) class Meta: model = PatientSample read_only_fields = ("facility", ) exclude = TIMESTAMP_FIELDS def create(self, validated_data): return super(PatientSampleSerializer, self).create(validated_data)
class PatientNotesSerializer(serializers.ModelSerializer): facility = FacilityBasicInfoSerializer(read_only=True) created_by_object = UserBaseMinimumSerializer(source="created_by", read_only=True) class Meta: model = PatientNotes fields = ("note", "facility", "created_by_object", "created_date") read_only_fields = ("created_date", )
class PatientConsultationSerializer(serializers.ModelSerializer): id = serializers.CharField(source="external_id", read_only=True) facility_name = serializers.CharField(source="facility.name", read_only=True) suggestion_text = ChoiceField( choices=PatientConsultation.SUGGESTION_CHOICES, read_only=True, source="suggestion") symptoms = serializers.MultipleChoiceField(choices=SYMPTOM_CHOICES) category = ChoiceField(choices=CATEGORY_CHOICES, required=False) admitted_to = ChoiceField(choices=ADMIT_CHOICES, required=False) referred_to_object = FacilityBasicInfoSerializer(source="referred_to", read_only=True) referred_to = ExternalIdSerializerField(queryset=Facility.objects.all(), required=False) patient = ExternalIdSerializerField( queryset=PatientRegistration.objects.all()) facility = ExternalIdSerializerField(queryset=Facility.objects.all()) class Meta: model = PatientConsultation read_only = TIMESTAMP_FIELDS exclude = ( "deleted", "external_id", ) def validate_bed_number(self, bed_number): try: if not self.initial_data["admitted"]: bed_number = None except KeyError: bed_number = None return bed_number def validate(self, obj): validated = super().validate(obj) print(validated) if validated["suggestion"] is SuggestionChoices.R and not validated.get( "referred_to"): raise ValidationError({ "referred_to": [ f"This field is required as the suggestion is {SuggestionChoices.R}." ] }) if (validated["suggestion"] is SuggestionChoices.A and validated.get("admitted") and not validated.get("admission_date")): raise ValidationError({ "admission_date": [f"This field is required as the patient has been admitted."] }) return validated
class PatientListSerializer(serializers.ModelSerializer): facility = serializers.IntegerField(source="facility_id", allow_null=True, read_only=True) facility_object = FacilityBasicInfoSerializer(source="facility", read_only=True) local_body_object = LocalBodySerializer(source="local_body", read_only=True) district_object = DistrictSerializer(source="district", read_only=True) state_object = StateSerializer(source="state", read_only=True) disease_status = ChoiceField(choices=DISEASE_STATUS_CHOICES, default=DiseaseStatusEnum.SUSPECTED.value) source = ChoiceField(choices=PatientRegistration.SourceChoices) class Meta: model = PatientRegistration exclude = ("created_by", "deleted", "ongoing_medication", "patient_search_id", "year_of_birth", "meta_info") read_only = TIMESTAMP_FIELDS
class PatientTransferSerializer(serializers.ModelSerializer): facility_object = FacilityBasicInfoSerializer(source="facility", read_only=True) patient = serializers.CharField(source="external_id", read_only=True) class Meta: model = PatientRegistration fields = ("facility", "date_of_birth", "patient", "facility_object") def validate_date_of_birth(self, value): if self.instance and self.instance.date_of_birth != value: raise serializers.ValidationError("Date of birth does not match") return value def create(self, validated_data): raise NotImplementedError def save(self, **kwargs): self.instance.facility = self.validated_data["facility"] self.instance.save()
class ShiftingSerializer(serializers.ModelSerializer): id = serializers.UUIDField(source="external_id", read_only=True) status = ChoiceField(choices=SHIFTING_STATUS_CHOICES) patient_object = PatientListSerializer(source="patient", read_only=True, required=False) orgin_facility_object = FacilityBasicInfoSerializer(source="orgin_facility", read_only=True, required=False) shifting_approving_facility_object = FacilityBasicInfoSerializer( source="shifting_approving_facility", read_only=True, required=False ) assigned_facility_object = FacilityBasicInfoSerializer(source="assigned_facility", read_only=True, required=False) orgin_facility = serializers.UUIDField(source="orgin_facility.external_id", allow_null=False, required=True) shifting_approving_facility = serializers.UUIDField( source="shifting_approving_facility.external_id", allow_null=False, required=True ) assigned_facility = serializers.UUIDField(source="assigned_facility.external_id", allow_null=True, required=False) patient = serializers.UUIDField(source="patient.external_id", allow_null=False, required=True) def update(self, instance, validated_data): # Dont allow editing origin or patient if "orgin_facility" in validated_data: validated_data.pop("orgin_facility") if "patient" in validated_data: validated_data.pop("patient") if "shifting_approving_facility" in validated_data: shifting_approving_facility_external_id = validated_data.pop("shifting_approving_facility")["external_id"] if shifting_approving_facility_external_id: validated_data["shifting_approving_facility_id"] = Facility.objects.get( external_id=shifting_approving_facility_external_id ).id if "assigned_facility" in validated_data: assigned_facility_external_id = validated_data.pop("assigned_facility")["external_id"] if assigned_facility_external_id: validated_data["assigned_facility_id"] = Facility.objects.get( external_id=assigned_facility_external_id ).id return super().update(instance, validated_data) def create(self, validated_data): # Do Validity checks for each of these data orgin_facility_external_id = validated_data.pop("orgin_facility")["external_id"] validated_data["orgin_facility_id"] = Facility.objects.get(external_id=orgin_facility_external_id).id shifting_approving_facility_external_id = validated_data.pop("shifting_approving_facility")["external_id"] validated_data["shifting_approving_facility_id"] = Facility.objects.get( external_id=shifting_approving_facility_external_id ).id if "assigned_facility" in validated_data: assigned_facility_external_id = validated_data.pop("assigned_facility")["external_id"] if assigned_facility_external_id: validated_data["assigned_facility_id"] = Facility.objects.get( external_id=assigned_facility_external_id ).id patient_external_id = validated_data.pop("patient")["external_id"] validated_data["patient_id"] = PatientRegistration.objects.get(external_id=patient_external_id).id return super().create(validated_data) class Meta: model = ShiftingRequest exclude = ("modified_date",)
def get_facilities(self, request, *args, **kwargs): user = self.get_object() facilities = Facility.objects.filter(users=user).select_related( "local_body", "district", "state", "ward") facilities = FacilityBasicInfoSerializer(facilities, many=True) return Response(facilities.data)
class ResourceRequestSerializer(serializers.ModelSerializer): id = serializers.UUIDField(source="external_id", read_only=True) status = ChoiceField(choices=RESOURCE_STATUS_CHOICES) orgin_facility_object = FacilityBasicInfoSerializer( source="orgin_facility", read_only=True, required=False) approving_facility_object = FacilityBasicInfoSerializer( source="approving_facility", read_only=True, required=False) assigned_facility_object = FacilityBasicInfoSerializer( source="assigned_facility", read_only=True, required=False) category = ChoiceField(choices=RESOURCE_CATEGORY_CHOICES) sub_category = ChoiceField(choices=RESOURCE_SUB_CATEGORY_CHOICES) orgin_facility = serializers.UUIDField(source="orgin_facility.external_id", allow_null=False, required=True) approving_facility = serializers.UUIDField( source="approving_facility.external_id", allow_null=False, required=True) assigned_facility = serializers.UUIDField( source="assigned_facility.external_id", allow_null=True, required=False) assigned_to_object = UserBaseMinimumSerializer(source="assigned_to", read_only=True) created_by_object = UserBaseMinimumSerializer(source="created_by", read_only=True) last_edited_by_object = UserBaseMinimumSerializer(source="last_edited_by", read_only=True) def __init__(self, instance=None, **kwargs): if instance: kwargs["partial"] = True super().__init__(instance=instance, **kwargs) def update(self, instance, validated_data): LIMITED_RECIEVING_STATUS_ = [] LIMITED_RECIEVING_STATUS = [ REVERSE_REQUEST_STATUS_CHOICES[x] for x in LIMITED_RECIEVING_STATUS_ ] LIMITED_REQUEST_STATUS_ = [ "ON HOLD", "APPROVED", "REJECTED", "TRANSPORTATION TO BE ARRANGED", "TRANSFER IN PROGRESS", "COMPLETED", ] LIMITED_REQUEST_STATUS = [ REVERSE_REQUEST_STATUS_CHOICES[x] for x in LIMITED_REQUEST_STATUS_ ] LIMITED_ORGIN_STATUS = [] user = self.context["request"].user if "status" in validated_data: if validated_data["status"] in LIMITED_RECIEVING_STATUS: if instance.assigned_facility: if not has_facility_permission(user, instance.assigned_facility): raise ValidationError( {"status": ["Permission Denied"]}) elif validated_data["status"] in LIMITED_REQUEST_STATUS: if not has_facility_permission(user, instance.approving_facility): raise ValidationError({"status": ["Permission Denied"]}) # Dont allow editing origin or patient if "orgin_facility" in validated_data: validated_data.pop("orgin_facility") if "approving_facility" in validated_data: approving_facility_external_id = validated_data.pop( "approving_facility")["external_id"] if approving_facility_external_id: validated_data["approving_facility_id"] = Facility.objects.get( external_id=approving_facility_external_id).id if "assigned_facility" in validated_data: assigned_facility_external_id = validated_data.pop( "assigned_facility")["external_id"] if assigned_facility_external_id: validated_data["assigned_facility_id"] = Facility.objects.get( external_id=assigned_facility_external_id).id instance.last_edited_by = self.context["request"].user new_instance = super().update(instance, validated_data) return new_instance def create(self, validated_data): # Do Validity checks for each of these data if "status" in validated_data: validated_data.pop("status") orgin_facility_external_id = validated_data.pop( "orgin_facility")["external_id"] validated_data["orgin_facility_id"] = Facility.objects.get( external_id=orgin_facility_external_id).id request_approving_facility_external_id = validated_data.pop( "approving_facility")["external_id"] validated_data["approving_facility_id"] = Facility.objects.get( external_id=request_approving_facility_external_id).id if "assigned_facility" in validated_data: assigned_facility_external_id = validated_data.pop( "assigned_facility")["external_id"] if assigned_facility_external_id: validated_data["assigned_facility_id"] = Facility.objects.get( external_id=assigned_facility_external_id).id validated_data["created_by"] = self.context["request"].user validated_data["last_edited_by"] = self.context["request"].user return super().create(validated_data) class Meta: model = ResourceRequest exclude = ("deleted", ) read_only_fields = TIMESTAMP_FIELDS + ("external_id", )
class PatientSampleDetailSerializer(PatientSampleSerializer): flow = serializers.ListSerializer(child=PatientSampleFlowSerializer()) facility_object = FacilityBasicInfoSerializer( source="consultation.facility")
class PatientConsultationSerializer(serializers.ModelSerializer): id = serializers.CharField(source="external_id", read_only=True) facility_name = serializers.CharField(source="facility.name", read_only=True) suggestion_text = ChoiceField( choices=PatientConsultation.SUGGESTION_CHOICES, read_only=True, source="suggestion", ) symptoms = serializers.MultipleChoiceField(choices=SYMPTOM_CHOICES) category = ChoiceField(choices=CATEGORY_CHOICES, required=False) admitted_to = ChoiceField(choices=ADMIT_CHOICES, required=False) referred_to_object = FacilityBasicInfoSerializer(source="referred_to", read_only=True) referred_to = ExternalIdSerializerField(queryset=Facility.objects.all(), required=False) patient = ExternalIdSerializerField( queryset=PatientRegistration.objects.all()) facility = ExternalIdSerializerField(queryset=Facility.objects.all()) assigned_to_object = UserBaseMinimumSerializer(source="assigned_to", read_only=True) assigned_to = serializers.PrimaryKeyRelatedField( queryset=User.objects.all(), required=False, allow_null=True) action = ChoiceField(choices=PatientRegistration.ActionChoices, write_only=True, required=False) review_time = serializers.IntegerField(default=-1, write_only=True, required=False) last_edited_by = UserBaseMinimumSerializer(read_only=True) created_by = UserBaseMinimumSerializer(read_only=True) class Meta: model = PatientConsultation read_only = TIMESTAMP_FIELDS + ( "discharge_date", "last_edited_by", "created_by", ) exclude = ("deleted", "external_id") def validate_bed_number(self, bed_number): try: if not self.initial_data["admitted"]: bed_number = None except KeyError: bed_number = None return bed_number def update(self, instance, validated_data): instance.last_edited_by = self.context["request"].user if instance.discharge_date: raise ValidationError({ "consultation": [f"Discharged Consultation data cannot be updated"] }) if instance.suggestion == SuggestionChoices.OP: instance.discharge_date = localtime(now()) instance.save() if "action" in validated_data or "review_time" in validated_data: patient = instance.patient if "action" in validated_data: action = validated_data.pop("action") patient.action = action if "review_time" in validated_data: review_time = validated_data.pop("review_time") if review_time >= 0: patient.review_time = localtime( now()) + timedelta(minutes=review_time) patient.save() return super().update(instance, validated_data) def create(self, validated_data): action = -1 review_time = -1 if "action" in validated_data: action = validated_data.pop("action") if "review_time" in validated_data: review_time = validated_data.pop("review_time") if validated_data["patient"].last_consultation: if self.context["request"].user == validated_data[ "patient"].last_consultation.assigned_to: return ValidationError( { "Permission Denied": "Only Facility Admins can create consultation for a Patient" }, ) consultation = super().create(validated_data) consultation.created_by = self.context["request"].user consultation.last_edited_by = self.context["request"].user consultation.save() patient = consultation.patient if consultation.suggestion == SuggestionChoices.OP: consultation.discharge_date = localtime(now()) consultation.save() patient.is_active = False patient.allow_transfer = True patient.last_consultation = consultation if action != -1: patient.action = action if review_time > 0: patient.review_time = localtime( now()) + timedelta(minutes=review_time) patient.save() NotificationGenerator( event=Notification.Event.PATIENT_CONSULTATION_CREATED, caused_by=self.context["request"].user, caused_object=consultation, facility=patient.facility, ).generate() return consultation def update(self, instance, validated_data): consultation = super().update(instance, validated_data) NotificationGenerator( event=Notification.Event.PATIENT_CONSULTATION_UPDATED, caused_by=self.context["request"].user, caused_object=consultation, facility=consultation.patient.facility, ).generate() return consultation def validate(self, obj): validated = super().validate(obj) if validated["suggestion"] is SuggestionChoices.R and not validated.get( "referred_to"): raise ValidationError({ "referred_to": [ f"This field is required as the suggestion is {SuggestionChoices.R}." ] }) if (validated["suggestion"] is SuggestionChoices.A and validated.get("admitted") and not validated.get("admission_date")): raise ValidationError({ "admission_date": [f"This field is required as the patient has been admitted."] }) if "action" in validated: if validated["action"] == PatientRegistration.ActionEnum.REVIEW: if "review_time" not in validated: raise ValidationError({ "review_time": [ f"This field is required as the patient has been requested Review." ] }) if validated["review_time"] <= 0: raise ValidationError({ "review_time": [f"This field value is must be greater than 0."] }) return validated
class ShiftingSerializer(serializers.ModelSerializer): id = serializers.UUIDField(source="external_id", read_only=True) status = ChoiceField(choices=SHIFTING_STATUS_CHOICES) patient_object = PatientListSerializer(source="patient", read_only=True, required=False) orgin_facility_object = FacilityBasicInfoSerializer(source="orgin_facility", read_only=True, required=False) shifting_approving_facility_object = FacilityBasicInfoSerializer( source="shifting_approving_facility", read_only=True, required=False ) assigned_facility_object = FacilityBasicInfoSerializer(source="assigned_facility", read_only=True, required=False) assigned_facility_type = ChoiceField(choices=FACILITY_TYPES) preferred_vehicle_choice = ChoiceField(choices=VEHICLE_CHOICES) orgin_facility = serializers.UUIDField(source="orgin_facility.external_id", allow_null=False, required=True) shifting_approving_facility = serializers.UUIDField( source="shifting_approving_facility.external_id", allow_null=False, required=True ) assigned_facility = serializers.UUIDField(source="assigned_facility.external_id", allow_null=True, required=False) patient = serializers.UUIDField(source="patient.external_id", allow_null=False, required=True) assigned_to_object = UserBaseMinimumSerializer(source="assigned_to", read_only=True) def __init__(self, instance=None, **kwargs): if instance: kwargs["partial"] = True super().__init__(instance=instance, **kwargs) def update(self, instance, validated_data): LIMITED_RECIEVING_STATUS_ = [ "DESTINATION APPROVED", "DESTINATION REJECTED", "COMPLETED", ] LIMITED_RECIEVING_STATUS = [REVERSE_SHIFTING_STATUS_CHOICES[x] for x in LIMITED_RECIEVING_STATUS_] LIMITED_SHIFTING_STATUS_ = [ "APPROVED", "REJECTED", "PATIENT TO BE PICKED UP", "TRANSPORTATION TO BE ARRANGED", "TRANSFER IN PROGRESS", "COMPLETED", "PENDING", "ON HOLD", ] LIMITED_SHIFTING_STATUS = [REVERSE_SHIFTING_STATUS_CHOICES[x] for x in LIMITED_SHIFTING_STATUS_] LIMITED_ORGIN_STATUS = [] user = self.context["request"].user if "is_kasp" in validated_data: if validated_data["is_kasp"] != instance.is_kasp: # Check only when changed if not has_facility_permission(user, instance.shifting_approving_facility): raise ValidationError({"kasp": ["Permission Denied"]}) if "status" in validated_data: if validated_data["status"] in LIMITED_RECIEVING_STATUS: if instance.assigned_facility: if not has_facility_permission(user, instance.assigned_facility): raise ValidationError({"status": ["Permission Denied"]}) else: raise ValidationError({"status": ["Permission Denied"]}) elif "status" in validated_data: if validated_data["status"] in LIMITED_SHIFTING_STATUS: if not has_facility_permission(user, instance.shifting_approving_facility): raise ValidationError({"status": ["Permission Denied"]}) # Dont allow editing origin or patient if "orgin_facility" in validated_data: validated_data.pop("orgin_facility") if "patient" in validated_data: validated_data.pop("patient") if "shifting_approving_facility" in validated_data: shifting_approving_facility_external_id = validated_data.pop("shifting_approving_facility")["external_id"] if shifting_approving_facility_external_id: validated_data["shifting_approving_facility_id"] = Facility.objects.get( external_id=shifting_approving_facility_external_id ).id if "assigned_facility" in validated_data: assigned_facility_external_id = validated_data.pop("assigned_facility")["external_id"] if assigned_facility_external_id: validated_data["assigned_facility_id"] = Facility.objects.get( external_id=assigned_facility_external_id ).id return super().update(instance, validated_data) def create(self, validated_data): # Do Validity checks for each of these data if "status" in validated_data: validated_data.pop("status") validated_data["is_kasp"] = False orgin_facility_external_id = validated_data.pop("orgin_facility")["external_id"] # validated_data["orgin_facility_id"] = Facility.objects.get(external_id=orgin_facility_external_id).id shifting_approving_facility_external_id = validated_data.pop("shifting_approving_facility")["external_id"] validated_data["shifting_approving_facility_id"] = Facility.objects.get( external_id=shifting_approving_facility_external_id ).id if "assigned_facility" in validated_data: assigned_facility_external_id = validated_data.pop("assigned_facility")["external_id"] if assigned_facility_external_id: validated_data["assigned_facility_id"] = Facility.objects.get( external_id=assigned_facility_external_id ).id patient_external_id = validated_data.pop("patient")["external_id"] patient = PatientRegistration.objects.get(external_id=patient_external_id) if patient.is_active == False: raise ValidationError({"patient": ["Cannot shift discharged patient"]}) if patient.allow_transfer == False: patient.allow_transfer = True patient.save() validated_data["orgin_facility_id"] = patient.facility.id validated_data["patient_id"] = patient.id if ShiftingRequest.objects.filter(~Q(status__in=[30, 50, 80]), patient=patient).exists(): raise ValidationError({"request": ["Shifting Request for Patient already exists"]}) return super().create(validated_data) class Meta: model = ShiftingRequest exclude = ("deleted",) read_only_fields = TIMESTAMP_FIELDS