Pause sending tasks for inactive notifications
[MAILPOET-1376]
This commit is contained in:
@@ -325,6 +325,12 @@ class Newsletter extends Model {
|
|||||||
$this->set('status', $status);
|
$this->set('status', $status);
|
||||||
$this->save();
|
$this->save();
|
||||||
}
|
}
|
||||||
|
if(($status === self::STATUS_DRAFT) && ($this->type === self::TYPE_NOTIFICATION)) {
|
||||||
|
ScheduledTask::pauseAllByNewsletter($this);
|
||||||
|
}
|
||||||
|
if(($status === self::STATUS_ACTIVE) && ($this->type === self::TYPE_NOTIFICATION)) {
|
||||||
|
ScheduledTask::setScheduledAllByNewsletter($this);
|
||||||
|
}
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -30,12 +30,35 @@ class ScheduledTask extends Model {
|
|||||||
return ($this->getErrors() === false && $this->id() > 0);
|
return ($this->getErrors() === false && $this->id() > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static function pauseAllByNewsletter(Newsletter $newsletter) {
|
||||||
|
ScheduledTask::rawExecute(
|
||||||
|
'UPDATE `' . ScheduledTask::$_table . '` t ' .
|
||||||
|
'JOIN `' . SendingQueue::$_table . '` q ON t.`id` = q.`task_id` ' .
|
||||||
|
'SET t.`status` = "' . self::STATUS_PAUSED . '" ' .
|
||||||
|
'WHERE ' .
|
||||||
|
'q.`newsletter_id` = ' . $newsletter->id() .
|
||||||
|
' AND t.`status` = "' . self::STATUS_SCHEDULED . '" '
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function resume() {
|
function resume() {
|
||||||
$this->setExpr('status', 'NULL');
|
$this->setExpr('status', 'NULL');
|
||||||
$this->save();
|
$this->save();
|
||||||
return ($this->getErrors() === false && $this->id() > 0);
|
return ($this->getErrors() === false && $this->id() > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static function setScheduledAllByNewsletter(Newsletter $newsletter) {
|
||||||
|
ScheduledTask::rawExecute(
|
||||||
|
'UPDATE `' . ScheduledTask::$_table . '` t ' .
|
||||||
|
'JOIN `' . SendingQueue::$_table . '` q ON t.`id` = q.`task_id` ' .
|
||||||
|
'SET t.`status` = "' . self::STATUS_SCHEDULED . '" ' .
|
||||||
|
'WHERE ' .
|
||||||
|
'q.`newsletter_id` = ' . $newsletter->id() .
|
||||||
|
' AND t.`status` = "' . self::STATUS_PAUSED . '" ' .
|
||||||
|
' AND t.`scheduled_at` > NOW()'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function complete() {
|
function complete() {
|
||||||
$this->processed_at = WPFunctions::currentTime('mysql');
|
$this->processed_at = WPFunctions::currentTime('mysql');
|
||||||
$this->set('status', self::STATUS_COMPLETED);
|
$this->set('status', self::STATUS_COMPLETED);
|
||||||
|
@@ -226,6 +226,7 @@ class Sending {
|
|||||||
$tasks = ScheduledTask::where('status', ScheduledTask::STATUS_SCHEDULED)
|
$tasks = ScheduledTask::where('status', ScheduledTask::STATUS_SCHEDULED)
|
||||||
->whereLte('scheduled_at', Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')))
|
->whereLte('scheduled_at', Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')))
|
||||||
->where('type', 'sending')
|
->where('type', 'sending')
|
||||||
|
->whereNotEqual('status', ScheduledTask::STATUS_PAUSED)
|
||||||
->limit($amount)
|
->limit($amount)
|
||||||
->findMany();
|
->findMany();
|
||||||
$result = array();
|
$result = array();
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace MailPoet\Test\Models;
|
namespace MailPoet\Test\Models;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\Segment;
|
use MailPoet\Models\Segment;
|
||||||
use MailPoet\Models\Subscriber;
|
use MailPoet\Models\Subscriber;
|
||||||
@@ -839,6 +840,38 @@ class NewsletterTest extends \MailPoetTest {
|
|||||||
expect($result[1]->id)->equals($newsletter_2->id);
|
expect($result[1]->id)->equals($newsletter_2->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testPauseTaskWhenDisablePostNotification() {
|
||||||
|
$newsletter = Newsletter::createOrUpdate(array(
|
||||||
|
'type' => Newsletter::TYPE_NOTIFICATION
|
||||||
|
));
|
||||||
|
$task = ScheduledTask::createOrUpdate(array('status' => ScheduledTask::STATUS_SCHEDULED));
|
||||||
|
SendingQueue::createOrUpdate(array(
|
||||||
|
'newsletter_id' => $newsletter->id(),
|
||||||
|
'task_id' => $task->id(),
|
||||||
|
));
|
||||||
|
$newsletter->setStatus(Newsletter::STATUS_DRAFT);
|
||||||
|
$task_found = ScheduledTask::findOne($task->id());
|
||||||
|
expect($task_found->status)->equals(ScheduledTask::STATUS_PAUSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testUnPauseTaskWhenEnablePostNotification() {
|
||||||
|
$newsletter = Newsletter::createOrUpdate(array(
|
||||||
|
'type' => Newsletter::TYPE_NOTIFICATION
|
||||||
|
));
|
||||||
|
$task = ScheduledTask::createOrUpdate(array(
|
||||||
|
'status' => ScheduledTask::STATUS_PAUSED,
|
||||||
|
'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->addDays(10)->format('Y-m-d H:i:s'),
|
||||||
|
));
|
||||||
|
SendingQueue::createOrUpdate(array(
|
||||||
|
'newsletter_id' => $newsletter->id(),
|
||||||
|
'task_id' => $task->id(),
|
||||||
|
));
|
||||||
|
$newsletter->setStatus(Newsletter::STATUS_ACTIVE);
|
||||||
|
$task_found = ScheduledTask::findOne($task->id());
|
||||||
|
expect($task_found->status)->equals(ScheduledTask::STATUS_SCHEDULED);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function _after() {
|
function _after() {
|
||||||
\ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table);
|
\ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table);
|
||||||
\ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
\ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
||||||
|
@@ -1,7 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace MailPoet\Test\Models;
|
namespace MailPoet\Test\Models;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\ScheduledTask;
|
use MailPoet\Models\ScheduledTask;
|
||||||
|
use MailPoet\Models\SendingQueue;
|
||||||
|
|
||||||
class ScheduledTaskTest extends \MailPoetTest {
|
class ScheduledTaskTest extends \MailPoetTest {
|
||||||
function _before() {
|
function _before() {
|
||||||
@@ -21,6 +24,68 @@ class ScheduledTaskTest extends \MailPoetTest {
|
|||||||
expect($this->task->priority)->equals(ScheduledTask::PRIORITY_MEDIUM);
|
expect($this->task->priority)->equals(ScheduledTask::PRIORITY_MEDIUM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testItUnPauseAllByNewsletters() {
|
||||||
|
$newsletter = Newsletter::createOrUpdate(array(
|
||||||
|
'type' => Newsletter::TYPE_NOTIFICATION
|
||||||
|
));
|
||||||
|
$task1 = ScheduledTask::createOrUpdate(array(
|
||||||
|
'status' => ScheduledTask::STATUS_PAUSED,
|
||||||
|
'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->addDays(10)->format('Y-m-d H:i:s'),
|
||||||
|
));
|
||||||
|
$task2 = ScheduledTask::createOrUpdate(array(
|
||||||
|
'status' => ScheduledTask::STATUS_COMPLETED,
|
||||||
|
'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->addDays(10)->format('Y-m-d H:i:s'),
|
||||||
|
));
|
||||||
|
$task3 = ScheduledTask::createOrUpdate(array(
|
||||||
|
'status' => ScheduledTask::STATUS_PAUSED,
|
||||||
|
'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->subDays(10)->format('Y-m-d H:i:s'),
|
||||||
|
));
|
||||||
|
SendingQueue::createOrUpdate(array(
|
||||||
|
'newsletter_id' => $newsletter->id(),
|
||||||
|
'task_id' => $task1->id(),
|
||||||
|
));
|
||||||
|
SendingQueue::createOrUpdate(array(
|
||||||
|
'newsletter_id' => $newsletter->id(),
|
||||||
|
'task_id' => $task2->id(),
|
||||||
|
));
|
||||||
|
SendingQueue::createOrUpdate(array(
|
||||||
|
'newsletter_id' => $newsletter->id(),
|
||||||
|
'task_id' => $task3->id(),
|
||||||
|
));
|
||||||
|
ScheduledTask::setScheduledAllByNewsletter($newsletter);
|
||||||
|
$task1_found = ScheduledTask::findOne($task1->id());
|
||||||
|
expect($task1_found->status)->equals(ScheduledTask::STATUS_SCHEDULED);
|
||||||
|
$task2_found = ScheduledTask::findOne($task2->id());
|
||||||
|
expect($task2_found->status)->equals(ScheduledTask::STATUS_COMPLETED);
|
||||||
|
$task3_found = ScheduledTask::findOne($task3->id());
|
||||||
|
expect($task3_found->status)->equals(ScheduledTask::STATUS_PAUSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItPauseAllByNewsletters() {
|
||||||
|
$newsletter = Newsletter::createOrUpdate(array(
|
||||||
|
'type' => Newsletter::TYPE_NOTIFICATION
|
||||||
|
));
|
||||||
|
$task1 = ScheduledTask::createOrUpdate(array(
|
||||||
|
'status' => ScheduledTask::STATUS_COMPLETED,
|
||||||
|
));
|
||||||
|
$task2 = ScheduledTask::createOrUpdate(array(
|
||||||
|
'status' => ScheduledTask::STATUS_SCHEDULED,
|
||||||
|
));
|
||||||
|
SendingQueue::createOrUpdate(array(
|
||||||
|
'newsletter_id' => $newsletter->id(),
|
||||||
|
'task_id' => $task1->id(),
|
||||||
|
));
|
||||||
|
SendingQueue::createOrUpdate(array(
|
||||||
|
'newsletter_id' => $newsletter->id(),
|
||||||
|
'task_id' => $task2->id(),
|
||||||
|
));
|
||||||
|
ScheduledTask::pauseAllByNewsletter($newsletter);
|
||||||
|
$task1_found = ScheduledTask::findOne($task1->id());
|
||||||
|
expect($task1_found->status)->equals(ScheduledTask::STATUS_COMPLETED);
|
||||||
|
$task2_found = ScheduledTask::findOne($task2->id());
|
||||||
|
expect($task2_found->status)->equals(ScheduledTask::STATUS_PAUSED);
|
||||||
|
}
|
||||||
|
|
||||||
function _after() {
|
function _after() {
|
||||||
\ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table);
|
\ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table);
|
||||||
}
|
}
|
||||||
|
@@ -145,6 +145,12 @@ class SendingTest extends \MailPoetTest {
|
|||||||
expect(SendingTask::getScheduledQueues($amount))->count($amount);
|
expect(SendingTask::getScheduledQueues($amount))->count($amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testItDoesNotGetPaused() {
|
||||||
|
$this->_after();
|
||||||
|
$this->createNewSendingTask(['status' => ScheduledTask::STATUS_PAUSED]);
|
||||||
|
expect(SendingTask::getScheduledQueues())->count(0);
|
||||||
|
}
|
||||||
|
|
||||||
function testItGetsRunningQueues() {
|
function testItGetsRunningQueues() {
|
||||||
$this->sending->status = null;
|
$this->sending->status = null;
|
||||||
$this->sending->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp'))->subHours(1);
|
$this->sending->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp'))->subHours(1);
|
||||||
|
Reference in New Issue
Block a user