From 6b5772165c6ff049c033119abdf1b66bc6a79279 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 26 Feb 2025 15:41:06 -0500 Subject: [PATCH] Mods to waiting_bca after feedback --- crc/scripts/get_waiting_bca.py | 44 +++-- .../billing_coverage_analysis.bpmn | 151 ++++++++++++++++++ tests/scripts/test_get_waiting_bca.py | 43 +++-- 3 files changed, 215 insertions(+), 23 deletions(-) create mode 100644 tests/data/billing_coverage_analysis/billing_coverage_analysis.bpmn diff --git a/crc/scripts/get_waiting_bca.py b/crc/scripts/get_waiting_bca.py index 0b6f7cd0..c115e269 100644 --- a/crc/scripts/get_waiting_bca.py +++ b/crc/scripts/get_waiting_bca.py @@ -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 @@ -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 diff --git a/tests/data/billing_coverage_analysis/billing_coverage_analysis.bpmn b/tests/data/billing_coverage_analysis/billing_coverage_analysis.bpmn new file mode 100644 index 00000000..95516bf8 --- /dev/null +++ b/tests/data/billing_coverage_analysis/billing_coverage_analysis.bpmn @@ -0,0 +1,151 @@ + + + + ## BCA Test + + + + + + ## Initiator + StartEvent_1 + Activity_GetID + Activity_ReviewCase + Event_02egqno + Activity_GetReviewers + + + ## PI Approver + Activity_GetApprovalRequest + Activity_MakeCase + + + + Flow_0xivass + + + + + + + + + + + + + + + + + Flow_16cpayc + Flow_11j3kuv + + + ## Case +ID: {{ case.id }} + +Case ID: {{ case.case_id }} + +Case Worker: {{ case.case_worker }} + +Notes: {{ case.notes }} + + + + Flow_06x58q0 + Flow_1hr7g04 + + + Flow_1hr7g04 + + + + + + + + + + + + + + Flow_11j3kuv + Flow_0q7kef5 + + + Flow_0q7kef5 + Flow_06x58q0 + case = {'id': id, 'case_id': case_id, 'case_worker': case_worker, 'notes': notes} + + + + Flow_0xivass + Flow_16cpayc + current_user = get_current_user() +PIApprover = ['dhf8r', 'lb3dp'] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/scripts/test_get_waiting_bca.py b/tests/scripts/test_get_waiting_bca.py index 3c1acd6b..04cf1847 100644 --- a/tests/scripts/test_get_waiting_bca.py +++ b/tests/scripts/test_get_waiting_bca.py @@ -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. @@ -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