From 0daac09d768e12a0e87289fda47a6993586f9bdb Mon Sep 17 00:00:00 2001 From: Onkar Jadhav Date: Thu, 22 Feb 2024 17:44:32 +0530 Subject: [PATCH 1/4] update facility.json with more consultations for same patient --- data/dummy/facility.json | 568 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 568 insertions(+) diff --git a/data/dummy/facility.json b/data/dummy/facility.json index f2a1113659..df563ffb31 100644 --- a/data/dummy/facility.json +++ b/data/dummy/facility.json @@ -3197,6 +3197,574 @@ "discharge_advice": {} } }, + { + "model": "facility.patientconsultation", + "pk": 19, + "fields": { + "external_id": "40faecd6-6199-48cd-bc2a-dd9e73b920f9", + "created_date": "2023-12-07T08:47:53.746Z", + "modified_date": "2023-12-07T08:47:53.751Z", + "deleted": false, + "patient": 18, + "patient_no": "IP008", + "facility": 1, + "deprecated_diagnosis": "", + "deprecated_icd11_provisional_diagnoses": "[]", + "deprecated_icd11_diagnoses": "[]", + "deprecated_icd11_principal_diagnosis": "", + "symptoms": "1", + "other_symptoms": "", + "symptoms_onset_date": null, + "deprecated_covid_category": null, + "category": "Stable", + "examination_details": "Examination details and Clinical conditions", + "history_of_present_illness": "history", + "treatment_plan": "", + "consultation_notes": "generalnote", + "course_in_facility": null, + "investigation": [], + "prescriptions": {}, + "procedure": [], + "suggestion": "A", + "route_to_facility": 10, + "review_interval": -1, + "referred_to": null, + "referred_to_external": "", + "transferred_from_location": null, + "referred_from_facility": null, + "referred_from_facility_external": "", + "referred_by_external": "", + "is_readmission": false, + "admitted": true, + "encounter_date": "2023-12-07T08:47:53.746Z", + "icu_admission_date": null, + "discharge_date": null, + "discharge_reason": null, + "new_discharge_reason": null, + "discharge_notes": "", + "discharge_prescription": {}, + "discharge_prn_prescription": {}, + "death_datetime": null, + "death_confirmed_doctor": "", + "bed_number": null, + "is_kasp": false, + "kasp_enabled_date": null, + "is_telemedicine": false, + "last_updated_by_telemedicine": false, + "assigned_to": null, + "medico_legal_case": false, + "deprecated_verified_by": "", + "treating_physician": 21, + "created_by": 2, + "last_edited_by": 2, + "last_daily_round": null, + "current_bed": null, + "height": 70.0, + "weight": 170.0, + "operation": null, + "special_instruction": "", + "intubation_history": [], + "prn_prescription": {}, + "discharge_advice": {} + } + }, + { + "model": "facility.patientconsultation", + "pk": 20, + "fields": { + "external_id": "41faecc6-6199-48cd-bc2a-dd9e73b920f9", + "created_date": "2023-12-15T08:47:53.746Z", + "modified_date": "2023-12-15T08:47:53.751Z", + "deleted": false, + "patient": 18, + "patient_no": "IP009", + "facility": 1, + "deprecated_diagnosis": "", + "deprecated_icd11_provisional_diagnoses": "[]", + "deprecated_icd11_diagnoses": "[]", + "deprecated_icd11_principal_diagnosis": "", + "symptoms": "1", + "other_symptoms": "", + "symptoms_onset_date": null, + "deprecated_covid_category": null, + "category": "Stable", + "examination_details": "Examination details and Clinical conditions", + "history_of_present_illness": "history", + "treatment_plan": "", + "consultation_notes": "generalnote", + "course_in_facility": null, + "investigation": [], + "prescriptions": {}, + "procedure": [], + "suggestion": "A", + "route_to_facility": 10, + "review_interval": -1, + "referred_to": null, + "referred_to_external": "", + "transferred_from_location": null, + "referred_from_facility": null, + "referred_from_facility_external": "", + "referred_by_external": "", + "is_readmission": false, + "admitted": true, + "encounter_date": "2023-12-15T08:47:53.746Z", + "icu_admission_date": null, + "discharge_date": null, + "discharge_reason": null, + "new_discharge_reason": null, + "discharge_notes": "", + "discharge_prescription": {}, + "discharge_prn_prescription": {}, + "death_datetime": null, + "death_confirmed_doctor": "", + "bed_number": null, + "is_kasp": false, + "kasp_enabled_date": null, + "is_telemedicine": false, + "last_updated_by_telemedicine": false, + "assigned_to": null, + "medico_legal_case": false, + "deprecated_verified_by": "", + "treating_physician": 21, + "created_by": 2, + "last_edited_by": 2, + "last_daily_round": null, + "current_bed": null, + "height": 70.0, + "weight": 170.0, + "operation": null, + "special_instruction": "", + "intubation_history": [], + "prn_prescription": {}, + "discharge_advice": {} + } + }, + { + "model": "facility.patientconsultation", + "pk": 21, + "fields": { + "external_id": "40fa5cc6-6199-48cd-bc2a-dd9e73b920f9", + "created_date": "2024-1-30T08:47:53.746Z", + "modified_date": "2024-1-30T08:47:53.746Z", + "deleted": false, + "patient": 18, + "patient_no": "IP0010", + "facility": 1, + "deprecated_diagnosis": "", + "deprecated_icd11_provisional_diagnoses": "[]", + "deprecated_icd11_diagnoses": "[]", + "deprecated_icd11_principal_diagnosis": "", + "symptoms": "1", + "other_symptoms": "", + "symptoms_onset_date": null, + "deprecated_covid_category": null, + "category": "Stable", + "examination_details": "Examination details and Clinical conditions", + "history_of_present_illness": "history", + "treatment_plan": "", + "consultation_notes": "generalnote", + "course_in_facility": null, + "investigation": [], + "prescriptions": {}, + "procedure": [], + "suggestion": "A", + "route_to_facility": 10, + "review_interval": -1, + "referred_to": null, + "referred_to_external": "", + "transferred_from_location": null, + "referred_from_facility": null, + "referred_from_facility_external": "", + "referred_by_external": "", + "is_readmission": false, + "admitted": true, + "encounter_date": "2024-1-30T08:47:53.746Z", + "icu_admission_date": null, + "discharge_date": null, + "discharge_reason": null, + "new_discharge_reason": null, + "discharge_notes": "", + "discharge_prescription": {}, + "discharge_prn_prescription": {}, + "death_datetime": null, + "death_confirmed_doctor": "", + "bed_number": null, + "is_kasp": false, + "kasp_enabled_date": null, + "is_telemedicine": false, + "last_updated_by_telemedicine": false, + "assigned_to": null, + "medico_legal_case": false, + "deprecated_verified_by": "", + "treating_physician": 21, + "created_by": 2, + "last_edited_by": 2, + "last_daily_round": null, + "current_bed": null, + "height": 70.0, + "weight": 170.0, + "operation": null, + "special_instruction": "", + "intubation_history": [], + "prn_prescription": {}, + "discharge_advice": {} + } + }, + { + "model": "facility.patientconsultation", + "pk": 22, + "fields": { + "external_id": "40faecc6-6199-48cd-bc2a-6d9e73b920f9", + "created_date": "2024-2-28T08:47:53.746Z", + "modified_date": "2024-2-28T08:47:53.746Z", + "deleted": false, + "patient": 18, + "patient_no": "IP011", + "facility": 1, + "deprecated_diagnosis": "", + "deprecated_icd11_provisional_diagnoses": "[]", + "deprecated_icd11_diagnoses": "[]", + "deprecated_icd11_principal_diagnosis": "", + "symptoms": "1", + "other_symptoms": "", + "symptoms_onset_date": null, + "deprecated_covid_category": null, + "category": "Stable", + "examination_details": "Examination details and Clinical conditions", + "history_of_present_illness": "history", + "treatment_plan": "", + "consultation_notes": "generalnote", + "course_in_facility": null, + "investigation": [], + "prescriptions": {}, + "procedure": [], + "suggestion": "A", + "route_to_facility": 10, + "review_interval": -1, + "referred_to": null, + "referred_to_external": "", + "transferred_from_location": null, + "referred_from_facility": null, + "referred_from_facility_external": "", + "referred_by_external": "", + "is_readmission": false, + "admitted": true, + "encounter_date": "2024-2-28T08:47:53.746Z", + "icu_admission_date": null, + "discharge_date": null, + "discharge_reason": null, + "new_discharge_reason": null, + "discharge_notes": "", + "discharge_prescription": {}, + "discharge_prn_prescription": {}, + "death_datetime": null, + "death_confirmed_doctor": "", + "bed_number": null, + "is_kasp": false, + "kasp_enabled_date": null, + "is_telemedicine": false, + "last_updated_by_telemedicine": false, + "assigned_to": null, + "medico_legal_case": false, + "deprecated_verified_by": "", + "treating_physician": 21, + "created_by": 2, + "last_edited_by": 2, + "last_daily_round": null, + "current_bed": null, + "height": 70.0, + "weight": 170.0, + "operation": null, + "special_instruction": "", + "intubation_history": [], + "prn_prescription": {}, + "discharge_advice": {} + } + }, + { + "model": "facility.patientconsultation", + "pk": 23, + "fields": { + "external_id": "40faecc6-61a9-48cd-bc2a-dd9e73b920f9", + "created_date": "2024-04-01T08:47:53.746Z", + "modified_date": "2024-04-01T08:47:53.746Z", + "deleted": false, + "patient": 18, + "patient_no": "IP012", + "facility": 1, + "deprecated_diagnosis": "", + "deprecated_icd11_provisional_diagnoses": "[]", + "deprecated_icd11_diagnoses": "[]", + "deprecated_icd11_principal_diagnosis": "", + "symptoms": "1", + "other_symptoms": "", + "symptoms_onset_date": null, + "deprecated_covid_category": null, + "category": "Stable", + "examination_details": "Examination details and Clinical conditions", + "history_of_present_illness": "history", + "treatment_plan": "", + "consultation_notes": "generalnote", + "course_in_facility": null, + "investigation": [], + "prescriptions": {}, + "procedure": [], + "suggestion": "A", + "route_to_facility": 10, + "review_interval": -1, + "referred_to": null, + "referred_to_external": "", + "transferred_from_location": null, + "referred_from_facility": null, + "referred_from_facility_external": "", + "referred_by_external": "", + "is_readmission": false, + "admitted": true, + "encounter_date": "2024-04-01T08:47:53.746Z", + "icu_admission_date": null, + "discharge_date": null, + "discharge_reason": null, + "new_discharge_reason": null, + "discharge_notes": "", + "discharge_prescription": {}, + "discharge_prn_prescription": {}, + "death_datetime": null, + "death_confirmed_doctor": "", + "bed_number": null, + "is_kasp": false, + "kasp_enabled_date": null, + "is_telemedicine": false, + "last_updated_by_telemedicine": false, + "assigned_to": null, + "medico_legal_case": false, + "deprecated_verified_by": "", + "treating_physician": 21, + "created_by": 2, + "last_edited_by": 2, + "last_daily_round": null, + "current_bed": null, + "height": 70.0, + "weight": 170.0, + "operation": null, + "special_instruction": "", + "intubation_history": [], + "prn_prescription": {}, + "discharge_advice": {} + } + }, + { + "model": "facility.patientconsultation", + "pk": 24, + "fields": { + "external_id": "40faecb6-6199-48cd-bc2a-dd9e73b920f9", + "created_date": "2022-05-06T08:47:53.746Z", + "modified_date": "2022-05-06T08:47:53.751Z", + "deleted": false, + "patient": 18, + "patient_no": "IP013", + "facility": 1, + "deprecated_diagnosis": "", + "deprecated_icd11_provisional_diagnoses": "[]", + "deprecated_icd11_diagnoses": "[]", + "deprecated_icd11_principal_diagnosis": "", + "symptoms": "1", + "other_symptoms": "", + "symptoms_onset_date": null, + "deprecated_covid_category": null, + "category": "Stable", + "examination_details": "Examination details and Clinical conditions", + "history_of_present_illness": "history", + "treatment_plan": "", + "consultation_notes": "generalnote", + "course_in_facility": null, + "investigation": [], + "prescriptions": {}, + "procedure": [], + "suggestion": "A", + "route_to_facility": 10, + "review_interval": -1, + "referred_to": null, + "referred_to_external": "", + "transferred_from_location": null, + "referred_from_facility": null, + "referred_from_facility_external": "", + "referred_by_external": "", + "is_readmission": false, + "admitted": true, + "encounter_date": "2022-05-06T08:47:53.746Z", + "icu_admission_date": null, + "discharge_date": null, + "discharge_reason": null, + "new_discharge_reason": null, + "discharge_notes": "", + "discharge_prescription": {}, + "discharge_prn_prescription": {}, + "death_datetime": null, + "death_confirmed_doctor": "", + "bed_number": null, + "is_kasp": false, + "kasp_enabled_date": null, + "is_telemedicine": false, + "last_updated_by_telemedicine": false, + "assigned_to": null, + "medico_legal_case": false, + "deprecated_verified_by": "", + "treating_physician": 21, + "created_by": 2, + "last_edited_by": 2, + "last_daily_round": null, + "current_bed": null, + "height": 70.0, + "weight": 170.0, + "operation": null, + "special_instruction": "", + "intubation_history": [], + "prn_prescription": {}, + "discharge_advice": {} + } + }, + { + "model": "facility.patientconsultation", + "pk": 25, + "fields": { + "external_id": "400aecc6-6199-48cd-bc2a-dd9e73b920f9", + "created_date": "2022-02-06T08:47:53.746Z", + "modified_date": "2022-02-06T08:47:53.746Z", + "deleted": false, + "patient": 18, + "patient_no": "IP014", + "facility": 1, + "deprecated_diagnosis": "", + "deprecated_icd11_provisional_diagnoses": "[]", + "deprecated_icd11_diagnoses": "[]", + "deprecated_icd11_principal_diagnosis": "", + "symptoms": "1", + "other_symptoms": "", + "symptoms_onset_date": null, + "deprecated_covid_category": null, + "category": "Stable", + "examination_details": "Examination details and Clinical conditions", + "history_of_present_illness": "history", + "treatment_plan": "", + "consultation_notes": "generalnote", + "course_in_facility": null, + "investigation": [], + "prescriptions": {}, + "procedure": [], + "suggestion": "A", + "route_to_facility": 10, + "review_interval": -1, + "referred_to": null, + "referred_to_external": "", + "transferred_from_location": null, + "referred_from_facility": null, + "referred_from_facility_external": "", + "referred_by_external": "", + "is_readmission": false, + "admitted": true, + "encounter_date": "2022-02-06T08:47:53.746Z", + "icu_admission_date": null, + "discharge_date": null, + "discharge_reason": null, + "new_discharge_reason": null, + "discharge_notes": "", + "discharge_prescription": {}, + "discharge_prn_prescription": {}, + "death_datetime": null, + "death_confirmed_doctor": "", + "bed_number": null, + "is_kasp": false, + "kasp_enabled_date": null, + "is_telemedicine": false, + "last_updated_by_telemedicine": false, + "assigned_to": null, + "medico_legal_case": false, + "deprecated_verified_by": "", + "treating_physician": 21, + "created_by": 2, + "last_edited_by": 2, + "last_daily_round": null, + "current_bed": null, + "height": 70.0, + "weight": 170.0, + "operation": null, + "special_instruction": "", + "intubation_history": [], + "prn_prescription": {}, + "discharge_advice": {} + } + }, + { + "model": "facility.patientconsultation", + "pk": 26, + "fields": { + "external_id": "40faecc6-6599-48cd-bc2a-dd9e73b920f9", + "created_date": "2023-08-06T08:47:53.746Z", + "modified_date": "2023-08-06T08:47:53.751Z", + "deleted": false, + "patient": 18, + "patient_no": "IP015", + "facility": 1, + "deprecated_diagnosis": "", + "deprecated_icd11_provisional_diagnoses": "[]", + "deprecated_icd11_diagnoses": "[]", + "deprecated_icd11_principal_diagnosis": "", + "symptoms": "1", + "other_symptoms": "", + "symptoms_onset_date": null, + "deprecated_covid_category": null, + "category": "Stable", + "examination_details": "Examination details and Clinical conditions", + "history_of_present_illness": "history", + "treatment_plan": "", + "consultation_notes": "generalnote", + "course_in_facility": null, + "investigation": [], + "prescriptions": {}, + "procedure": [], + "suggestion": "A", + "route_to_facility": 10, + "review_interval": -1, + "referred_to": null, + "referred_to_external": "", + "transferred_from_location": null, + "referred_from_facility": null, + "referred_from_facility_external": "", + "referred_by_external": "", + "is_readmission": false, + "admitted": true, + "encounter_date": "2023-12-06T08:47:34.395Z", + "icu_admission_date": null, + "discharge_date": null, + "discharge_reason": null, + "new_discharge_reason": null, + "discharge_notes": "", + "discharge_prescription": {}, + "discharge_prn_prescription": {}, + "death_datetime": null, + "death_confirmed_doctor": "", + "bed_number": null, + "is_kasp": false, + "kasp_enabled_date": null, + "is_telemedicine": false, + "last_updated_by_telemedicine": false, + "assigned_to": null, + "medico_legal_case": false, + "deprecated_verified_by": "", + "treating_physician": 21, + "created_by": 2, + "last_edited_by": 2, + "last_daily_round": null, + "current_bed": null, + "height": 70.0, + "weight": 170.0, + "operation": null, + "special_instruction": "", + "intubation_history": [], + "prn_prescription": {}, + "discharge_advice": {} + } + }, { "model": "facility.bed", "pk": 1, From f7afc531cf6417360f643780bec9e4d141a457cf Mon Sep 17 00:00:00 2001 From: Onkar Jadhav Date: Thu, 22 Feb 2024 19:41:57 +0530 Subject: [PATCH 2/4] track previous consulation --- .../api/serializers/patient_consultation.py | 1 + ...tientconsultation_previous_consultation.py | 51 +++++++++++++++++++ care/facility/models/patient_consultation.py | 6 +++ 3 files changed, 58 insertions(+) create mode 100644 care/facility/migrations/0415_patientconsultation_previous_consultation.py diff --git a/care/facility/api/serializers/patient_consultation.py b/care/facility/api/serializers/patient_consultation.py index b3759ee369..1d575e25d3 100644 --- a/care/facility/api/serializers/patient_consultation.py +++ b/care/facility/api/serializers/patient_consultation.py @@ -374,6 +374,7 @@ def create(self, validated_data): consultation.created_by = self.context["request"].user consultation.last_edited_by = self.context["request"].user patient = consultation.patient + consultation.previous_consultation = patient.last_consultation last_consultation = patient.last_consultation if ( last_consultation diff --git a/care/facility/migrations/0415_patientconsultation_previous_consultation.py b/care/facility/migrations/0415_patientconsultation_previous_consultation.py new file mode 100644 index 0000000000..0bd0401e47 --- /dev/null +++ b/care/facility/migrations/0415_patientconsultation_previous_consultation.py @@ -0,0 +1,51 @@ +# Generated by Django 4.2.10 on 2024-02-18 06:37 +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("facility", "0414_remove_bed_old_name"), + ] + + def fill_previous_consultation(apps, schema_editor): + PatientConsultation = apps.get_model("facility", "PatientConsultation") + bulk_update_list = [] + qs = PatientConsultation.objects.all() + + def get_previous_consultation(consultation): + previous_consultation = qs.filter( + patient=consultation.patient, + created_date__lt=consultation.created_date, + ).latest('created_date') + + return previous_consultation + + for consultation in qs: + try: + consultation.previous_consultation = get_previous_consultation(consultation) + bulk_update_list.append(consultation) + except PatientConsultation.DoesNotExist: + pass + + PatientConsultation.objects.bulk_update( + bulk_update_list, ["previous_consultation"], batch_size=1000 + ) + + + operations = [ + migrations.AddField( + model_name="patientconsultation", + name="previous_consultation", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="facility.patientconsultation", + ), + ), + migrations.RunPython( + fill_previous_consultation, + reverse_code=migrations.RunPython.noop, + ) + ] diff --git a/care/facility/models/patient_consultation.py b/care/facility/models/patient_consultation.py index a16c08e2ae..a22c934326 100644 --- a/care/facility/models/patient_consultation.py +++ b/care/facility/models/patient_consultation.py @@ -126,6 +126,12 @@ class PatientConsultation(PatientBaseModel, ConsultationRelatedPermissionMixin): default="", null=True, blank=True ) referred_by_external = models.TextField(default="", null=True, blank=True) + previous_consultation = models.ForeignKey( + "self", + null=True, + blank=True, + on_delete=models.PROTECT, + ) is_readmission = models.BooleanField(default=False) admitted = models.BooleanField(default=False) # Deprecated encounter_date = models.DateTimeField(default=timezone.now, db_index=True) From 2105baa605266a30df5cff44827839174873ccf3 Mon Sep 17 00:00:00 2001 From: Onkar Jadhav <56870381+Omkar76@users.noreply.github.com> Date: Thu, 22 Feb 2024 23:17:13 +0530 Subject: [PATCH 3/4] use Aakashs's suggestion - sort queryset by created_date descending Co-authored-by: Aakash Singh --- .../0415_patientconsultation_previous_consultation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/care/facility/migrations/0415_patientconsultation_previous_consultation.py b/care/facility/migrations/0415_patientconsultation_previous_consultation.py index 0bd0401e47..5d21c8e4d7 100644 --- a/care/facility/migrations/0415_patientconsultation_previous_consultation.py +++ b/care/facility/migrations/0415_patientconsultation_previous_consultation.py @@ -11,7 +11,7 @@ class Migration(migrations.Migration): def fill_previous_consultation(apps, schema_editor): PatientConsultation = apps.get_model("facility", "PatientConsultation") bulk_update_list = [] - qs = PatientConsultation.objects.all() + qs = PatientConsultation.objects.all().order_by("-created_date") def get_previous_consultation(consultation): previous_consultation = qs.filter( From dbcc4b8ee1230a253d5c0518b8da81bc3cec91b1 Mon Sep 17 00:00:00 2001 From: Onkar Jadhav Date: Fri, 23 Feb 2024 00:00:26 +0530 Subject: [PATCH 4/4] Lint --- ...415_patientconsultation_previous_consultation.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/care/facility/migrations/0415_patientconsultation_previous_consultation.py b/care/facility/migrations/0415_patientconsultation_previous_consultation.py index 5d21c8e4d7..4d9d6f7dbd 100644 --- a/care/facility/migrations/0415_patientconsultation_previous_consultation.py +++ b/care/facility/migrations/0415_patientconsultation_previous_consultation.py @@ -1,6 +1,6 @@ # Generated by Django 4.2.10 on 2024-02-18 06:37 -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): @@ -14,16 +14,18 @@ def fill_previous_consultation(apps, schema_editor): qs = PatientConsultation.objects.all().order_by("-created_date") def get_previous_consultation(consultation): - previous_consultation = qs.filter( + previous_consultation = qs.filter( patient=consultation.patient, created_date__lt=consultation.created_date, - ).latest('created_date') + ).latest("created_date") return previous_consultation for consultation in qs: try: - consultation.previous_consultation = get_previous_consultation(consultation) + consultation.previous_consultation = get_previous_consultation( + consultation + ) bulk_update_list.append(consultation) except PatientConsultation.DoesNotExist: pass @@ -32,7 +34,6 @@ def get_previous_consultation(consultation): bulk_update_list, ["previous_consultation"], batch_size=1000 ) - operations = [ migrations.AddField( model_name="patientconsultation", @@ -47,5 +48,5 @@ def get_previous_consultation(consultation): migrations.RunPython( fill_previous_consultation, reverse_code=migrations.RunPython.noop, - ) + ), ]