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)
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
class FacilitySummarySerializer(serializers.ModelSerializer): facility = FacilitySerializer() class Meta: model = FacilityRelatedSummary exclude = ( "id", "s_type", )
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
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
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
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
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
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