Merge branch 'feature/get-user-studies-script' into main

This commit is contained in:
Dan 2023-01-13 13:10:51 -05:00
commit de85af4815
3 changed files with 137 additions and 0 deletions

View File

@ -0,0 +1,24 @@
from crc.api.common import ApiError
from crc.models.protocol_builder import ProtocolBuilderCreatorStudySchema
from crc.scripts.script import Script
from crc.services.protocol_builder import ProtocolBuilderService
class ScriptGetUserStudies(Script):
def get_description(self):
return """Returns a list of study ids for a user"""
def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs):
return self.do_task(task, study_id, workflow_id, *args, **kwargs)
def do_task(self, task, study_id, workflow_id, *args, **kwargs):
user_id = None
if len(args) > 0:
user_id = args[0]
elif 'user_id' in kwargs:
user_id = kwargs['user_id']
if user_id is not None:
user_studies = ProtocolBuilderService().get_studies(user_id)
results = ProtocolBuilderCreatorStudySchema(many=True).dump(user_studies)
return results

View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_3707ce7" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.2.0">
<bpmn:process id="Process_GetUserStudies" name="Get User Studies" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_08r5407</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_08r5407" sourceRef="StartEvent_1" targetRef="Activity_GetUserID" />
<bpmn:sequenceFlow id="Flow_1vgba29" sourceRef="Activity_GetUserStudies" targetRef="Activity_MungeUserStudiesData" />
<bpmn:endEvent id="Event_EndEvent" name="End Event">
<bpmn:documentation>## Study IDs for User
### User ID
{{ user_id }}
### Study IDs
{{ study_ids }}
</bpmn:documentation>
<bpmn:incoming>Flow_1hwgons</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_1hwgons" sourceRef="Activity_MungeUserStudiesData" targetRef="Event_EndEvent" />
<bpmn:scriptTask id="Activity_GetUserStudies" name="Get User Studies">
<bpmn:incoming>Flow_0z6i1ms</bpmn:incoming>
<bpmn:outgoing>Flow_1vgba29</bpmn:outgoing>
<bpmn:script>user_studies = get_user_studies(user_id)</bpmn:script>
</bpmn:scriptTask>
<bpmn:scriptTask id="Activity_MungeUserStudiesData" name="Munge User Studies Data">
<bpmn:incoming>Flow_1vgba29</bpmn:incoming>
<bpmn:outgoing>Flow_1hwgons</bpmn:outgoing>
<bpmn:script>study_ids = [x.STUDYID for x in user_studies]</bpmn:script>
</bpmn:scriptTask>
<bpmn:sequenceFlow id="Flow_0z6i1ms" sourceRef="Activity_GetUserID" targetRef="Activity_GetUserStudies" />
<bpmn:userTask id="Activity_GetUserID" name="Get User ID" camunda:formKey="UserIDForm">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="user_id" label="&#34;User ID&#34;" type="string">
<camunda:validation>
<camunda:constraint name="required" config="True" />
</camunda:validation>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_08r5407</bpmn:incoming>
<bpmn:outgoing>Flow_0z6i1ms</bpmn:outgoing>
</bpmn:userTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_GetUserStudies">
<bpmndi:BPMNEdge id="Flow_0z6i1ms_di" bpmnElement="Flow_0z6i1ms">
<di:waypoint x="360" y="117" />
<di:waypoint x="410" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1hwgons_di" bpmnElement="Flow_1hwgons">
<di:waypoint x="670" y="117" />
<di:waypoint x="732" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1vgba29_di" bpmnElement="Flow_1vgba29">
<di:waypoint x="510" y="117" />
<di:waypoint x="570" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_08r5407_di" bpmnElement="Flow_08r5407">
<di:waypoint x="215" y="117" />
<di:waypoint x="260" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1e0tdg0_di" bpmnElement="Event_EndEvent">
<dc:Bounds x="732" y="99" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="725" y="142" width="51" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_13xjak5_di" bpmnElement="Activity_GetUserStudies">
<dc:Bounds x="410" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_07ebui5_di" bpmnElement="Activity_MungeUserStudiesData">
<dc:Bounds x="570" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_109i10f_di" bpmnElement="Activity_GetUserID">
<dc:Bounds x="260" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -0,0 +1,26 @@
from tests.base_test import BaseTest
from unittest.mock import patch
from crc import app
class TestGetUserStudies(BaseTest):
@patch('crc.services.protocol_builder.requests.get')
def test_get_user_studies(self, mock_get):
app.config['PB_ENABLED'] = True
mock_get.return_value.ok = True
mock_get.return_value.text = self.protocol_builder_response('user_studies.json')
workflow = self.create_workflow('get_user_studies')
user_uid = workflow.study.user_uid
workflow_api = self.get_workflow_api(workflow)
task = workflow_api.next_task
form_data = {'user_id': user_uid}
workflow_api = self.complete_form(workflow, task, form_data)
task = workflow_api.next_task
assert task.name == "Event_EndEvent"
# The script returns the whole study object, but
# the workflow pulls out the study ids and creates a list of study ids
assert "[11111, 54321, 65432, 1]" in task.documentation