Skip to content
Snippets Groups Projects

Resolve "import of serology data"

Merged Piotr Gawron requested to merge 335-import-of-serology-data into master
1 file
+ 28
44
Compare changes
  • Side-by-side
  • Inline
import logging
import re
from django.db.models import Count, Case, When, Min, Max
from django.db.models import Q
@@ -81,33 +82,48 @@ def get_subject_columns(request, subject_list_type):
add_column(result, "Info sent", "information_sent", study_subject_columns, "yes_no_filter", study.columns)
visit_from_zero = ConfigurationItem.objects.get(type=VISIT_SHOW_VISIT_NUMBER_FROM_ZERO).value
#True values are y, yes, t, true, on and 1; false values are n, no, f, false, off and 0.
# True values are y, yes, t, true, on and 1; false values are n, no, f, false, off and 0.
if strtobool(visit_from_zero):
virus_visit_numbers = range(0, 5)
visit_numbers = range(0, study.visits_to_show_in_subject_list + 0)
else:
virus_visit_numbers = range(1, 5+1)
virus_visit_numbers = range(1, 5 + 1)
visit_numbers = range(1, study.visits_to_show_in_subject_list + 1)
for one_based_idx, virus_visit_number in enumerate(virus_visit_numbers, 1):
add_column(result,
'Virus {} RT-PCR'.format(virus_visit_number),
'virus_test_{}'.format(one_based_idx), #always starts in 1
study_subject_columns,
'yes_no_null_inconclusive_filter', study.columns)
add_column(result,
"Visit {} RT-PCR date".format(virus_visit_number),
"virus_test_{}_updated".format(one_based_idx),
add_column(result,
'Virus {} RT-PCR'.format(virus_visit_number),
'virus_test_{}'.format(one_based_idx), # always starts in 1
study_subject_columns,
'yes_no_null_inconclusive_filter', study.columns)
add_column(result,
"Visit {} RT-PCR update date".format(virus_visit_number),
"virus_test_{}_updated".format(one_based_idx),
study_subject_columns,
"virus_test_date", study.columns)
add_column(result,
"Visit {} RT-PCR collection date".format(virus_visit_number),
"virus_test_{}_collection_date".format(one_based_idx),
study_subject_columns,
"virus_test_date", study.columns)
add_column(result,
"Visit {} IgA Status".format(virus_visit_number),
"virus_test_{}_iga_status".format(one_based_idx),
study_subject_columns,
'serology_filter', study.columns)
add_column(result,
"Visit {} IgG Status".format(virus_visit_number),
"virus_test_{}_igg_status".format(one_based_idx),
study_subject_columns,
'serology_filter', study.columns)
add_column(result, "Type", "type", study_subject_columns, "type_filter", study.columns)
add_column(result, "Edit", "edit", None, None, sortable=False)
for one_based_idx, visit_number in enumerate(visit_numbers, 1):
visit_key = "visit_{}".format(one_based_idx) #always starts in 1
add_column(result, "Visit {}".format(visit_number), visit_key, None,
"visit_filter", visible_param=study_subject_list.visits)
visit_key = "visit_{}".format(one_based_idx) # always starts in 1
add_column(result, "Visit {}".format(visit_number), visit_key, None,
"visit_filter", visible_param=study_subject_list.visits)
return JsonResponse({"columns": result})
@@ -137,7 +153,9 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction, co
order_direction = ""
else:
order_direction = "-"
if order_column == "first_name":
if order_column is None:
logger.warn("Column cannot be null")
elif order_column == "first_name":
result = subjects_to_be_ordered.order_by(order_direction + 'subject__first_name')
elif order_column == "last_name":
result = subjects_to_be_ordered.order_by(order_direction + 'subject__last_name')
@@ -200,26 +218,16 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction, co
elif str(order_column).startswith("visit_"):
visit_number = get_visit_number_from_visit_x_string(order_column)
result = order_by_visit(subjects_to_be_ordered, order_direction, visit_number)
elif order_column == "virus_test_1":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_1')
elif order_column == "virus_test_2":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_2')
elif order_column == "virus_test_3":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_3')
elif order_column == "virus_test_4":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_4')
elif order_column == "virus_test_5":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_5')
elif order_column == "virus_test_1_updated":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_1_updated')
elif order_column == "virus_test_2_updated":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_2_updated')
elif order_column == "virus_test_3_updated":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_3_updated')
elif order_column == "virus_test_4_updated":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_4_updated')
elif order_column == "virus_test_5_updated":
result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_5_updated')
elif re.search(r'^virus_test_[1-5]$', order_column):
result = subjects_to_be_ordered.order_by(order_direction + order_column)
elif re.search(r'^virus_test_[1-5]_updated$', order_column):
result = subjects_to_be_ordered.order_by(order_direction + order_column)
elif re.search(r'^virus_test_[1-5]_collection_date', order_column):
result = subjects_to_be_ordered.order_by(order_direction + order_column)
elif re.search(r'^virus_test_[1-5]_iga_status', order_column):
result = subjects_to_be_ordered.order_by(order_direction + order_column)
elif re.search(r'^virus_test_[1-5]_igg_status', order_column):
result = subjects_to_be_ordered.order_by(order_direction + order_column)
else:
logger.warn("Unknown sort column: " + str(order_column))
return result
@@ -295,7 +303,9 @@ def get_subjects_filtered(subjects_to_be_filtered, filters):
for row in filters:
column = row[0]
value = row[1]
if column == "first_name":
if column is None:
logger.warn("Filter column cannot be null")
elif column == "first_name":
result = result.filter(subject__first_name__icontains=value)
elif column == "last_name":
result = result.filter(subject__last_name__icontains=value)
@@ -319,41 +329,25 @@ def get_subjects_filtered(subjects_to_be_filtered, filters):
result = result.filter(resigned=(value == "true"))
elif column == "endpoint_reached":
result = result.filter(endpoint_reached=(value == "true"))
elif column == "virus_test_1":
if value == "null":
result = result.filter(virus_test_1__isnull=True, virus_test_1_updated__isnull=True)
elif value == "inconclusive":
result = result.filter(virus_test_1__isnull=True, virus_test_1_updated__isnull=False)
else:
result = result.filter(virus_test_1=(value == "true"))
elif column == "virus_test_2":
if value == "null":
result = result.filter(virus_test_2__isnull=True, virus_test_2_updated__isnull=True)
elif value == "inconclusive":
result = result.filter(virus_test_2__isnull=True, virus_test_2_updated__isnull=False)
else:
result = result.filter(virus_test_2=(value == "true"))
elif column == "virus_test_3":
if value == "null":
result = result.filter(virus_test_3__isnull=True, virus_test_3_updated__isnull=True)
elif value == "inconclusive":
result = result.filter(virus_test_3__isnull=True, virus_test_3_updated__isnull=False)
else:
result = result.filter(virus_test_3=(value == "true"))
elif column == "virus_test_4":
if value == "null":
result = result.filter(virus_test_4__isnull=True, virus_test_4_updated__isnull=True)
elif value == "inconclusive":
result = result.filter(virus_test_4__isnull=True, virus_test_4_updated__isnull=False)
else:
result = result.filter(virus_test_4=(value == "true"))
elif column == "virus_test_5":
elif re.search(r'^virus_test_[1-5]$', column):
visit_number = column.replace("virus_test_", "")
virus_test__isnull_param = "virus_test_{}__isnull".format(visit_number)
virus_test__updated__isnull_param = "virus_test_{}_updated__isnull".format(visit_number)
visit_test_param = "virus_test_{}".format(visit_number)
if value == "null":
result = result.filter(virus_test_5__isnull=True, virus_test_5_updated__isnull=True)
result = result.filter(**{virus_test__isnull_param: True, virus_test__updated__isnull_param: True})
elif value == "inconclusive":
result = result.filter(virus_test_5__isnull=True, virus_test_5_updated__isnull=False)
result = result.filter(**{virus_test__isnull_param: True, virus_test__updated__isnull_param: False})
else:
result = result.filter(virus_test_5=(value == "true"))
result = result.filter(**{visit_test_param: (value == "true")})
elif re.search(r'^virus_test_[1-5]_iga_status$', column):
visit_number = column.replace("virus_test_", "").replace("_iga_status", "")
virus_test_iga_status_param = "virus_test_{}_iga_status".format(visit_number)
result = result.filter(**{virus_test_iga_status_param: value})
elif re.search(r'^virus_test_[1-5]_igg_status$', column):
visit_number = column.replace("virus_test_", "").replace("_igg_status", "")
virus_test_igg_status_param = "virus_test_{}_igg_status".format(visit_number)
result = result.filter(**{virus_test_igg_status_param: value})
elif column == "brain_donation_agreement":
result = result.filter(brain_donation_agreement=(value == "true"))
elif column == "postponed":
@@ -519,16 +513,6 @@ def serialize_subject(study_subject):
"dead": bool_to_yes_no(study_subject.subject.dead),
"resigned": bool_to_yes_no(study_subject.resigned),
"endpoint_reached": bool_to_yes_no(study_subject.endpoint_reached),
"virus_test_1": virus_test_to_str(study_subject.virus_test_1, study_subject.virus_test_1_updated),
"virus_test_2": virus_test_to_str(study_subject.virus_test_2, study_subject.virus_test_2_updated),
"virus_test_3": virus_test_to_str(study_subject.virus_test_3, study_subject.virus_test_3_updated),
"virus_test_4": virus_test_to_str(study_subject.virus_test_4, study_subject.virus_test_4_updated),
"virus_test_5": virus_test_to_str(study_subject.virus_test_5, study_subject.virus_test_5_updated),
"virus_test_1_updated": study_subject.virus_test_1_updated,
"virus_test_2_updated": study_subject.virus_test_2_updated,
"virus_test_3_updated": study_subject.virus_test_3_updated,
"virus_test_4_updated": study_subject.virus_test_4_updated,
"virus_test_5_updated": study_subject.virus_test_5_updated,
"postponed": bool_to_yes_no(study_subject.postponed),
"brain_donation_agreement": bool_to_yes_no(study_subject.brain_donation_agreement),
"excluded": bool_to_yes_no(study_subject.excluded),
@@ -540,4 +524,12 @@ def serialize_subject(study_subject):
"id": study_subject.id,
"visits": serialized_visits,
}
for i in range(1, 6):
result['virus_test_{}'.format(i)] = virus_test_to_str(getattr(study_subject, "virus_test_{}".format(i)),
getattr(study_subject, "virus_test_{}_updated".format(i)))
result["virus_test_{}_updated".format(i)] = getattr(study_subject, "virus_test_{}_updated".format(i))
result["virus_test_{}_collection_date".format(i)] = getattr(study_subject,
"virus_test_{}_collection_date".format(i))
result["virus_test_{}_iga_status".format(i)] = getattr(study_subject, "virus_test_{}_iga_status".format(i))
result["virus_test_{}_igg_status".format(i)] = getattr(study_subject, "virus_test_{}_igg_status".format(i))
return result
Loading