WIP - not getting a keyerror with an escalation boundary event now w/ burnettk

This commit is contained in:
jasquat 2023-04-05 14:22:37 -04:00
parent 5d80a17c1a
commit 140761c198
4 changed files with 68 additions and 34 deletions

View File

@ -354,6 +354,9 @@ class CustomBpmnScriptEngine(PythonScriptEngine): # type: ignore
external_methods: Optional[Dict[str, Any]] = None, external_methods: Optional[Dict[str, Any]] = None,
) -> Any: ) -> Any:
"""_evaluate.""" """_evaluate."""
# if task.task_spec.name == 'passing_script_task':
# import pdb; pdb.set_trace()
# print("HEY2")
methods = self.__get_augment_methods(task) methods = self.__get_augment_methods(task)
if external_methods: if external_methods:
methods.update(external_methods) methods.update(external_methods)
@ -375,6 +378,9 @@ class CustomBpmnScriptEngine(PythonScriptEngine): # type: ignore
def execute(self, task: SpiffTask, script: str, external_methods: Any = None) -> None: def execute(self, task: SpiffTask, script: str, external_methods: Any = None) -> None:
"""Execute.""" """Execute."""
# if task.task_spec.name == 'passing_script_task':
# import pdb; pdb.set_trace()
# print("HEY3")
try: try:
# reset failing task just in case # reset failing task just in case
self.failing_spiff_task = None self.failing_spiff_task = None
@ -1644,6 +1650,7 @@ class ProcessInstanceProcessor:
and self._script_engine.failing_spiff_task is not None and self._script_engine.failing_spiff_task is not None
): ):
self._script_engine.failing_spiff_task = None self._script_engine.failing_spiff_task = None
with open("do_engine_steps.json", 'w') as f: f.write(json.dumps(self.serialize(), indent=2))
@classmethod @classmethod
def get_tasks_with_data(cls, bpmn_process_instance: BpmnWorkflow) -> List[SpiffTask]: def get_tasks_with_data(cls, bpmn_process_instance: BpmnWorkflow) -> List[SpiffTask]:

View File

@ -432,10 +432,11 @@ class TaskService:
spiff_task_guid = str(spiff_task.id) spiff_task_guid = str(spiff_task.id)
if spiff_task_parent_guid in task_models: if spiff_task_parent_guid in task_models:
parent_task_model = task_models[spiff_task_parent_guid] parent_task_model = task_models[spiff_task_parent_guid]
new_parent_properties_json = copy.copy(parent_task_model.properties_json) if spiff_task_guid in parent_task_model.properties_json['children']:
new_parent_properties_json["children"].remove(spiff_task_guid) new_parent_properties_json = copy.copy(parent_task_model.properties_json)
parent_task_model.properties_json = new_parent_properties_json new_parent_properties_json["children"].remove(spiff_task_guid)
task_models[spiff_task_parent_guid] = parent_task_model parent_task_model.properties_json = new_parent_properties_json
task_models[spiff_task_parent_guid] = parent_task_model
@classmethod @classmethod
def update_task_data_on_bpmn_process( def update_task_data_on_bpmn_process(

View File

@ -1,5 +1,6 @@
import time import time
from typing import Callable from typing import Callable
import json
from typing import Optional from typing import Optional
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer # type: ignore from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer # type: ignore
@ -71,6 +72,9 @@ class TaskModelSavingDelegate(EngineStepDelegate):
def will_complete_task(self, spiff_task: SpiffTask) -> None: def will_complete_task(self, spiff_task: SpiffTask) -> None:
if self._should_update_task_model(): if self._should_update_task_model():
# if spiff_task.task_spec.name == 'passing_script_task':
# import pdb; pdb.set_trace()
# print("HEY1")
self.current_task_start_in_seconds = time.time() self.current_task_start_in_seconds = time.time()
spiff_task.task_spec._predict(spiff_task, mask=TaskState.NOT_FINISHED_MASK) spiff_task.task_spec._predict(spiff_task, mask=TaskState.NOT_FINISHED_MASK)
if self.secondary_engine_step_delegate: if self.secondary_engine_step_delegate:
@ -78,12 +82,17 @@ class TaskModelSavingDelegate(EngineStepDelegate):
def did_complete_task(self, spiff_task: SpiffTask) -> None: def did_complete_task(self, spiff_task: SpiffTask) -> None:
if self._should_update_task_model(): if self._should_update_task_model():
# if spiff_task.task_spec.name == 'test_process_to_call_script.BoundaryEventParent':
# import pdb; pdb.set_trace()
# print("HEY")
task_model = self.task_service.update_task_model_with_spiff_task(spiff_task) task_model = self.task_service.update_task_model_with_spiff_task(spiff_task)
if self.current_task_start_in_seconds is None: if self.current_task_start_in_seconds is None:
raise Exception("Could not find cached current_task_start_in_seconds. This should never have happend") raise Exception("Could not find cached current_task_start_in_seconds. This should never have happend")
task_model.start_in_seconds = self.current_task_start_in_seconds task_model.start_in_seconds = self.current_task_start_in_seconds
task_model.end_in_seconds = time.time() task_model.end_in_seconds = time.time()
self.last_completed_spiff_task = spiff_task self.last_completed_spiff_task = spiff_task
# self.task_service.process_spiff_task_parent_subprocess_tasks(spiff_task)
# self.task_service.process_spiff_task_children(spiff_task)
if self.secondary_engine_step_delegate: if self.secondary_engine_step_delegate:
self.secondary_engine_step_delegate.did_complete_task(spiff_task) self.secondary_engine_step_delegate.did_complete_task(spiff_task)
@ -103,9 +112,20 @@ class TaskModelSavingDelegate(EngineStepDelegate):
def after_engine_steps(self, bpmn_process_instance: BpmnWorkflow) -> None: def after_engine_steps(self, bpmn_process_instance: BpmnWorkflow) -> None:
if self._should_update_task_model(): if self._should_update_task_model():
if self.last_completed_spiff_task is not None: # excludes COMPLETED. the others were required to get PP1 to go to completion.
self.task_service.process_spiff_task_parent_subprocess_tasks(self.last_completed_spiff_task) # process FUTURE tasks because Boundary events are not processed otherwise.
self.task_service.process_spiff_task_children(self.last_completed_spiff_task) for waiting_spiff_task in bpmn_process_instance.get_tasks(
TaskState.WAITING | TaskState.CANCELLED | TaskState.READY | TaskState.MAYBE | TaskState.LIKELY | TaskState.FUTURE
):
# include PREDICTED_MASK tasks in list so we can remove them from the parent
if waiting_spiff_task._has_state(TaskState.PREDICTED_MASK):
TaskService.remove_spiff_task_from_parent(waiting_spiff_task, self.task_service.task_models)
continue
self.task_service.update_task_model_with_spiff_task(waiting_spiff_task)
# if self.last_completed_spiff_task is not None:
# self.task_service.process_spiff_task_parent_subprocess_tasks(self.last_completed_spiff_task)
# self.task_service.process_spiff_task_children(self.last_completed_spiff_task)
def _should_update_task_model(self) -> bool: def _should_update_task_model(self) -> bool:
"""We need to figure out if we have previously save task info on this process intance. """We need to figure out if we have previously save task info on this process intance.

View File

@ -1,9 +1,13 @@
const approveWithUser = ( const approveWithUser = (
username, username,
processInstanceId, processInstanceId,
expectAdditionalApprovalInfoPage = false expectAdditionalApprovalInfoPage = false,
password = null
) => { ) => {
cy.login(username, username); if (!password) {
password = username;
}
cy.login(username, password);
cy.visit('/admin/process-instances/find-by-id'); cy.visit('/admin/process-instances/find-by-id');
cy.get('#process-instance-id-input').type(processInstanceId); cy.get('#process-instance-id-input').type(processInstanceId);
cy.get('button') cy.get('button')
@ -33,22 +37,23 @@ const approveWithUser = (
describe('pp1', () => { describe('pp1', () => {
it('can run PP1', () => { it('can run PP1', () => {
cy.login('core-a1.contributor', 'core-a1.contributor'); cy.login('core-a1.contributor', 'core-a1.contributor');
// cy.login('sasha', 'sasha');
cy.visit('/'); cy.visit('/');
cy.contains('Start New +').click(); cy.contains('Start New +').click();
cy.contains('Raise New Demand Request'); cy.contains('New Demand Request - Procurement').click();
cy.runPrimaryBpmnFile(true); cy.runPrimaryBpmnFile(true);
cy.contains('Please select the type of request to start the process.'); // cy.contains('Please select the type of request to start the process.');
// wait a second to ensure we can click the radio button // // wait a second to ensure we can click the radio button
cy.wait(2000); // cy.wait(2000);
cy.get('input#root-procurement').click(); // cy.get('input#root-procurement').click();
cy.wait(2000); // cy.wait(2000);
cy.get('button') // cy.get('button')
.contains(/^Submit$/) // .contains(/^Submit$/)
.click(); // .click();
cy.contains( // cy.contains(
'Submit a new demand request for the procurement of needed items', // 'Submit a new demand request for the procurement of needed items',
{ timeout: 60000 } // { timeout: 60000 }
); // );
cy.url().then((currentUrl) => { cy.url().then((currentUrl) => {
// if url is "/tasks/8/d37c2f0f-016a-4066-b669-e0925b759560" // if url is "/tasks/8/d37c2f0f-016a-4066-b669-e0925b759560"
@ -64,17 +69,17 @@ describe('pp1', () => {
cy.get('#root_payment_method').select('Bank Transfer'); cy.get('#root_payment_method').select('Bank Transfer');
cy.get('#root_project').select('18564'); cy.get('#root_project').select('18564');
cy.get('#root_category').select('soft_and_lic'); cy.get('#root_category').select('soft_and_lic');
cy.get('button') // cy.get('button')
.contains(/^Submit$/) // .contains(/^Submit$/)
.click(); // .click();
//
cy.contains('Task: Enter NDR-P Items', { timeout: 60000 }); // cy.contains('Task: Enter NDR-P Items', { timeout: 60000 });
cy.get('#root_0_sub_category').select('op_src'); cy.get('#root_item_0_sub_category').select('op_src');
cy.get('#root_0_item').clear().type('spiffworkflow'); cy.get('#root_item_0_item_name').clear().type('spiffworkflow');
cy.get('#root_0_qty').clear().type('1'); cy.get('#root_item_0_qty').clear().type('1');
cy.get('#root_0_currency_type').select('Fiat'); cy.get('#root_item_0_currency_type').select('Fiat');
cy.get('#root_0_currency').select('AUD'); cy.get('#root_item_0_currency').select('AUD');
cy.get('#root_0_unit_price').type('100'); cy.get('#root_item_0_unit_price').type('100');
cy.get('button') cy.get('button')
.contains(/^Submit$/) .contains(/^Submit$/)
.click(); .click();
@ -94,7 +99,8 @@ describe('pp1', () => {
approveWithUser( approveWithUser(
'infra.project-lead', 'infra.project-lead',
processInstanceId, processInstanceId,
'Task: Reminder: Request Additional Budget' 'Task: Reminder: Request Additional Budget',
'infra.project-leadx'
); );
approveWithUser('ppg.ba-a1.sme', processInstanceId); approveWithUser('ppg.ba-a1.sme', processInstanceId);
approveWithUser('security-a1.sme', processInstanceId); approveWithUser('security-a1.sme', processInstanceId);