diff --git a/crc/scripts/study_sponsors.py b/crc/scripts/study_sponsors.py
new file mode 100644
index 00000000..90231472
--- /dev/null
+++ b/crc/scripts/study_sponsors.py
@@ -0,0 +1,70 @@
+import json
+
+from crc.api.common import ApiError
+from crc.scripts.script import Script
+from crc.services.protocol_builder import ProtocolBuilderService
+
+
+class StudySponsors(Script):
+ """Please see the detailed description that is provided below. """
+
+ pb = ProtocolBuilderService()
+
+ # This is used for test/workflow validation, as well as documentation.
+ example_data = [
+ {
+ "COMMONRULEAGENCY": None,
+ "SPONSOR_ID": 2453,
+ "SP_NAME": "Abbott Ltd",
+ "SP_TYPE": "Private",
+ "SP_TYPE_GROUP_NAME": None,
+ "SS_STUDY": 2
+ },
+ {
+ "COMMONRULEAGENCY": None,
+ "SPONSOR_ID": 2387,
+ "SP_NAME": "Abbott-Price",
+ "SP_TYPE": "Incoming Sub Award",
+ "SP_TYPE_GROUP_NAME": "Government",
+ "SS_STUDY": 2
+ },
+ {
+ "COMMONRULEAGENCY": None,
+ "SPONSOR_ID": 1996,
+ "SP_NAME": "Abernathy-Heidenreich",
+ "SP_TYPE": "Foundation/Not for Profit",
+ "SP_TYPE_GROUP_NAME": "Other External Funding",
+ "SS_STUDY": 2
+ }
+ ]
+
+ def example_to_string(self, key):
+ return json.dumps(self.example_data['StudyInfo'][key], indent=2, separators=(',', ': '))
+
+ def get_description(self):
+ return ""
+# return """
+# Returns a list of sponsors related to a study in the following format:
+# {{example}}
+#z """.format(example=json.dumps(self.example_data, index=2, separators=(',', ': ')))
+
+ def check_args(self, args):
+ if len(args) > 0:
+ raise ApiError(code="invalid_argument",
+ message="The Sponsor script does not take any arguments. "
+ "It returns the list of sponsors for the current study only. ")
+
+ def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs):
+ """For validation only, pretend no results come back from pb"""
+ self.check_args(args)
+ return self.example_data
+
+ def do_task(self, task, study_id, workflow_id, *args, **kwargs):
+ self.check_args(args)
+ retval = ProtocolBuilderService.get_sponsors(study_id)
+ # Check on returning box, as in return Box(retval) - may not work with list.
+ return retval
+
+
+
+
diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py
index f4984435..c61ef1b4 100644
--- a/crc/services/protocol_builder.py
+++ b/crc/services/protocol_builder.py
@@ -13,6 +13,7 @@ class ProtocolBuilderService(object):
INVESTIGATOR_URL = app.config['PB_INVESTIGATORS_URL']
REQUIRED_DOCS_URL = app.config['PB_REQUIRED_DOCS_URL']
STUDY_DETAILS_URL = app.config['PB_STUDY_DETAILS_URL']
+ SPONSORS_URL = app.config['PB_STUDY_DETAILS_URL']
@staticmethod
def is_enabled():
@@ -54,6 +55,10 @@ class ProtocolBuilderService(object):
def get_study_details(study_id) -> {}:
return ProtocolBuilderService.__make_request(study_id, ProtocolBuilderService.STUDY_DETAILS_URL)
+ @staticmethod
+ def get_sponsors(study_id) -> {}:
+ return ProtocolBuilderService.__make_request(study_id, ProtocolBuilderService.SPONSORS_URL)
+
@staticmethod
def __enabled_or_raise():
if not ProtocolBuilderService.is_enabled():
diff --git a/tests/data/pb_responses/sponsors.json b/tests/data/pb_responses/sponsors.json
new file mode 100644
index 00000000..964847c6
--- /dev/null
+++ b/tests/data/pb_responses/sponsors.json
@@ -0,0 +1,26 @@
+[
+ {
+ "COMMONRULEAGENCY": null,
+ "SPONSOR_ID": 2453,
+ "SP_NAME": "Abbott Ltd",
+ "SP_TYPE": "Private",
+ "SP_TYPE_GROUP_NAME": null,
+ "SS_STUDY": 2
+ },
+ {
+ "COMMONRULEAGENCY": null,
+ "SPONSOR_ID": 2387,
+ "SP_NAME": "Abbott-Price",
+ "SP_TYPE": "Incoming Sub Award",
+ "SP_TYPE_GROUP_NAME": "Government",
+ "SS_STUDY": 2
+ },
+ {
+ "COMMONRULEAGENCY": null,
+ "SPONSOR_ID": 1996,
+ "SP_NAME": "Abernathy-Heidenreich",
+ "SP_TYPE": "Foundation/Not for Profit",
+ "SP_TYPE_GROUP_NAME": "Other External Funding",
+ "SS_STUDY": 2
+ }
+]
\ No newline at end of file
diff --git a/tests/data/study_sponsors.bpmn b/tests/data/study_sponsors.bpmn
new file mode 100644
index 00000000..966ca8ea
--- /dev/null
+++ b/tests/data/study_sponsors.bpmn
@@ -0,0 +1,39 @@
+
+
+
+
+ SequenceFlow_1nfe5m9
+
+
+
+
+
+ SequenceFlow_1bqiin0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/study_sponsors/study_sponsors.bpmn b/tests/data/study_sponsors/study_sponsors.bpmn
new file mode 100644
index 00000000..966ca8ea
--- /dev/null
+++ b/tests/data/study_sponsors/study_sponsors.bpmn
@@ -0,0 +1,39 @@
+
+
+
+
+ SequenceFlow_1nfe5m9
+
+
+
+
+
+ SequenceFlow_1bqiin0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/study/test_study_sponsors_script.py b/tests/study/test_study_sponsors_script.py
new file mode 100644
index 00000000..d9efd5d6
--- /dev/null
+++ b/tests/study/test_study_sponsors_script.py
@@ -0,0 +1,39 @@
+from unittest.mock import patch
+
+from tests.base_test import BaseTest
+
+from crc import session, app
+from crc.models.study import StudyModel
+from crc.scripts.study_sponsors import StudySponsors
+from crc.services.study_service import StudyService
+from crc.services.workflow_processor import WorkflowProcessor
+from crc.services.workflow_service import WorkflowService
+
+class TestSudySponsorsScript(BaseTest):
+ test_uid = "dhf8r"
+ test_study_id = 1
+
+ def test_study_sponsors_script_validation(self):
+ self.load_test_spec("study_sponsors")
+ WorkflowService.test_spec("study_sponsors") # This would raise errors if it didn't validate
+
+
+ @patch('crc.services.protocol_builder.requests.get')
+ def test_study_sponsors_script(self, mock_get):
+
+ mock_get.return_value.ok = True
+ mock_get.return_value.text = self.protocol_builder_response('sponsors.json')
+ app.config['PB_ENABLED'] = True
+
+ self.load_example_data()
+ self.create_reference_document()
+ study = session.query(StudyModel).first()
+ workflow_spec_model = self.load_test_spec("study_sponsors")
+ workflow_model = StudyService._create_workflow_model(study, workflow_spec_model)
+ WorkflowService.test_spec("study_sponsors")
+ processor = WorkflowProcessor(workflow_model)
+ processor.do_engine_steps()
+ self.assertTrue(processor.bpmn_workflow.is_completed())
+ data = processor.next_task().data
+ self.assertIn('sponsors', data)
+ self.assertEquals(3, len(data['sponsors']))