Make sure automatic actions are applied to all tasks when using bulk operations

This commit is contained in:
Frédéric Guillot 2018-06-01 16:35:45 -07:00
parent 912cf378d7
commit a0c44d238a
2 changed files with 24 additions and 7 deletions

View File

@ -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);
} }

View File

@ -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'));
}
} }