From a438f13bb0044e4010f41512ee3e7f50590e227c Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 19 Jul 2016 09:02:58 -0400 Subject: [PATCH] - Modifies cron router/UI to display proper status message when WP task scheduler is configured and cron is not running - Updates sending queue worker and related components to stop (delete) cron when all processing is done --- assets/js/src/cron.jsx | 23 ++++++++++++++++--- lib/API/Endpoints/Cron.php | 13 +++++++---- lib/Cron/CronHelper.php | 15 ++++++++++-- .../Workers/SendingQueue/Tasks/Newsletter.php | 12 ++++++++-- lib/Models/Setting.php | 11 ++++++++- views/cron.html | 4 +++- 6 files changed, 65 insertions(+), 13 deletions(-) diff --git a/assets/js/src/cron.jsx b/assets/js/src/cron.jsx index 0691489352..c778ba9c36 100644 --- a/assets/js/src/cron.jsx +++ b/assets/js/src/cron.jsx @@ -53,10 +53,13 @@ define( }.bind(this)); }, render: function() { - if(this.state.status === 'loading') { - return(
{MailPoet.I18n.t('loadingDaemonStatus')}
); - } switch(this.state.status) { + case 'loading': + return( +
+ {MailPoet.I18n.t('loadingDaemonStatus')} +
+ ); case 'started': return(
@@ -85,6 +88,20 @@ define(
); break; + case 'wordpress_task_scheduler_enabled': + return( +
+ {MailPoet.I18n.t('wordpressTaskSchedulerEnabled')} +
+ ); + break; + case false: + return( +
+ {MailPoet.I18n.t('daemonNotRunning')} +
+ ); + break; } } }); diff --git a/lib/API/Endpoints/Cron.php b/lib/API/Endpoints/Cron.php index a2ee3941b4..aa7ef6a146 100644 --- a/lib/API/Endpoints/Cron.php +++ b/lib/API/Endpoints/Cron.php @@ -1,6 +1,7 @@ findOne(); - return ($daemon) ? - unserialize($daemon->value) : + $task_scheduler = TaskScheduler::getCurrentMethod(); + $daemon = Setting::getSetting(CronHelper::DAEMON_SETTING); + if($daemon) { + return $daemon; + } + $status = ($task_scheduler === TaskScheduler::METHOD_WORDPRESS) ? + 'wordpress_task_scheduler_enabled' : false; + return array('status' => $status); } } \ No newline at end of file diff --git a/lib/Cron/CronHelper.php b/lib/Cron/CronHelper.php index d78d5b122c..afcbc6116c 100644 --- a/lib/Cron/CronHelper.php +++ b/lib/Cron/CronHelper.php @@ -12,6 +12,7 @@ class CronHelper { const DAEMON_EXECUTION_LIMIT = 20; const DAEMON_EXECUTION_TIMEOUT = 35; const DAEMON_REQUEST_TIMEOUT = 2; + const DAEMON_SETTING = 'cron_daemon'; static function createDaemon($token) { $daemon = array( @@ -23,17 +24,27 @@ class CronHelper { } static function getDaemon() { - return Setting::getValue('cron_daemon'); + return Setting::getValue(self::DAEMON_SETTING); } static function saveDaemon($daemon) { $daemon['updated_at'] = time(); return Setting::setValue( - 'cron_daemon', + self::DAEMON_SETTING, $daemon ); } + static function stopDaemon() { + $daemon = self::getDaemon(); + $daemon['status'] = Daemon::STATUS_STOPPED; + return self::saveDaemon($daemon); + } + + static function deleteDaemon() { + return Setting::deleteSetting(self::DAEMON_SETTING); + } + static function createToken() { return Security::generateRandomString(); } diff --git a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php index 6944812bf5..624179c2b0 100644 --- a/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php +++ b/lib/Cron/Workers/SendingQueue/Tasks/Newsletter.php @@ -62,7 +62,7 @@ class Newsletter { return $newsletter; } - function render($newsletter) { + function render(array $newsletter) { $renderer = new Renderer($newsletter); $newsletter['rendered_body'] = $renderer->render(); return $newsletter; @@ -103,4 +103,12 @@ class Newsletter { ) ); } -} + + function markNewsletterAsSent($queue_id) { + $newsletter = NewsletterModel::findOne($queue_id); + // if it's a standard newsletter, update its status + if($newsletter->type === NewsletterModel::TYPE_STANDARD) { + $newsletter->setStatus(NewsletterModel::STATUS_SENT); + } + } +} \ No newline at end of file diff --git a/lib/Models/Setting.php b/lib/Models/Setting.php index e94f084149..145c0a21c2 100644 --- a/lib/Models/Setting.php +++ b/lib/Models/Setting.php @@ -160,4 +160,13 @@ class Setting extends Model { return $setting->save(); } -} + + public static function getSetting($setting) { + return self::where('name', $setting)->findOne(); + } + + public static function deleteSetting($setting) { + $setting = self::where('name', $setting)->findOne(); + return ($setting) ? $setting->delete() : false; + } +} \ No newline at end of file diff --git a/views/cron.html b/views/cron.html index 22660da728..2e0a1ce5c7 100644 --- a/views/cron.html +++ b/views/cron.html @@ -6,9 +6,11 @@ <% block translations %> <%= localize({ + 'daemonNotRunning': __('Daemon is not running'), + 'wordpressTaskSchedulerEnabled': __('Daemon is not running because WordPress task scheduler is enabled and there are no scheduled or in-progress jobs'), 'daemonControlError': __('Cron daemon error'), 'loadingDaemonStatus': __('Loading daemon status...'), - 'cronDaemonIsRunning': __('Cron daemon is running.'), + 'cronDaemonIsRunning': __('Cron daemon is running'), 'stop': __('Stop'), 'start': __('Start'), 'cronDaemonState': __('Cron is %$1s')