Skip to content

Commit

Permalink
Mods to waiting_bca after feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
cullerton committed Feb 26, 2025
1 parent f1a2235 commit 6b57721
Show file tree
Hide file tree
Showing 3 changed files with 215 additions and 23 deletions.
44 changes: 32 additions & 12 deletions crc/scripts/get_waiting_bca.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
from crc import session
from crc.api.common import ApiError
from crc.models.study import StudyModel
from crc.models.task_event import TaskEventModel
from crc.services.ldap_service import LdapService
from crc.services.study_service import StudyService
from crc.scripts.script import Script
from crc.models.workflow import WorkflowModel
Expand All @@ -16,22 +20,38 @@ def get_description(self):
def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs):
return self.do_task(task, study_id, workflow_id, *args, **kwargs)

@staticmethod
def __get_study_title(study_id):
"""Return the study title for the given study ID."""
study = session.query(StudyModel).filter(StudyModel.id == study_id).first()
if study:
return study.title
else:
raise ApiError("study_not_found", "Study not found", status_code=404)

def do_task(self, task, study_id, workflow_id, *args, **kwargs):
"""Return a list of all BCA workflows that are waiting for approval."""
waiting_bca = []
query_results = (WorkflowModel.query.
filter(WorkflowModel.workflow_spec_id=='billing_coverage_analysis').
filter(WorkflowModel.status=='waiting').
all())
if query_results:
task_event_results = (session.query(TaskEventModel).
filter(TaskEventModel.action=='ASSIGNMENT').
filter(TaskEventModel.workflow_spec_id=='billing_coverage_analysis').
filter(TaskEventModel.task_title=='Approval Request').
all())
if task_event_results:
# format the output
for workflow in query_results:
output = {}
output['study_id'] = workflow.study_id
output['study_short_title'] = workflow.study.short_title
output['study_title'] = workflow.study.title
output['study_url'] = self.get_study_url(workflow.study_id)
for task_event in task_event_results:
# if task_event.task_lane == 'PIApprover':
user_info = None
if LdapService.user_exists(task_event.user_uid):
user_info = LdapService.user_info(task_event.user_uid)
output = {'study_id': task_event.study_id,
'user_uid': task_event.user_uid,
'user_name': user_info.display_name if user_info else task_event.user_uid,
'workflow_id': task_event.workflow_id,
'date': task_event.date,
'study_url': self.get_study_url(task_event.study_id),
'study_title': self.__get_study_title(task_event.study_id)}
waiting_bca.append(output)
print('here')

return waiting_bca

151 changes: 151 additions & 0 deletions tests/data/billing_coverage_analysis/billing_coverage_analysis.bpmn
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
<?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_ef63ba4" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.0.0-dev">
<bpmn:collaboration id="BCA_Test">
<bpmn:documentation>## BCA Test</bpmn:documentation>
<bpmn:participant id="Participant_Case" name="Case" processRef="Process_BCA_Test" />
</bpmn:collaboration>
<bpmn:process id="Process_BCA_Test" name="BCA Test" isExecutable="true">
<bpmn:laneSet id="LaneSet_0ft4417">
<bpmn:lane id="Lane_Initiator">
<bpmn:documentation>## Initiator</bpmn:documentation>
<bpmn:flowNodeRef>StartEvent_1</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Activity_GetID</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Activity_ReviewCase</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Event_02egqno</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Activity_GetReviewers</bpmn:flowNodeRef>
</bpmn:lane>
<bpmn:lane id="PI_Approver" name="PIApprover">
<bpmn:documentation>## PI Approver</bpmn:documentation>
<bpmn:flowNodeRef>Activity_GetApprovalRequest</bpmn:flowNodeRef>
<bpmn:flowNodeRef>Activity_MakeCase</bpmn:flowNodeRef>
</bpmn:lane>
</bpmn:laneSet>
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0xivass</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_0xivass" sourceRef="StartEvent_1" targetRef="Activity_GetReviewers" />
<bpmn:sequenceFlow id="Flow_11j3kuv" sourceRef="Activity_GetID" targetRef="Activity_GetApprovalRequest" />
<bpmn:sequenceFlow id="Flow_0q7kef5" sourceRef="Activity_GetApprovalRequest" targetRef="Activity_MakeCase" />
<bpmn:sequenceFlow id="Flow_1hr7g04" sourceRef="Activity_ReviewCase" targetRef="Event_02egqno" />
<bpmn:sequenceFlow id="Flow_06x58q0" sourceRef="Activity_MakeCase" targetRef="Activity_ReviewCase" />
<bpmn:userTask id="Activity_GetID" name="Get ID" camunda:formKey="DataForm">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="id" label="&#39;ID&#39;" type="long">
<camunda:validation>
<camunda:constraint name="required" config="True" />
</camunda:validation>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_16cpayc</bpmn:incoming>
<bpmn:outgoing>Flow_11j3kuv</bpmn:outgoing>
</bpmn:userTask>
<bpmn:manualTask id="Activity_ReviewCase" name="Review Case">
<bpmn:documentation>## Case
ID: {{ case.id }}

Case ID: {{ case.case_id }}

Case Worker: {{ case.case_worker }}

Notes: {{ case.notes }}


</bpmn:documentation>
<bpmn:incoming>Flow_06x58q0</bpmn:incoming>
<bpmn:outgoing>Flow_1hr7g04</bpmn:outgoing>
</bpmn:manualTask>
<bpmn:endEvent id="Event_02egqno">
<bpmn:incoming>Flow_1hr7g04</bpmn:incoming>
</bpmn:endEvent>
<bpmn:userTask id="Activity_GetApprovalRequest" name="Get Approval Request" camunda:formKey="MoreDataForm">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="case_id" label="&#39;Case ID&#39;" type="long">
<camunda:validation>
<camunda:constraint name="required" config="True" />
</camunda:validation>
</camunda:formField>
<camunda:formField id="case_worker" label="&#39;Case Worker&#39;" type="string" />
<camunda:formField id="notes" label="&#39;Notes&#39;" type="string" />
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_11j3kuv</bpmn:incoming>
<bpmn:outgoing>Flow_0q7kef5</bpmn:outgoing>
</bpmn:userTask>
<bpmn:scriptTask id="Activity_MakeCase" name="Make Case">
<bpmn:incoming>Flow_0q7kef5</bpmn:incoming>
<bpmn:outgoing>Flow_06x58q0</bpmn:outgoing>
<bpmn:script>case = {'id': id, 'case_id': case_id, 'case_worker': case_worker, 'notes': notes}</bpmn:script>
</bpmn:scriptTask>
<bpmn:sequenceFlow id="Flow_16cpayc" sourceRef="Activity_GetReviewers" targetRef="Activity_GetID" />
<bpmn:scriptTask id="Activity_GetReviewers" name="Get Reviewers">
<bpmn:incoming>Flow_0xivass</bpmn:incoming>
<bpmn:outgoing>Flow_16cpayc</bpmn:outgoing>
<bpmn:script>current_user = get_current_user()
PIApprover = ['dhf8r', 'lb3dp']
</bpmn:script>
</bpmn:scriptTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="BCA_Test">
<bpmndi:BPMNShape id="Participant_0aw2kvp_di" bpmnElement="Participant_Case" isHorizontal="true">
<dc:Bounds x="129" y="120" width="681" height="250" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Lane_0qw7svk_di" bpmnElement="PI_Approver" isHorizontal="true">
<dc:Bounds x="159" y="245" width="651" height="125" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Lane_07wdf9d_di" bpmnElement="Lane_Initiator" isHorizontal="true">
<dc:Bounds x="159" y="120" width="651" height="125" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="159" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0ys90wq_di" bpmnElement="Activity_GetID">
<dc:Bounds x="420" y="137" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_04nwttv_di" bpmnElement="Activity_ReviewCase">
<dc:Bounds x="570" y="137" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_02egqno_di" bpmnElement="Event_02egqno">
<dc:Bounds x="722" y="159" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0kmaqbt_di" bpmnElement="Activity_GetApprovalRequest">
<dc:Bounds x="420" y="270" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1v5jg8i_di" bpmnElement="Activity_MakeCase">
<dc:Bounds x="570" y="270" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0ig1l4t_di" bpmnElement="Activity_GetReviewers">
<dc:Bounds x="270" y="137" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_0xivass_di" bpmnElement="Flow_0xivass">
<di:waypoint x="215" y="177" />
<di:waypoint x="270" y="177" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_11j3kuv_di" bpmnElement="Flow_11j3kuv">
<di:waypoint x="470" y="217" />
<di:waypoint x="470" y="270" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0q7kef5_di" bpmnElement="Flow_0q7kef5">
<di:waypoint x="520" y="310" />
<di:waypoint x="570" y="310" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1hr7g04_di" bpmnElement="Flow_1hr7g04">
<di:waypoint x="670" y="177" />
<di:waypoint x="722" y="177" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_06x58q0_di" bpmnElement="Flow_06x58q0">
<di:waypoint x="620" y="270" />
<di:waypoint x="620" y="217" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_16cpayc_di" bpmnElement="Flow_16cpayc">
<di:waypoint x="370" y="177" />
<di:waypoint x="420" y="177" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
43 changes: 32 additions & 11 deletions tests/scripts/test_get_waiting_bca.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
class TestGetWaitingBCA(BaseTest):

def test_get_waiting_bca(self):
"""The get_waiting_bca script returns a list of all BCA workflows that are waiting for approval."""
"""Test the get_waiting_bca script.
The script returns a list of all BCA workflows that are waiting for approval."""
self.add_users()
for spec in ['hello_world', 'billing_coverage_analysis']:
# This creates a workflow using study_id 1, which it also creates if necessary.
Expand Down Expand Up @@ -43,27 +44,47 @@ def test_get_waiting_bca(self):

assert task.data['waiting_bca'] == []

workflow_model = session.query(WorkflowModel). \
bca_model = session.query(WorkflowModel). \
filter(WorkflowModel.workflow_spec_id == 'billing_coverage_analysis'). \
filter(WorkflowModel.study_id == test_study_one.id). \
first()
workflow_model.status = 'waiting'
session.commit()
workflow_api = self.get_workflow_api(bca_model)
task = workflow_api.next_task

assert task.process_name == 'BCA Test'
assert task.name == 'Activity_GetID'

form_data = {'id': 1}
workflow_api = self.complete_form(bca_model, task, form_data, user_uid='kcm4zc')

saved_task = workflow_api.next_task

assert saved_task.name == 'Activity_GetApprovalRequest'
assert saved_task.lane == 'PIApprover'

# Try to submit the form with a user_uid that is not in the lane
form_data = {'case_id': 1, 'case_worker': 'Miss Information', 'notes': 'Test notes'}
with self.assertRaises(AssertionError) as ae:
self.complete_form(bca_model, saved_task, form_data, user_uid='kcm4zc')
assert ae.exception.args[0] == ("False is not true : BAD Response: 400. \n "
"This task must be completed by '['dhf8r', 'lb3dp']', "
"but you are kcm4zc. . ")

# We should have 2 waiting bca workflows now, one for each user in the lane
workflow = self.create_workflow('get_waiting_bca')
workflow_api = self.get_workflow_api(workflow)
task = workflow_api.next_task

assert len(task.data['waiting_bca']) == 1
assert len(task.data['waiting_bca']) == 2
for item in task.data['waiting_bca']:
assert item['user_uid'] in ['dhf8r', 'lb3dp']

workflow_model = session.query(WorkflowModel). \
filter(WorkflowModel.workflow_spec_id == 'billing_coverage_analysis'). \
filter(WorkflowModel.study_id == test_study_three.id). \
first()
workflow_model.status = 'waiting'
# Complete the form with a valid user_uid. Either valid user can complete the task.
self.complete_form(bca_model, saved_task, form_data, user_uid='lb3dp')

# Check for waiting BCAs again. We should not have any now.
workflow = self.create_workflow('get_waiting_bca')
workflow_api = self.get_workflow_api(workflow)
task = workflow_api.next_task

assert len(task.data['waiting_bca']) == 2
assert len(task.data['waiting_bca']) == 0

0 comments on commit 6b57721

Please sign in to comment.