From ad0c53f197056d48cf5881d5ab8e017812b786b9 Mon Sep 17 00:00:00 2001 From: rithviknishad Date: Thu, 30 Nov 2023 17:38:38 +0530 Subject: [PATCH 1/3] Truncate time from `discharge_date` --- .../0397_truncate_discharge_time.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 care/facility/migrations/0397_truncate_discharge_time.py diff --git a/care/facility/migrations/0397_truncate_discharge_time.py b/care/facility/migrations/0397_truncate_discharge_time.py new file mode 100644 index 0000000000..5cb8e0221b --- /dev/null +++ b/care/facility/migrations/0397_truncate_discharge_time.py @@ -0,0 +1,57 @@ +# Generated by Django 4.2.5 on 2023-11-30 11:58 + +import datetime + +from django.db import migrations +from django.db.models import DurationField, ExpressionWrapper, F +from django.db.models.functions import TruncDay +from django.utils import timezone + + +class Migration(migrations.Migration): + dependencies = [ + ("facility", "0396_merge_20231122_0240"), + ] + + def clean_discharge_date(apps, schema_editor): + """ + Clean discharge_date field to be 00:00:00 IST + + For example: + + `2023-10-06 06:00:00 +05:30 IST` (`2023-10-06 00:30:00 +00:00 UTC`) would be updated to + `2023-10-06 00:00:00 +05:30 IST` (`2023-10-05 18:30:00 +00:00 UTC`) + + Equivalent to the following SQL: + + ```sql + UPDATE facility_patientconsultation + SET discharge_date = + timezone('IST', discharge_date) AT TIME ZONE 'UTC' + + (date_trunc('day', timezone('IST', discharge_date)) - timezone('IST', discharge_date)) + + (interval '-5 hours -30 minutes') + WHERE discharge_date IS NOT NULL; + ``` + """ + + current_timezone = timezone.get_current_timezone() + tz_offset = timezone.timedelta( + minutes=current_timezone.utcoffset(datetime.datetime.utcnow()).seconds / 60 + ) + + PatientConsultation = apps.get_model("facility", "PatientConsultation") + PatientConsultation.objects.filter(discharge_date__isnull=False).update( + discharge_date=ExpressionWrapper( + # Convert the discharge_date to UTC by subtracting the current offset + F("discharge_date") - tz_offset + + # Get the day part of the discharge_date and subtract the actual discharge_date from it + (TruncDay(F("discharge_date")) - F("discharge_date")), + output_field=DurationField(), + ) + ) + + operations = [ + migrations.RunPython( + clean_discharge_date, reverse_code=migrations.RunPython.noop + ), + ] From c58dbf34b4245c9cec9beb29e706eba055953d81 Mon Sep 17 00:00:00 2001 From: rithviknishad Date: Thu, 30 Nov 2023 18:05:58 +0530 Subject: [PATCH 2/3] Exclude weird records --- care/facility/migrations/0397_truncate_discharge_time.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/care/facility/migrations/0397_truncate_discharge_time.py b/care/facility/migrations/0397_truncate_discharge_time.py index 5cb8e0221b..3813b4f28f 100644 --- a/care/facility/migrations/0397_truncate_discharge_time.py +++ b/care/facility/migrations/0397_truncate_discharge_time.py @@ -40,7 +40,9 @@ def clean_discharge_date(apps, schema_editor): ) PatientConsultation = apps.get_model("facility", "PatientConsultation") - PatientConsultation.objects.filter(discharge_date__isnull=False).update( + PatientConsultation.objects.filter(discharge_date__isnull=False).exclude( + admission_date__isnull=False, discharge_date__lt=F("admission_date") + ).update( discharge_date=ExpressionWrapper( # Convert the discharge_date to UTC by subtracting the current offset F("discharge_date") - tz_offset + From 98bb5120b7d85766aaf10e6bd4cae6bc3f599ede Mon Sep 17 00:00:00 2001 From: rithviknishad Date: Thu, 30 Nov 2023 18:33:22 +0530 Subject: [PATCH 3/3] correct output_field --- care/facility/migrations/0397_truncate_discharge_time.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/care/facility/migrations/0397_truncate_discharge_time.py b/care/facility/migrations/0397_truncate_discharge_time.py index 3813b4f28f..c87bb9dbd1 100644 --- a/care/facility/migrations/0397_truncate_discharge_time.py +++ b/care/facility/migrations/0397_truncate_discharge_time.py @@ -3,7 +3,7 @@ import datetime from django.db import migrations -from django.db.models import DurationField, ExpressionWrapper, F +from django.db.models import DateTimeField, ExpressionWrapper, F from django.db.models.functions import TruncDay from django.utils import timezone @@ -48,7 +48,7 @@ def clean_discharge_date(apps, schema_editor): F("discharge_date") - tz_offset + # Get the day part of the discharge_date and subtract the actual discharge_date from it (TruncDay(F("discharge_date")) - F("discharge_date")), - output_field=DurationField(), + output_field=DateTimeField(), ) )