There may be multiple investigators of the same type that come back from the protocol builder, adding some tests and additional code to handle this, but still keep the list flat, currently appends a number to the investigator type when there is more than one.
This commit is contained in:
parent
bb4000ff6d
commit
6a79fb3581
|
@ -1,3 +1,4 @@
|
|||
from copy import copy
|
||||
from datetime import datetime
|
||||
import json
|
||||
from typing import List
|
||||
|
@ -185,6 +186,7 @@ class StudyService(object):
|
|||
|
||||
@staticmethod
|
||||
def get_investigators(study_id, all=False):
|
||||
"""Convert array of investigators from protocol builder into a dictionary keyed on the type. """
|
||||
|
||||
# Loop through all known investigator types as set in the reference file
|
||||
inv_dictionary = FileService.get_reference_data(FileService.INVESTIGATOR_LIST, 'code')
|
||||
|
@ -192,18 +194,26 @@ class StudyService(object):
|
|||
# Get PB required docs
|
||||
pb_investigators = ProtocolBuilderService.get_investigators(study_id=study_id)
|
||||
|
||||
"""Convert array of investigators from protocol builder into a dictionary keyed on the type"""
|
||||
# It is possible for the same type to show up more than once in some circumstances, in those events
|
||||
# append a counter to the name.
|
||||
investigators = {}
|
||||
for i_type in inv_dictionary:
|
||||
pb_data = next((item for item in pb_investigators if item['INVESTIGATORTYPE'] == i_type), None)
|
||||
if pb_data:
|
||||
inv_dictionary[i_type]['user_id'] = pb_data["NETBADGEID"]
|
||||
inv_dictionary[i_type].update(StudyService.get_ldap_dict_if_available(pb_data["NETBADGEID"]))
|
||||
else:
|
||||
inv_dictionary[i_type]['user_id'] = None
|
||||
|
||||
pb_data_entries = list(item for item in pb_investigators if item['INVESTIGATORTYPE'] == i_type)
|
||||
entry_count = 0
|
||||
investigators[i_type] = copy(inv_dictionary[i_type])
|
||||
investigators[i_type]['user_id'] = None
|
||||
for pb_data in pb_data_entries:
|
||||
entry_count += 1
|
||||
if entry_count == 1:
|
||||
t = i_type
|
||||
else:
|
||||
t = i_type + "_" + str(entry_count)
|
||||
investigators[t] = copy(inv_dictionary[i_type])
|
||||
investigators[t]['user_id'] = pb_data["NETBADGEID"]
|
||||
investigators[t].update(StudyService.get_ldap_dict_if_available(pb_data["NETBADGEID"]))
|
||||
if not all:
|
||||
inv_dictionary = dict(filter(lambda elem: elem[1]['user_id'] is not None, inv_dictionary.items()))
|
||||
return inv_dictionary
|
||||
investigators = dict(filter(lambda elem: elem[1]['user_id'] is not None, investigators.items()))
|
||||
return investigators
|
||||
|
||||
@staticmethod
|
||||
def get_ldap_dict_if_available(user_id):
|
||||
|
|
|
@ -13,5 +13,15 @@
|
|||
"INVESTIGATORTYPE": "PI",
|
||||
"INVESTIGATORTYPEFULL": "Primary Investigator",
|
||||
"NETBADGEID": "dhf8r"
|
||||
},
|
||||
{
|
||||
"INVESTIGATORTYPE": "SI",
|
||||
"INVESTIGATORTYPEFULL": "Sub Investigator",
|
||||
"NETBADGEID": "ajl2j"
|
||||
},
|
||||
{
|
||||
"INVESTIGATORTYPE": "SI",
|
||||
"INVESTIGATORTYPEFULL": "Sub Investigator",
|
||||
"NETBADGEID": "cah3us"
|
||||
}
|
||||
]
|
||||
]
|
||||
|
|
|
@ -193,7 +193,7 @@ class TestStudyService(BaseTest):
|
|||
workflow = self.create_workflow('docx') # The workflow really doesnt matter in this case.
|
||||
investigators = StudyService().get_investigators(workflow.study_id, all=True)
|
||||
|
||||
self.assertEqual(9, len(investigators))
|
||||
self.assertEqual(10, len(investigators))
|
||||
|
||||
# dhf8r is in the ldap mock data.
|
||||
self.assertEqual("dhf8r", investigators['PI']['user_id'])
|
||||
|
@ -219,10 +219,14 @@ class TestStudyService(BaseTest):
|
|||
workflow = self.create_workflow('docx') # The workflow really doesnt matter in this case.
|
||||
investigators = StudyService().get_investigators(workflow.study_id, all=False)
|
||||
|
||||
self.assertEqual(3, len(investigators))
|
||||
self.assertEqual(5, len(investigators))
|
||||
|
||||
# dhf8r is in the ldap mock data.
|
||||
self.assertEqual("dhf8r", investigators['PI']['user_id'])
|
||||
self.assertEqual("Dan Funk", investigators['PI']['display_name']) # Data from ldap
|
||||
self.assertEqual("Primary Investigator", investigators['PI']['label']) # Data from xls file.
|
||||
self.assertEqual("Always", investigators['PI']['display']) # Data from xls file.
|
||||
|
||||
# Both Alex and Aaron are SI, and both should be returned.
|
||||
self.assertEqual("ajl2j", investigators['SI']['user_id'])
|
||||
self.assertEqual("cah3us", investigators['SI_2']['user_id'])
|
||||
|
|
|
@ -24,7 +24,7 @@ class TestProtocolBuilder(BaseTest):
|
|||
mock_get.return_value.text = self.protocol_builder_response('investigators.json')
|
||||
response = ProtocolBuilderService.get_investigators(self.test_study_id)
|
||||
self.assertIsNotNone(response)
|
||||
self.assertEqual(3, len(response))
|
||||
self.assertEqual(5, len(response))
|
||||
self.assertEqual("DC", response[0]["INVESTIGATORTYPE"])
|
||||
self.assertEqual("Department Contact", response[0]["INVESTIGATORTYPEFULL"])
|
||||
self.assertEqual("asd3v", response[0]["NETBADGEID"])
|
||||
|
|
|
@ -322,7 +322,7 @@ class TestTasksApi(BaseTest):
|
|||
self.assertEqual(4, len(navigation)) # Start task, form_task, multi_task, end task
|
||||
self.assertEqual("UserTask", workflow.next_task.type)
|
||||
self.assertEqual(MultiInstanceType.sequential.value, workflow.next_task.multi_instance_type)
|
||||
self.assertEqual(3, workflow.next_task.multi_instance_count)
|
||||
self.assertEqual(5, workflow.next_task.multi_instance_count)
|
||||
|
||||
# Assure that the names for each task are properly updated, so they aren't all the same.
|
||||
self.assertEqual("Primary Investigator", workflow.next_task.properties['display_name'])
|
||||
|
@ -480,15 +480,15 @@ class TestTasksApi(BaseTest):
|
|||
workflow = self.create_workflow('multi_instance_parallel')
|
||||
|
||||
workflow_api = self.get_workflow_api(workflow)
|
||||
self.assertEqual(6, len(workflow_api.navigation))
|
||||
self.assertEqual(8, len(workflow_api.navigation))
|
||||
ready_items = [nav for nav in workflow_api.navigation if nav['state'] == "READY"]
|
||||
self.assertEqual(3, len(ready_items))
|
||||
self.assertEqual(5, len(ready_items))
|
||||
|
||||
self.assertEqual("UserTask", workflow_api.next_task.type)
|
||||
self.assertEqual("MultiInstanceTask",workflow_api.next_task.name)
|
||||
self.assertEqual("Primary Investigator", workflow_api.next_task.title)
|
||||
|
||||
for i in random.sample(range(3), 3):
|
||||
for i in random.sample(range(5), 5):
|
||||
task = TaskSchema().load(ready_items[i]['task'])
|
||||
rv = self.app.put('/v1.0/workflow/%i/task/%s/set_token' % (workflow.id, task.id),
|
||||
headers=self.logged_in_headers(),
|
||||
|
|
Loading…
Reference in New Issue