diff --git a/smash/web/api_views/subject.py b/smash/web/api_views/subject.py index 3e136b4fe318957214da6817aa0effcade0770cb..541af4a22fb8ad8c0a00a52282b40596911eb579 100644 --- a/smash/web/api_views/subject.py +++ b/smash/web/api_views/subject.py @@ -1,5 +1,5 @@ import logging - +import re from django.db.models import Count, Case, When, Min, Max from django.db.models import Q from django.http import JsonResponse @@ -215,56 +215,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 order_column == "virus_test_1_collection_date": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_1_collection_date') - elif order_column == "virus_test_2_collection_date": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_2_collection_date') - elif order_column == "virus_test_3_collection_date": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_3_collection_date') - elif order_column == "virus_test_4_collection_date": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_4_collection_date') - elif order_column == "virus_test_5_collection_date": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_5_collection_date') - elif order_column == "virus_test_1_iga_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_1_iga_status') - elif order_column == "virus_test_1_igg_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_1_igg_status') - elif order_column == "virus_test_2_iga_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_2_iga_status') - elif order_column == "virus_test_2_igg_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_2_igg_status') - elif order_column == "virus_test_3_iga_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_3_iga_status') - elif order_column == "virus_test_3_igg_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_3_igg_status') - elif order_column == "virus_test_4_iga_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_4_iga_status') - elif order_column == "virus_test_4_igg_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_4_igg_status') - elif order_column == "virus_test_5_iga_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_5_iga_status') - elif order_column == "virus_test_5_igg_status": - result = subjects_to_be_ordered.order_by(order_direction + 'virus_test_5_igg_status') + 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 diff --git a/smash/web/tests/api_views/test_subject.py b/smash/web/tests/api_views/test_subject.py index ddeb5c05cc80adc41b508dbc58a403f5c3f51082..fa26b907197d76b7bca544169553c5d3260d6f73 100644 --- a/smash/web/tests/api_views/test_subject.py +++ b/smash/web/tests/api_views/test_subject.py @@ -5,8 +5,9 @@ import logging from django.urls import reverse -from web.api_views.subject import get_subjects_order, get_subjects_filtered, serialize_subject -from web.models import StudySubject, Appointment, Study, Worker +from web.api_views.subject import get_subjects_order, get_subjects_filtered, serialize_subject, get_subject_columns +from web.importer.warning_counter import MsgCounterHandler +from web.models import StudySubject, Appointment, Study, Worker, SubjectColumns, StudyColumns from web.models.constants import GLOBAL_STUDY_ID, SUBJECT_TYPE_CHOICES_PATIENT, SUBJECT_TYPE_CHOICES_CONTROL from web.models.study_subject_list import SUBJECT_LIST_GENERIC, SUBJECT_LIST_NO_VISIT, SUBJECT_LIST_REQUIRE_CONTACT, \ StudySubjectList, SUBJECT_LIST_VOUCHER_EXPIRY @@ -22,6 +23,16 @@ class TestSubjectApi(LoggedInWithWorkerTestCase): def setUp(self): super(TestSubjectApi, self).setUp() self.study_subject = create_study_subject() + self.warning_counter = MsgCounterHandler() + logging.getLogger('').addHandler(self.warning_counter) + + def tearDown(self): + logging.getLogger('').removeHandler(self.warning_counter) + + def get_warning_count(self): + if "WARNING" in self.warning_counter.level2count: + return self.warning_counter.level2count["WARNING"] + return 0 def test_cities(self): city_name = "some city" @@ -156,9 +167,9 @@ class TestSubjectApi(LoggedInWithWorkerTestCase): def check_subject_ordered(self, order, result): subjects = get_subjects_order(StudySubject.objects.all(), order, "asc") - if isinstance(subjects, list): #sort by screening_number returns a list instead of a queryset + if isinstance(subjects, list): # sort by screening_number returns a list instead of a queryset self.assertEqual(len(result), len(subjects)) - else: + else: self.assertEqual(len(result), subjects.count()) for index in range(len(result)): self.assertEqual(result[index], subjects[index]) @@ -167,7 +178,7 @@ class TestSubjectApi(LoggedInWithWorkerTestCase): length = len(result) if isinstance(subjects, list): self.assertEqual(len(result), len(subjects)) - else: + else: self.assertEqual(len(result), subjects.count()) for index in range(length): self.assertEqual(result[length - index - 1], subjects[index]) @@ -641,3 +652,33 @@ class TestSubjectApi(LoggedInWithWorkerTestCase): self.check_subject_filtered([["social_security_number", "12"]], [self.study_subject]) self.check_subject_filtered([["social_security_number", "unknown"]], []) + + def test_get_subject_order_for_columns(self): + study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0] + list = StudySubjectList.objects.create(study=study, type="custom", + visible_subject_columns=SubjectColumns.objects.create(), + visible_subject_study_columns=StudyColumns.objects.create()) + for key in vars(list.visible_subject_columns): + if getattr(list.visible_subject_columns, key) == False: + setattr(list.visible_subject_columns, key, True) + list.visible_subject_columns.save() + + for key in vars(list.visible_subject_study_columns): + if getattr(list.visible_subject_study_columns, key) == False: + setattr(list.visible_subject_study_columns, key, True) + list.visible_subject_study_columns.save() + + for key in vars(study.columns): + if getattr(study.columns, key) == False: + setattr(study.columns, key, True) + study.columns.save() + + available_columns = get_subject_columns(None, "custom") + + temp = str(available_columns.content) + columns = json.loads(temp)['columns'] + for row in columns: + if row['sortable']: + order = row['type'] + get_subjects_order(StudySubject.objects.none(), order, "asc") + self.assertEqual(self.get_warning_count(), 0, msg="Sorting by \"" + order + "\" does not work")