diff --git a/crc/scripts/get_study_associates.py b/crc/scripts/get_study_associates.py index 4aca255f..674f1600 100644 --- a/crc/scripts/get_study_associates.py +++ b/crc/scripts/get_study_associates.py @@ -1,4 +1,3 @@ -from crc.api.common import ApiError from crc.models.study import StudyAssociatedSchema from crc.scripts.script import Script from crc.services.study_service import StudyService @@ -6,12 +5,6 @@ from crc.services.study_service import StudyService class GetStudyAssociates(Script): - argument_error_message = "You must supply at least one argument to the " \ - "update_study_associates task, an array of objects in the form " \ - "{'uid':'someid', 'role': 'text', 'send_email: 'boolean', " \ - "'access':'boolean'} " - - def get_description(self): return """Returns all people associated with the study - Will always return the study owner as assocated example : get_study_associates() => [{'uid':'sbp3ey','role':'Unicorn Herder', 'send_email': False, 'access':True}] @@ -19,33 +12,45 @@ example : get_study_associates() => [{'uid':'sbp3ey','role':'Unicorn Herder', 's """ def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs): - study_associates = [ - {'uid': 'dhf8r', 'role': 'Chief Bee Keeper', 'send_email': True, 'access': True, - 'ldap_info': { - 'uid': 'dhf8r', - 'display_name': "Dan Funk", + if study_id: + return self.do_task(task, study_id, workflow_id, args, kwargs) + else: + study_associates = [ + {'uid': 'dhf8r', 'role': 'Department Chair', 'send_email': True, 'access': True, + 'ldap_info': { + 'uid': 'dhf8r', + 'display_name': "Dan Funk", + 'email_address': 'dhf8r@virginia.edu', + 'telephone_number': '', + 'title': '', + 'department': '', + 'affiliation': '', + 'sponsor_type': '', + }}, + {'uid': 'lb3dp', 'role': 'Primary Investigator', 'send_email': True, 'access': True, + 'ldap_info': { + 'uid': 'dhf8r', + 'display_name': "Dan Funk", 'email_address': 'dhf8r@virginia.edu', 'telephone_number': '', 'title': '', 'department': '', 'affiliation': '', - 'sponsor_type': '', - }}, - {'uid': 'lb3dp', 'role': 'Chief Cat Herder', 'send_email': True, 'access': True, - 'ldap_info': { - 'uid': 'dhf8r', - 'display_name': "Dan Funk", - 'email_address': 'dhf8r@virginia.edu', - 'telephone_number': '', - 'title': '', - 'department': '', - 'affiliation': '', - 'sponsor_type': '' - }}, - ] - return study_associates + 'sponsor_type': '' + }}, + {'uid': 'lb3dp', 'role': 'Study Coordinator I', 'send_email': True, 'access': True, + 'ldap_info': { + 'uid': 'dhf8r', + 'display_name': "Dan Funk", + 'email_address': 'dhf8r@virginia.edu', + 'telephone_number': '', + 'title': '', + 'department': '', + 'affiliation': '', + 'sponsor_type': '' + }}, + ] + return study_associates def do_task(self, task, study_id, workflow_id, *args, **kwargs): return StudyAssociatedSchema(many=True).dump(StudyService.get_study_associates(study_id)) - - diff --git a/tests/data/study_associates_validation/study_associates_validation.bpmn b/tests/data/study_associates_validation/study_associates_validation.bpmn new file mode 100644 index 00000000..54dff5c9 --- /dev/null +++ b/tests/data/study_associates_validation/study_associates_validation.bpmn @@ -0,0 +1,116 @@ + + + + + Flow_14snzg4 + + + + Flow_0h4fy1y + Flow_1n8quj6 + # Get List of Associates +assoc_list = get_study_associates() + +# Get Associates by Role +# Roles: "Primary Investigator", "Department Chair", "Study Coordinator I", "Study Coordinator II", "IRB Coordinator", "Department Contact", "Sub Investigator", "Additional Study Coordinators" +# assoc_role = "Primary Investigator" +if assoc_role_enum == 'pi': + assoc_role = "Primary Investigator" +elif assoc_role_enum == 'dc': + assoc_role = "Department Chair" +elif assoc_role_enum == 'sc_i': + assoc_role = 'Study Coordinator I' + +# Set PI Status initially to "Not Found" +# Update later to "Found" or "New", if appropriate +assoc_info = None +assoc_status = "Not Found" +assoc_cid = "" + +for assoc in assoc_list: + if assoc["role"] == assoc_role: + assoc_info = assoc + assoc_status = "Found" + assoc_cid = assoc_info["uid"] + if assoc_cid != study_data_get("sdsPI_ComputingID", False): + assoc_status = "New" + + + + + Flow_0ok145v + + + + ## Associates + +{{ assoc_list }} + + +## Assoc Role +{{ assoc_role }} + + +## Assoc Status +{{ assoc_status }} + + +## Assoc Info +{{ assoc_info }} + Flow_1n8quj6 + Flow_0ok145v + + + + + + + + + + + + + + + + Flow_14snzg4 + Flow_0h4fy1y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/scripts/test_get_study_associates_validation.py b/tests/scripts/test_get_study_associates_validation.py new file mode 100644 index 00000000..3cc63651 --- /dev/null +++ b/tests/scripts/test_get_study_associates_validation.py @@ -0,0 +1,84 @@ +from tests.base_test import BaseTest + +from crc import session +from crc.models.ldap import LdapModel +from crc.models.study import StudyAssociated +from crc.services.workflow_service import WorkflowService + + +class TestStudyAssociatesValidation(BaseTest): + + @staticmethod + def add_study_associated(workflow): + ldap_model = session.query(LdapModel).first() + study_associated = StudyAssociated(study_id=workflow.study_id, + uid=ldap_model.uid, + role='Department Chair', + send_email=True, + access=True, + ldap_info=ldap_model) + session.add(study_associated) + study_associated = StudyAssociated(study_id=workflow.study_id, + uid=ldap_model.uid, + role='Primary Investigator', + send_email=True, + access=True, + ldap_info=ldap_model) + session.add(study_associated) + study_associated = StudyAssociated(study_id=workflow.study_id, + uid=ldap_model.uid, + role='Study Coordinator I', + send_email=True, + access=True, + ldap_info=ldap_model) + session.add(study_associated) + session.commit() + + def test_study_associates_validation_with_study_id(self): + self.load_test_spec('empty_workflow', master_spec=True) + self.create_reference_document() + workflow = self.create_workflow('study_associates_validation') + self.add_study_associated(workflow) + rv = self.app.get('/v1.0/workflow-specification/%s/validate?study_id=%i' % (workflow.workflow_spec_id, workflow.study_id), + headers=self.logged_in_headers()) + self.assertEqual(0, len(rv.json)) + + def test_study_associates_validation_without_study_id(self): + self.load_test_spec('empty_workflow', master_spec=True) + self.create_reference_document() + workflow = self.create_workflow('study_associates_validation') + self.add_study_associated(workflow) + rv = self.app.get('/v1.0/workflow-specification/%s/validate' % workflow.workflow_spec_id, + headers=self.logged_in_headers()) + self.assertEqual(0, len(rv.json)) + + def test_study_associates_test_spec_with_study(self): + # call test_spec directly so we can see what the script actually returns + self.load_test_spec('empty_workflow', master_spec=True) + self.create_reference_document() + workflow = self.create_workflow('study_associates_validation') + self.add_study_associated(workflow) + result = WorkflowService.test_spec('study_associates_validation', validate_study_id=workflow.study_id) + + # assert we get information we added with add_study_associated + self.assertIsInstance(result['assoc_info'], dict) + self.assertEqual('New', result['assoc_status']) + self.assertEqual(4, len(result['assoc_list'])) + self.assertEqual(result['assoc_role'], result['assoc_info']['role']) + self.assertIn(result['assoc_role'], ['Department Chair', 'Primary Investigator', 'Study Coordinator I']) + + def test_study_associates_test_spec_no_study(self): + + # call test_spec directly so we can see what the script actually returns + self.load_test_spec('empty_workflow', master_spec=True) + self.create_reference_document() + workflow = self.create_workflow('study_associates_validation') + self.add_study_associated(workflow) + result = WorkflowService.test_spec('study_associates_validation') + + # assert we get mock information + self.assertIn(result['assoc_role_enum'], ['pi', 'dc', 'sc_i']) + self.assertIsNone(result['assoc_info']) + self.assertEqual('Not Found', result['assoc_status']) + self.assertEqual('test', result['assoc_list'][0]['uid']) + self.assertEqual('owner', result['assoc_list'][0]['role'])