예제 #1
0
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)
예제 #2
0
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")
예제 #3
0
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
예제 #4
0
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()
예제 #5
0
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
예제 #6
0
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)
예제 #7
0
파일: patient.py 프로젝트: coronasafe/care
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", )
예제 #8
0
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
예제 #9
0
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
예제 #10
0
파일: patient.py 프로젝트: traviraj90/care
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()
예제 #11
0
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",)
예제 #12
0
 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)
예제 #13
0
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", )
예제 #14
0
class PatientSampleDetailSerializer(PatientSampleSerializer):
    flow = serializers.ListSerializer(child=PatientSampleFlowSerializer())
    facility_object = FacilityBasicInfoSerializer(
        source="consultation.facility")
예제 #15
0
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
예제 #16
0
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