Make sure automatic actions are applied to all tasks when using bulk operations
This commit is contained in:
parent
912cf378d7
commit
a0c44d238a
|
|
@ -21,12 +21,12 @@ abstract class Base extends \Kanboard\Core\Base
|
||||||
private $compatibleEvents = array();
|
private $compatibleEvents = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag for called listener
|
* Keep history of executed events
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @var boolean
|
* @var array
|
||||||
*/
|
*/
|
||||||
private $called = false;
|
private $callStack = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project id
|
* Project id
|
||||||
|
|
@ -252,17 +252,20 @@ abstract class Base extends \Kanboard\Core\Base
|
||||||
*/
|
*/
|
||||||
public function execute(GenericEvent $event, $eventName)
|
public function execute(GenericEvent $event, $eventName)
|
||||||
{
|
{
|
||||||
// Avoid infinite loop, a listener instance can be called only one time
|
$data = $event->getAll();
|
||||||
if ($this->called) {
|
$hash = md5(serialize($data).$eventName);
|
||||||
|
|
||||||
|
// Do not call twice the same action with the same arguments.
|
||||||
|
if (isset($this->callStack[$hash])) {
|
||||||
return false;
|
return false;
|
||||||
|
} else {
|
||||||
|
$this->callStack[$hash] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = $event->getAll();
|
|
||||||
$executable = $this->isExecutable($data, $eventName);
|
$executable = $this->isExecutable($data, $eventName);
|
||||||
$executed = false;
|
$executed = false;
|
||||||
|
|
||||||
if ($executable) {
|
if ($executable) {
|
||||||
$this->called = true;
|
|
||||||
$executed = $this->doAction($data);
|
$executed = $this->doAction($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -141,4 +141,18 @@ class BaseActionTest extends Base
|
||||||
$this->assertTrue($dummyAction->execute($event, 'foobar'));
|
$this->assertTrue($dummyAction->execute($event, 'foobar'));
|
||||||
$this->assertFalse($dummyAction->execute($event, 'foobar'));
|
$this->assertFalse($dummyAction->execute($event, 'foobar'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testExecuteSameActionSeveralTimesWithDifferentEvents()
|
||||||
|
{
|
||||||
|
$dummyAction = new DummyAction($this->container);
|
||||||
|
$dummyAction->setProjectId(1234);
|
||||||
|
$dummyAction->setParam('p1', 'something');
|
||||||
|
$dummyAction->addEvent('foobar', 'FooBar');
|
||||||
|
|
||||||
|
$event1 = new GenericEvent(array('project_id' => 1234, 'p1' => 'something', 'p2' => 'abc', 'p3' => array('p4' => 'a')));
|
||||||
|
$event2 = new GenericEvent(array('project_id' => 1234, 'p1' => 'something', 'p2' => 'abc', 'p3' => array('p4' => 'b')));
|
||||||
|
|
||||||
|
$this->assertTrue($dummyAction->execute($event1, 'foobar'));
|
||||||
|
$this->assertTrue($dummyAction->execute($event2, 'foobar'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue