From ae43cdeffcb8f75e5df639cdc464719c40a82495 Mon Sep 17 00:00:00 2001 From: Rithvik Nishad Date: Fri, 1 Dec 2023 10:45:09 +0530 Subject: [PATCH] Truncate time from `discharge_date` (#1734) * Truncate time from `discharge_date` * Exclude weird records * correct output_field --- .../0397_truncate_discharge_time.py | 59 +++++++++++++++++++ 1 file changed, 59 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..c87bb9dbd1 --- /dev/null +++ b/care/facility/migrations/0397_truncate_discharge_time.py @@ -0,0 +1,59 @@ +# Generated by Django 4.2.5 on 2023-11-30 11:58 + +import datetime + +from django.db import migrations +from django.db.models import DateTimeField, 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).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 + + # 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=DateTimeField(), + ) + ) + + operations = [ + migrations.RunPython( + clean_discharge_date, reverse_code=migrations.RunPython.noop + ), + ]