/** * This returns the workflow requests outstanding for this user. * It does one query against draft for change requests, and another * request against live for the deletion requests (which are not in draft * any more), and merges the result sets together. */ function sourceRecords($params) { increase_time_limit_to(120); $currentStage = Versioned::current_stage(); $changes = WorkflowTwoStepRequest::get_by_author('WorkflowPublicationRequest', Member::currentUser(), array('AwaitingApproval')); if ($changes) { foreach ($changes as $change) { $change->RequestType = "Publish"; } } Versioned::reading_stage(Versioned::get_live_stage()); $deletions = WorkflowTwoStepRequest::get_by_author('WorkflowDeletionRequest', Member::currentUser(), array('AwaitingApproval')); if ($deletions) { foreach ($deletions as $deletion) { $deletion->RequestType = "Deletion"; } } if ($changes && $deletions) { $changes->merge($deletions); } else { if ($deletions) { $changes = $deletions; } } return $changes; }
function testWorkflowPublicationApprovalTransition() { WorkflowRequest::$enable_all_alerts = true; $page = $this->objFromFixture('SiteTree', 'custompublisherpage'); $custompublisher = $this->objFromFixture('Member', 'custompublisher'); $customauthor = $this->objFromFixture('Member', 'customauthor'); // awaiting approval $this->session()->inst_set('loggedInAs', $customauthor->ID); $request1 = $page->openOrNewWorkflowRequest('WorkflowPublicationRequest'); $this->assertNotNull($request1); $this->assertEquals($request1->AuthorID, $customauthor->ID, "Logged-in member is set as the author of the request"); $this->assertEquals($request1->Status, 'AwaitingApproval', "Request is set to AwaitingApproval after requestPublication() is called"); $this->assertContains('cms_cancel', array_flip($request1->WorkflowActions()), "Author can cancel own request"); $this->assertNotContains('cms_deny', array_flip($request1->WorkflowActions()), "Author cant deny own request"); $this->session()->inst_set('loggedInAs', $custompublisher->ID); $this->assertContains('cms_cancel', array_flip($request1->WorkflowActions()), "Publisher can cancel requests"); $request1->requestedit('Please make some changes'); $request1->comment('Here are the changes I would like you to do:'); $this->session()->inst_set('loggedInAs', $customauthor->ID); $this->assertContains('cms_requestpublication', array_flip($request1->WorkflowActions()), "Author can resubmit after request edit"); $request1->request('Resubmit after edits'); $this->session()->inst_set('loggedInAs', $custompublisher->ID); WorkflowRequest::$allow_deny = true; $this->assertContains('cms_deny', array_flip($request1->WorkflowActions()), "Publisher can deny requests when WorkflowRequest::allow_deny is true"); WorkflowRequest::$allow_deny = false; $this->assertNotContains('cms_deny', array_flip($request1->WorkflowActions()), "Publisher can't deny requests when WorkflowRequest::allow_deny is false"); WorkflowRequest::$allow_deny = true; $request1->approve('Looks good'); $this->assertEquals($request1->Status, 'Completed', "Request is set to Completed after page is approved"); $this->assertEquals($request1->PublisherID, $custompublisher->ID, "Currently logged-in user is set as the Publisher for this request"); $this->session()->inst_set('loggedInAs', null); // Make sure the requests can be picked up by the get by author and get by publisher functions $this->assertContains($request1->Page()->ID, WorkflowTwoStepRequest::get_by_publisher('WorkflowPublicationRequest', $custompublisher, array('Completed'))->column('ID')); $this->assertContains($request1->Page()->ID, WorkflowTwoStepRequest::get_by_author('WorkflowPublicationRequest', $customauthor, array('Completed'))->column('ID')); WorkflowRequest::$enable_all_alerts = false; }