Skip to content

Commit

Permalink
Adds a management command to sync the blood cultures with the new blo…
Browse files Browse the repository at this point in the history
…od cultures
  • Loading branch information
fredkingham committed May 10, 2019
1 parent 91c5e54 commit 3876116
Showing 1 changed file with 54 additions and 44 deletions.
98 changes: 54 additions & 44 deletions elcid/management/commands/sync_blood_cultures.py
Original file line number Diff line number Diff line change
@@ -1,76 +1,86 @@
from collections import defaultdict
from django.core.management.base import BaseCommand
from django.db import transaction
from opal.models import Patient
from opal.core.serialization import deserialize_datetime
from elcid import models


def get_key(lab_test):
keys = ["aerobic", "lab_number", "source", "isolate"]
keys = ["lab_number", "source", "datetime_ordered"]
extras = lab_test.extras
return tuple([extras.get(i) for i in keys])


def save_blood_culture_isolate(patient, lab_tests):
blood_culture_isolate = models.BloodCultureIsolate(patient=patient)
# we have to save for the many to many fields
blood_culture_isolate.save()
def get_or_create_blood_culture_set(patient, old_lab_test):
extras = old_lab_test.extras
bcs_attrs = {"lab_number": extras.get("lab_number")}
bcs_datetime_ordered = extras.get("datetime_ordered")
if bcs_datetime_ordered:
bcs_attrs["date_ordered"] = deserialize_datetime(bcs_datetime_ordered)
source = extras.get("source")
if source:
source_model = models.BloodCultureSource.objects.first(name=source)
if source_model:
bcs_attrs["source_fk_id"] = source_model.id
else:
bcs_attrs["source_ft"] = source

bcs, created = patient.bloodcultureset_set.get_or_create(
**bcs_attrs
)

bcs.created = bcs.created or old_lab_test.created
bcs.created_by = bcs.created_by or old_lab_test.created_by
bcs.updated = bcs.updated or old_lab_test.updated
bcs.updated_by = bcs.updated_by or old_lab_test.updated_by


def save_blood_culture_isolates(patient, old_lab_test):
bcs, _ = get_or_create_blood_culture_set(patient, old_lab_test)

lab_test_type_to_field = {
old_field_to_new_field = {
models.BloodCultureOrganism.get_display_name(): "organism",
models.GramStain.get_display_name(): "gram_stains",
models.GramStain.get_display_name(): "gram_stain",
models.QuickFISH.get_display_name(): "quick_fish",
models.GPCStaph.get_display_name(): "gpc_staph",
models.GPCStrep.get_display_name(): "gpc_strep",
models.GNR.get_display_name(): "gnr"
}

for lab_test in lab_tests:
field = lab_test_type_to_field[lab_test.lab_test_type]
if field == "gram_stains" and lab_test.result.result:
gs = models.GramStainOutcome.objects.get(
name=lab_test.result.result
)
blood_culture_isolate.gram_stains.add(gs)
else:
setattr(blood_culture_isolate, field, lab_test.result.result)

blood_culture_isolate.lab_number = lab_test.extras.get("lab_number")
blood_culture_isolate.aerobic = lab_test.extras.get("aerobic")
blood_culture_isolate.source = lab_test.extras.get("source")
blood_culture_isolate.created = lab_test.created
blood_culture_isolate.created_by = lab_test.created_by
blood_culture_isolate.updated = lab_test.updated
blood_culture_isolate.updated_by = lab_test.updated_by
dt = lab_test.datetime_ordered
if dt:
blood_culture_isolate.date_ordered = dt.date()

blood_culture_isolate.sensitivities.add(
*lab_test.sensitive_antibiotics.all()
)
blood_culture_isolate.resistances.add(
*lab_test.resistant_antibiotics.all()
)

# saves the non many to many fields
blood_culture_isolate.save()
isolate = models.BloodCultureIsolate(
blood_culture_set=bcs
)

for old_field, new_field in old_field_to_new_field.items():
setattr(isolate, new_field, old_lab_test.extras.get(old_field))

if old_lab_test.extras.get("aerobic") is True:
isolate.aerobic_or_anaerobic = isolate.AEROBIC
elif old_lab_test.extras.get("aerobic") is False:
isolate.aerobic_or_anaerobic = isolate.ANAEROBIC
isolate.created = old_lab_test.created
isolate.created_by = old_lab_test.created_by
isolate.updated = old_lab_test.updated
isolate.updated_by = old_lab_test.updated_by
isolate.sensitivities.add(
*old_lab_test.sensitive_antibiotics.all()
)
isolate.resistances.add(
*old_lab_test.resistant_antibiotics.all()
)
isolate.save()


@transaction.atomic
def sync_blood_cultures(patient):
lab_tests = patient.labtest_set.exclude(lab_test_type__istartswith="up")
by_key = defaultdict(list)
for lab_test in lab_tests:
by_key[get_key(lab_test)].append(lab_test)

for lab_tests in by_key.values():
save_blood_culture_isolate(patient, lab_tests)
save_blood_culture_isolates(patient, lab_test)


class Command(BaseCommand):
def handle(self, *args, **options):
for patient in Patient.objects.all():
if not patient.bloodcultureisolate_set.exists():
if not patient.bloodcultureset_set.exists():
sync_blood_cultures(patient)

0 comments on commit 3876116

Please sign in to comment.