Skip to content
Snippets Groups Projects
Commit 6060c7b1 authored by Carlos Vega's avatar Carlos Vega
Browse files

Issue #207 . Added custom sorting for screening field in study subject based...

Issue #207 . Added custom sorting for screening field in study subject based on the filter introduced in the column. Multivalues are re-sorted
parent f6f32d46
No related branches found
No related tags found
1 merge request!169Enhancement/subject table changes
Pipeline #6592 passed
...@@ -97,7 +97,7 @@ def order_by_visit(subjects_to_be_ordered, order_direction, visit_number): ...@@ -97,7 +97,7 @@ def order_by_visit(subjects_to_be_ordered, order_direction, visit_number):
order_direction + 'sort_visit_date') order_direction + 'sort_visit_date')
def get_subjects_order(subjects_to_be_ordered, order_column, order_direction): def get_subjects_order(subjects_to_be_ordered, order_column, order_direction, column_filters={}):
result = subjects_to_be_ordered result = subjects_to_be_ordered
if order_direction == "asc": if order_direction == "asc":
order_direction = "" order_direction = ""
...@@ -112,7 +112,11 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction): ...@@ -112,7 +112,11 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction):
elif order_column == "referral": elif order_column == "referral":
result = subjects_to_be_ordered.order_by(order_direction + 'referral') result = subjects_to_be_ordered.order_by(order_direction + 'referral')
elif order_column == "screening_number": elif order_column == "screening_number":
result = subjects_to_be_ordered.order_by(order_direction + 'screening_number') if u'screening_number' not in column_filters:
result = subjects_to_be_ordered.order_by(order_direction + 'screening_number')
else:
result = subjects_to_be_ordered.all()
result = sorted(result, key=lambda t: t.sort_matched_screening_first(column_filters[u'screening_number']), reverse = order_direction == '-' )
elif order_column == "default_location": elif order_column == "default_location":
result = subjects_to_be_ordered.order_by(order_direction + 'default_location') result = subjects_to_be_ordered.order_by(order_direction + 'default_location')
elif order_column == "flying_team": elif order_column == "flying_team":
...@@ -284,7 +288,7 @@ def subjects(request, type): ...@@ -284,7 +288,7 @@ def subjects(request, type):
count = all_subjects.count() count = all_subjects.count()
filtered_subjects = get_subjects_filtered(all_subjects, filters) filtered_subjects = get_subjects_filtered(all_subjects, filters)
ordered_subjects = get_subjects_order(filtered_subjects, order_column, order_dir) ordered_subjects = get_subjects_order(filtered_subjects, order_column, order_dir, column_filters=dict(filters))
sliced_subjects = ordered_subjects[start:(start + length)] sliced_subjects = ordered_subjects[start:(start + length)]
result_subjects = sliced_subjects result_subjects = sliced_subjects
......
...@@ -156,6 +156,20 @@ class StudySubject(models.Model): ...@@ -156,6 +156,20 @@ class StudySubject(models.Model):
verbose_name='Resign reason' verbose_name='Resign reason'
) )
def sort_matched_screening_first(self, pattern):
if pattern is None:
return self.screening_number
words = self.screening_number.split(';')
matches, reminder = [], []
for word in words:
if pattern in word:
matches.append(word.strip())
else:
reminder.append(word.strip())
return '; '.join(matches + reminder)
def __str__(self): def __str__(self):
return "%s %s" % (self.subject.first_name, self.subject.last_name) return "%s %s" % (self.subject.first_name, self.subject.last_name)
......
...@@ -197,6 +197,17 @@ def create_study_subject(subject_id=1, subject=None): ...@@ -197,6 +197,17 @@ def create_study_subject(subject_id=1, subject=None):
subject=subject subject=subject
) )
def create_study_subject_with_multiple_screening_numbers(subject_id=1, subject=None):
if subject is None:
subject = create_subject()
return StudySubject.objects.create(
default_location=get_test_location(),
type=SUBJECT_TYPE_CHOICES_CONTROL,
screening_number='E-00{}; L-00{}'.format(subject_id, subject_id),
study=get_test_study(),
subject=subject
)
def create_red_cap_subject(): def create_red_cap_subject():
result = RedcapSubject() result = RedcapSubject()
......
...@@ -2,7 +2,7 @@ from django.test import TestCase ...@@ -2,7 +2,7 @@ from django.test import TestCase
from web.models import Appointment from web.models import Appointment
from web.models import Visit from web.models import Visit
from web.tests.functions import create_study_subject, create_appointment from web.tests.functions import create_study_subject, create_appointment, create_study_subject_with_multiple_screening_numbers
from web.tests.functions import create_visit from web.tests.functions import create_visit
...@@ -19,3 +19,20 @@ class SubjectModelTests(TestCase): ...@@ -19,3 +19,20 @@ class SubjectModelTests(TestCase):
self.assertTrue(subject.resigned) self.assertTrue(subject.resigned)
self.assertTrue(visit_finished) self.assertTrue(visit_finished)
self.assertEquals(Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status) self.assertEquals(Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status)
def test_sort_matched_screening_first(self):
subject = create_study_subject_with_multiple_screening_numbers(subject_id=1)
self.assertEqual(subject.sort_matched_screening_first('L'), 'L-00{}; E-00{}'.format(1, 1))
self.assertEqual(subject.sort_matched_screening_first('L-00'), 'L-00{}; E-00{}'.format(1, 1))
self.assertEqual(subject.sort_matched_screening_first('E'), 'E-00{}; L-00{}'.format(1, 1))
self.assertEqual(subject.sort_matched_screening_first('-'), 'E-00{}; L-00{}'.format(1, 1))
self.assertEqual(subject.sort_matched_screening_first(''), 'E-00{}; L-00{}'.format(1, 1))
self.assertEqual(subject.sort_matched_screening_first('001'), 'E-00{}; L-00{}'.format(1, 1))
self.assertEqual(subject.sort_matched_screening_first('00'), 'E-00{}; L-00{}'.format(1, 1))
self.assertEqual(subject.sort_matched_screening_first('potato'), 'E-00{}; L-00{}'.format(1, 1))
subject = create_study_subject(subject_id=1)
self.assertEqual(subject.sort_matched_screening_first('pi'), "piotr's number" + str(1))
self.assertEqual(subject.sort_matched_screening_first(''), "piotr's number" + str(1))
self.assertEqual(subject.sort_matched_screening_first('potato'), "piotr's number" + str(1))
self.assertEqual(subject.sort_matched_screening_first('num'), "piotr's number" + str(1))
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment