Пример #1
0
def FacilityCapacitySummary():
    capacity_objects = FacilityCapacity.objects.all().select_related(
        "facility", "facility__state", "facility__district",
        "facility__local_body")
    capacity_summary = {}
    current_date = localtime(now()).replace(hour=0,
                                            minute=0,
                                            second=0,
                                            microsecond=0)

    for facility_obj in Facility.objects.all():
        # Calculate Actual Patients Discharged and Live in this Facility
        patients_in_facility = PatientRegistration.objects.filter(
            facility_id=facility_obj.id).select_related(
                "state", "district", "local_body")
        capacity_summary[facility_obj.id] = FacilitySerializer(
            facility_obj).data
        capacity_summary[facility_obj.id][
            "actual_live_patients"] = patients_in_facility.filter(
                is_active=True).count()
        discharge_patients = patients_in_facility.filter(is_active=False)
        capacity_summary[facility_obj.id][
            "actual_discharged_patients"] = discharge_patients.count()
        capacity_summary[facility_obj.id]["availability"] = []

    for capacity_object in capacity_objects:
        facility_id = capacity_object.facility.id
        if facility_id not in capacity_summary:
            capacity_summary[facility_id] = FacilitySerializer(
                capacity_object.facility).data
        if "availability" not in capacity_summary[facility_id]:
            capacity_summary[facility_id]["availability"] = []
        capacity_summary[facility_id]["availability"].append(
            FacilityCapacitySerializer(capacity_object).data)

    for i in capacity_summary:
        facility_summary_obj = None
        if FacilityRelatedSummary.objects.filter(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date).exists():
            facility_summary_obj = FacilityRelatedSummary.objects.get(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date)
        else:
            facility_summary_obj = FacilityRelatedSummary(
                s_type="FacilityCapacity", facility_id=i)
        facility_summary_obj.data = capacity_summary[i]
        facility_summary_obj.save()

    return True
    def list(self, request, format=None):

        if request.user.user_type < User.TYPE_VALUE_MAP["DistrictLabAdmin"]:
            return Response({}, status=status.HTTP_403_FORBIDDEN)

        possible_filter_params = ["state", "local_body", "district"]
        filter_params = {}
        for filter_query in possible_filter_params:
            if request.GET.get(filter_query, False):
                filter_params["facility__" + filter_query] = int(
                    request.GET[filter_query])

        capacity_objects = FacilityCapacity.objects.filter(
            **filter_params).select_related("facility", "facility__state",
                                            "facility__district",
                                            "facility__local_body")
        capacity_summary = {}
        for capacity_object in capacity_objects:
            facility_id = capacity_object.facility.id
            if facility_id not in capacity_summary:
                capacity_summary[facility_id] = FacilitySerializer(
                    capacity_object.facility).data
                capacity_summary[facility_id]["availability"] = []
            capacity_summary[facility_id]["availability"].append(
                FacilityCapacitySerializer(capacity_object).data)

        return Response(capacity_summary)
Пример #3
0
def FacilityCapacitySummary():
    capacity_objects = FacilityCapacity.objects.all().select_related(
        "facility", "facility__state", "facility__district",
        "facility__local_body")
    capacity_summary = {}
    current_date = localtime(now()).replace(hour=0,
                                            minute=0,
                                            second=0,
                                            microsecond=0)
    for capacity_object in capacity_objects:
        facility_id = capacity_object.facility.id
        if facility_id not in capacity_summary:
            capacity_summary[facility_id] = FacilitySerializer(
                capacity_object.facility).data
            capacity_summary[facility_id]["availability"] = []
        capacity_summary[facility_id]["availability"].append(
            FacilityCapacitySerializer(capacity_object).data)

    for i in list(capacity_summary.keys()):
        facility_summary_obj = None
        if FacilityRelatedSummary.objects.filter(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date).exists():
            facility_summary_obj = FacilityRelatedSummary.objects.get(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date)
        else:
            facility_summary_obj = FacilityRelatedSummary(
                s_type="FacilityCapacity", facility_id=i)
        facility_summary_obj.data = capacity_summary[i]
        facility_summary_obj.save()

    return True
Пример #4
0
class FacilitySummarySerializer(serializers.ModelSerializer):

    facility = FacilitySerializer()

    class Meta:
        model = FacilityRelatedSummary
        exclude = (
            "id",
            "s_type",
        )
Пример #5
0
class PatientDetailSerializer(PatientListSerializer):
    class MedicalHistorySerializer(serializers.Serializer):
        disease = ChoiceField(choices=DISEASE_CHOICES)
        details = serializers.CharField(required=False, allow_blank=True)

    class PatientTeleConsultationSerializer(serializers.ModelSerializer):
        class Meta:
            model = PatientTeleConsultation
            fields = "__all__"

    medical_history = serializers.ListSerializer(
        child=MedicalHistorySerializer(), required=False)
    tele_consultation_history = serializers.ListSerializer(
        child=PatientTeleConsultationSerializer(), read_only=True)
    last_consultation = serializers.SerializerMethodField(read_only=True)
    facility_object = FacilitySerializer(source="facility", read_only=True)

    def get_last_consultation(self, obj):
        last_consultation = PatientConsultation.objects.filter(
            patient=obj).last()
        if not last_consultation:
            return None
        return PatientConsultationSerializer(last_consultation).data

    class Meta:
        model = PatientRegistration
        exclude = ("created_by", "deleted")

    def create(self, validated_data):
        with transaction.atomic():
            medical_history = validated_data.pop("medical_history", [])
            validated_data["created_by"] = self.context["request"].user
            patient = super().create(validated_data)
            diseases = []
            for disease in medical_history:
                diseases.append(Disease(patient=patient, **disease))
            if diseases:
                Disease.objects.bulk_create(diseases, ignore_conflicts=True)
            return patient

    def update(self, instance, validated_data):
        with transaction.atomic():
            medical_history = validated_data.pop("medical_history", [])
            patient = super().update(instance, validated_data)
            Disease.objects.filter(patient=patient).update(deleted=True)
            diseases = []
            for disease in medical_history:
                diseases.append(Disease(patient=patient, **disease))
            if diseases:
                Disease.objects.bulk_create(diseases, ignore_conflicts=True)
            return patient
Пример #6
0
def FacilityCapacitySummary():
    capacity_objects = FacilityCapacity.objects.all().select_related(
        "facility", "facility__state", "facility__district",
        "facility__local_body")
    capacity_summary = {}
    for capacity_object in capacity_objects:
        facility_id = capacity_object.facility.id
        if facility_id not in capacity_summary:
            capacity_summary[facility_id] = FacilitySerializer(
                capacity_object.facility).data
            capacity_summary[facility_id]["availability"] = []
        capacity_summary[facility_id]["availability"].append(
            FacilityCapacitySerializer(capacity_object).data)

    for i in list(capacity_summary.keys()):
        FacilityRelatedSummary(s_type="FacilityCapacity",
                               facility_id=i,
                               data=capacity_summary[i]).save()

    return True
Пример #7
0
class PatientDetailSerializer(PatientListSerializer):
    class MedicalHistorySerializer(serializers.Serializer):
        disease = ChoiceField(choices=DISEASE_CHOICES)
        details = serializers.CharField(required=False, allow_blank=True)

    class PatientTeleConsultationSerializer(serializers.ModelSerializer):
        class Meta:
            model = PatientTeleConsultation
            fields = "__all__"

    phone_number = PhoneNumberField()
    facility = serializers.IntegerField(source="facility_id",
                                        allow_null=True,
                                        required=False)
    medical_history = serializers.ListSerializer(
        child=MedicalHistorySerializer(), required=False)

    tele_consultation_history = serializers.ListSerializer(
        child=PatientTeleConsultationSerializer(), read_only=True)
    last_consultation = serializers.SerializerMethodField(read_only=True)
    facility_object = FacilitySerializer(source="facility", read_only=True)

    disease_status = ChoiceField(choices=DISEASE_STATUS_CHOICES,
                                 default=DiseaseStatusEnum.SUSPECTED.value)

    class Meta:
        model = PatientRegistration
        exclude = ("created_by", "deleted", "patient_search_id",
                   "year_of_birth")
        read_only = TIMESTAMP_FIELDS

    def get_last_consultation(self, obj):
        last_consultation = PatientConsultation.objects.filter(
            patient=obj).last()
        if not last_consultation:
            return None
        return PatientConsultationSerializer(last_consultation).data

    def validate_facility(self, value):
        if value is not None and Facility.objects.filter(
                id=value).first() is None:
            raise serializers.ValidationError("facility not found")
        return value

    def create(self, validated_data):
        with transaction.atomic():
            medical_history = validated_data.pop("medical_history", [])
            validated_data["created_by"] = self.context["request"].user
            patient = super().create(validated_data)
            diseases = []
            for disease in medical_history:
                diseases.append(Disease(patient=patient, **disease))
            if diseases:
                Disease.objects.bulk_create(diseases, ignore_conflicts=True)
            return patient

    def update(self, instance, validated_data):
        with transaction.atomic():
            medical_history = validated_data.pop("medical_history", [])
            patient = super().update(instance, validated_data)
            Disease.objects.filter(patient=patient).update(deleted=True)
            diseases = []
            for disease in medical_history:
                diseases.append(Disease(patient=patient, **disease))
            if diseases:
                Disease.objects.bulk_create(diseases, ignore_conflicts=True)
            return patient
Пример #8
0
class PatientDetailSerializer(PatientListSerializer):
    class MedicalHistorySerializer(serializers.Serializer):
        disease = ChoiceField(choices=DISEASE_CHOICES)
        details = serializers.CharField(required=False, allow_blank=True)

    class PatientTeleConsultationSerializer(serializers.ModelSerializer):
        class Meta:
            model = PatientTeleConsultation
            fields = "__all__"

    phone_number = PhoneNumberIsPossibleField()
    facility = serializers.UUIDField(source="facility.external_id",
                                     allow_null=True,
                                     required=False)
    medical_history = serializers.ListSerializer(
        child=MedicalHistorySerializer(), required=False)

    tele_consultation_history = serializers.ListSerializer(
        child=PatientTeleConsultationSerializer(), read_only=True)
    last_consultation = serializers.SerializerMethodField(read_only=True)
    facility_object = FacilitySerializer(source="facility", read_only=True)
    # nearest_facility_object = FacilitySerializer(
    #     source="nearest_facility", read_only=True
    # )

    source = ChoiceField(
        choices=PatientRegistration.SourceChoices,
        default=PatientRegistration.SourceEnum.CARE.value,
    )
    disease_status = ChoiceField(choices=DISEASE_STATUS_CHOICES,
                                 default=DiseaseStatusEnum.SUSPECTED.value)

    meta_info = PatientMetaInfoSerializer(required=False, allow_null=True)
    contacted_patients = PatientContactDetailsSerializer(many=True,
                                                         required=False,
                                                         allow_null=True)

    test_type = ChoiceField(
        choices=PatientRegistration.TestTypeChoices,
        required=False,
        default=PatientRegistration.TestTypeEnum.UNK.value,
    )

    last_edited = UserBaseMinimumSerializer(read_only=True)
    created_by = UserBaseMinimumSerializer(read_only=True)
    vaccine_name = serializers.ChoiceField(
        choices=PatientRegistration.vaccineChoices,
        required=False,
        allow_null=True)

    class Meta:
        model = PatientRegistration
        exclude = (
            "deleted",
            "patient_search_id",
            "year_of_birth",
            "countries_travelled_old",
            "external_id",
        )
        include = ("contacted_patients", )
        read_only = TIMESTAMP_FIELDS + ("last_edited", "created_by",
                                        "is_active")

    def get_last_consultation(self, obj):
        last_consultation = PatientConsultation.objects.filter(
            patient=obj).last()
        if not last_consultation:
            return None
        return PatientConsultationSerializer(last_consultation).data

    def validate_facility(self, value):
        if value is not None and Facility.objects.filter(
                id=value).first() is None:
            raise serializers.ValidationError("facility not found")
        return value

    def validate_countries_travelled(self, value):
        if not value:
            value = []
        if not isinstance(value, list):
            value = [value]
        return value

    def validate(self, attrs):
        validated = super().validate(attrs)
        if not self.partial and not validated.get("age") and not validated.get(
                "date_of_birth"):
            raise serializers.ValidationError({
                "non_field_errors":
                [f"Either age or date_of_birth should be passed"]
            })

        if validated.get("is_vaccinated"):
            if validated.get("number_of_doses") == 0:
                raise serializers.ValidationError(
                    "Number of doses cannot be 0")
            if validated.get("vaccine_name") == None:
                raise serializers.ValidationError(
                    "Vaccine name cannot be null")

        return validated

    def create(self, validated_data):
        with transaction.atomic():
            medical_history = validated_data.pop("medical_history", [])
            meta_info = validated_data.pop("meta_info", {})
            contacted_patients = validated_data.pop("contacted_patients", [])

            if "facility" in validated_data:
                external_id = validated_data.pop("facility")["external_id"]
                if external_id:
                    validated_data["facility_id"] = Facility.objects.get(
                        external_id=external_id).id

            validated_data["created_by"] = self.context["request"].user
            patient = super().create(validated_data)
            diseases = []

            for disease in medical_history:
                diseases.append(Disease(patient=patient, **disease))
            if diseases:
                Disease.objects.bulk_create(diseases, ignore_conflicts=True)

            if meta_info:
                meta_info_obj = PatientMetaInfo.objects.create(**meta_info)
                patient.meta_info = meta_info_obj
                patient.save()

            if contacted_patients:
                contacted_patient_objs = [
                    PatientContactDetails(**data, patient=patient)
                    for data in contacted_patients
                ]
                PatientContactDetails.objects.bulk_create(
                    contacted_patient_objs)

            patient.last_edited = self.context["request"].user
            patient.save()

            NotificationGenerator(
                event=Notification.Event.PATIENT_CREATED,
                caused_by=self.context["request"].user,
                caused_object=patient,
                facility=patient.facility,
            ).generate()

            return patient

    def update(self, instance, validated_data):
        with transaction.atomic():
            medical_history = validated_data.pop("medical_history", [])
            meta_info = validated_data.pop("meta_info", {})
            contacted_patients = validated_data.pop("contacted_patients", [])

            if "facility" in validated_data:
                external_id = validated_data.pop("facility")["external_id"]
                if external_id:
                    validated_data["facility_id"] = Facility.objects.get(
                        external_id=external_id).id

            patient = super().update(instance, validated_data)
            Disease.objects.filter(patient=patient).update(deleted=True)
            diseases = []
            for disease in medical_history:
                diseases.append(Disease(patient=patient, **disease))
            if diseases:
                Disease.objects.bulk_create(diseases, ignore_conflicts=True)

            if meta_info:
                for key, value in meta_info.items():
                    setattr(patient.meta_info, key, value)
                patient.meta_info.save()

            if self.partial is not True:  # clear the list and enter details if PUT
                patient.contacted_patients.all().delete()

            if contacted_patients:
                contacted_patient_objs = [
                    PatientContactDetails(**data, patient=patient)
                    for data in contacted_patients
                ]
                PatientContactDetails.objects.bulk_create(
                    contacted_patient_objs)

            patient.last_edited = self.context["request"].user
            patient.save()

            NotificationGenerator(
                event=Notification.Event.PATIENT_UPDATED,
                caused_by=self.context["request"].user,
                caused_object=patient,
                facility=patient.facility,
            ).generate()

            return patient
Пример #9
0
def FacilityCapacitySummary():
    capacity_objects = FacilityCapacity.objects.all().select_related(
        "facility", "facility__state", "facility__district",
        "facility__local_body")
    capacity_summary = {}
    current_date = localtime(now()).replace(hour=0,
                                            minute=0,
                                            second=0,
                                            microsecond=0)

    for facility_obj in Facility.objects.all():
        # Calculate Actual Patients Discharged and Live in this Facility
        patients_in_facility = PatientRegistration.objects.filter(
            facility_id=facility_obj.id).select_related(
                "state", "district", "local_body")
        capacity_summary[facility_obj.id] = FacilitySerializer(
            facility_obj).data
        capacity_summary[facility_obj.id][
            "actual_live_patients"] = patients_in_facility.filter(
                is_active=True).count()
        discharge_patients = patients_in_facility.filter(is_active=False)
        capacity_summary[facility_obj.id][
            "actual_discharged_patients"] = discharge_patients.count()
        capacity_summary[facility_obj.id]["availability"] = []

        temp_inventory_summary_obj = {}
        summary_objs = FacilityInventorySummary.objects.filter(
            facility_id=facility_obj.id)
        for summary_obj in summary_objs:
            burn_rate = FacilityInventoryBurnRate.objects.filter(
                facility_id=facility_obj.id,
                item_id=summary_obj.item.id).first()
            log_query = FacilityInventoryLog.objects.filter(
                facility_id=facility_obj.id,
                item_id=summary_obj.item.id,
                created_date__gte=current_date)
            start_log = log_query.order_by("created_date").first()
            end_log = log_query.order_by("-created_date").first()
            start_stock = summary_obj.quantity
            if start_log:
                start_stock = start_log.current_stock - start_log.quantity_in_default_unit
            end_stock = start_stock
            if end_log:
                end_stock = end_log.current_stock
            total_consumed = 0
            temp1 = log_query.filter(is_incoming=False).aggregate(
                Sum("quantity_in_default_unit"))
            if temp1:
                total_consumed = temp1["quantity_in_default_unit__sum"]
            total_added = 0
            temp2 = log_query.filter(is_incoming=True).aggregate(
                Sum("quantity_in_default_unit"))
            if temp2:
                total_added = temp2["quantity_in_default_unit__sum"]

            if burn_rate:
                burn_rate = burn_rate.burn_rate
            temp_inventory_summary_obj[summary_obj.item.id] = {
                "item_name":
                summary_obj.item.name,
                "stock":
                summary_obj.quantity,
                "unit":
                summary_obj.item.default_unit.name,
                "is_low":
                summary_obj.is_low,
                "burn_rate":
                burn_rate,
                "start_stock":
                start_stock,
                "end_stock":
                end_stock,
                "total_consumed":
                total_consumed,
                "total_added":
                total_added,
                "modified_date":
                summary_obj.modified_date.astimezone().isoformat(),
            }
        capacity_summary[
            facility_obj.id]["inventory"] = temp_inventory_summary_obj

    for capacity_object in capacity_objects:
        facility_id = capacity_object.facility.id
        if facility_id not in capacity_summary:
            capacity_summary[facility_id] = FacilitySerializer(
                capacity_object.facility).data
        if "availability" not in capacity_summary[facility_id]:
            capacity_summary[facility_id]["availability"] = []
        capacity_summary[facility_id]["availability"].append(
            FacilityCapacitySerializer(capacity_object).data)

    for i in capacity_summary:
        facility_summary_obj = None
        if FacilityRelatedSummary.objects.filter(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date).exists():
            facility_summary_obj = FacilityRelatedSummary.objects.get(
                s_type="FacilityCapacity",
                facility_id=i,
                created_date__gte=current_date)
        else:
            facility_summary_obj = FacilityRelatedSummary(
                s_type="FacilityCapacity", facility_id=i)
        facility_summary_obj.data = capacity_summary[i]
        facility_summary_obj.save()

    return True
Пример #10
0
class PatientDetailSerializer(PatientListSerializer):
    class MedicalHistorySerializer(serializers.Serializer):
        disease = ChoiceField(choices=DISEASE_CHOICES)
        details = serializers.CharField(required=False, allow_blank=True)

    class PatientTeleConsultationSerializer(serializers.ModelSerializer):
        class Meta:
            model = PatientTeleConsultation
            fields = "__all__"

    phone_number = PhoneNumberIsPossibleField()
    facility = serializers.IntegerField(source="facility_id", allow_null=True, required=False)
    medical_history = serializers.ListSerializer(child=MedicalHistorySerializer(), required=False)

    tele_consultation_history = serializers.ListSerializer(child=PatientTeleConsultationSerializer(), read_only=True)
    last_consultation = serializers.SerializerMethodField(read_only=True)
    facility_object = FacilitySerializer(source="facility", read_only=True)
    nearest_facility_object = FacilitySerializer(source="nearest_facility", read_only=True)

    source = ChoiceField(choices=PatientRegistration.SourceChoices, default=PatientRegistration.SourceEnum.CARE.value)
    disease_status = ChoiceField(choices=DISEASE_STATUS_CHOICES, default=DiseaseStatusEnum.SUSPECTED.value)

    meta_info = PatientMetaInfoSerializer(required=False, allow_null=True)
    contacted_patients = PatientContactDetailsSerializer(many=True, required=False, allow_null=True)
    countries_travelled = serializers.CharField(required=False, allow_blank=True)

    class Meta:
        model = PatientRegistration
        exclude = ("created_by", "deleted", "patient_search_id", "year_of_birth")
        include = ("contacted_patients",)
        read_only = TIMESTAMP_FIELDS

    def get_last_consultation(self, obj):
        last_consultation = PatientConsultation.objects.filter(patient=obj).last()
        if not last_consultation:
            return None
        return PatientConsultationSerializer(last_consultation).data

    def validate_facility(self, value):
        if value is not None and Facility.objects.filter(id=value).first() is None:
            raise serializers.ValidationError("facility not found")
        return value

    def validate(self, attrs):
        validated = super().validate(attrs)
        if not self.partial and not validated.get("age") and not validated.get("date_of_birth"):
            raise serializers.ValidationError({"non_field_errors": [f"Either age or date_of_birth should be passed"]})
        return validated

    def create(self, validated_data):
        with transaction.atomic():
            medical_history = validated_data.pop("medical_history", [])
            meta_info = validated_data.pop("meta_info", {})
            contacted_patients = validated_data.pop("contacted_patients", [])

            validated_data["created_by"] = self.context["request"].user
            patient = super().create(validated_data)
            diseases = []

            for disease in medical_history:
                diseases.append(Disease(patient=patient, **disease))
            if diseases:
                Disease.objects.bulk_create(diseases, ignore_conflicts=True)

            if meta_info:
                meta_info_obj = PatientMetaInfo.objects.create(**meta_info)
                patient.meta_info = meta_info_obj
                patient.save()

            if contacted_patients:
                contacted_patient_objs = [PatientContactDetails(**data, patient=patient) for data in contacted_patients]
                PatientContactDetails.objects.bulk_create(contacted_patient_objs)

            return patient

    def update(self, instance, validated_data):
        with transaction.atomic():
            medical_history = validated_data.pop("medical_history", [])
            meta_info = validated_data.pop("meta_info", {})
            contacted_patients = validated_data.pop("contacted_patients", [])

            patient = super().update(instance, validated_data)
            Disease.objects.filter(patient=patient).update(deleted=True)
            diseases = []
            for disease in medical_history:
                diseases.append(Disease(patient=patient, **disease))
            if diseases:
                Disease.objects.bulk_create(diseases, ignore_conflicts=True)

            if meta_info:
                for key, value in meta_info.items():
                    setattr(patient.meta_info, key, value)
                patient.meta_info.save()

            if self.partial is not True:  # clear the list and enter details if PUT
                patient.contacted_patients.all().delete()

            if contacted_patients:
                contacted_patient_objs = [PatientContactDetails(**data, patient=patient) for data in contacted_patients]
                PatientContactDetails.objects.bulk_create(contacted_patient_objs)

            return patient