From 7bbfc2a1c715a6003b7077a42e6929d0f5bba0e4 Mon Sep 17 00:00:00 2001 From: Allon Moritz Date: Fri, 6 Dec 2024 15:09:25 +0100 Subject: [PATCH 1/4] Move to log model --- .../com_scheduler/forms/filter_logs.xml | 2 +- .../src/Controller/LogsController.php | 39 +------- .../com_scheduler/src/Model/LogModel.php | 60 +++++++++++++ .../com_scheduler/src/Model/LogsModel.php | 88 ------------------- .../com_scheduler/src/Model/TaskModel.php | 2 +- .../src/Table/{LogsTable.php => LogTable.php} | 2 +- .../language/en-GB/com_scheduler.ini | 2 + .../src/Extension/TaskNotification.php | 58 ++++++++---- 8 files changed, 105 insertions(+), 148 deletions(-) create mode 100644 administrator/components/com_scheduler/src/Model/LogModel.php rename administrator/components/com_scheduler/src/Table/{LogsTable.php => LogTable.php} (97%) diff --git a/administrator/components/com_scheduler/forms/filter_logs.xml b/administrator/components/com_scheduler/forms/filter_logs.xml index 8fcfddc8e24f..fb4b4cca18eb 100644 --- a/administrator/components/com_scheduler/forms/filter_logs.xml +++ b/administrator/components/com_scheduler/forms/filter_logs.xml @@ -61,4 +61,4 @@ class="js-select-submit-on-change" /> - \ No newline at end of file + diff --git a/administrator/components/com_scheduler/src/Controller/LogsController.php b/administrator/components/com_scheduler/src/Controller/LogsController.php index 41fcf9772053..ee2c9e9fe3e8 100644 --- a/administrator/components/com_scheduler/src/Controller/LogsController.php +++ b/administrator/components/com_scheduler/src/Controller/LogsController.php @@ -10,10 +10,8 @@ namespace Joomla\Component\Scheduler\Administrator\Controller; -use Joomla\CMS\Access\Exception\NotAllowed; use Joomla\CMS\Language\Text; use Joomla\CMS\MVC\Controller\AdminController; -use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -46,7 +44,7 @@ class LogsController extends AdminController * * @since __DEPLOY_VERSION__ */ - public function getModel($name = 'Logs', $prefix = 'Administrator', $config = ['ignore_request' => true]) + public function getModel($name = 'Log', $prefix = 'Administrator', $config = ['ignore_request' => true]) { return parent::getModel($name, $prefix, $config); } @@ -73,39 +71,4 @@ public function purge() $this->setRedirect('index.php?option=com_scheduler&view=logs', $message); } - - /** - * Removes an item. - * - * Overrides Joomla\CMS\MVC\Controller\FormController::delete to check the core.admin permission. - * - * @return void - * - * @since __DEPLOY_VERSION__ - */ - public function delete(): void - { - $ids = $this->input->get('cid', [], 'array'); - - if (!$this->app->getIdentity()->authorise('core.admin', $this->option)) { - throw new NotAllowed(Text::_('JERROR_ALERTNOAUTHOR'), 403); - } - - if (empty($ids)) { - $this->setMessage(Text::_('COM_SCHEDULER_NO_LOGS_SELECTED'), 'warning'); - $this->setRedirect('index.php?option=com_scheduler&view=logs'); - return; - } - - // Get the model. - $model = $this->getModel(); - $ids = ArrayHelper::toInteger($ids); - - // Remove the items. - if ($model->delete($ids)) { - $this->setMessage(Text::plural('COM_SCHEDULER_N_ITEMS_DELETED', \count($ids))); - } - - $this->setRedirect('index.php?option=com_scheduler&view=logs'); - } } diff --git a/administrator/components/com_scheduler/src/Model/LogModel.php b/administrator/components/com_scheduler/src/Model/LogModel.php new file mode 100644 index 000000000000..edca39da1aca --- /dev/null +++ b/administrator/components/com_scheduler/src/Model/LogModel.php @@ -0,0 +1,60 @@ + + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace Joomla\Component\Scheduler\Administrator\Model; + +use Joomla\CMS\Form\Form; +use Joomla\CMS\MVC\Model\AdminModel; +use Joomla\CMS\Table\Table; + +// phpcs:disable PSR1.Files.SideEffects +\defined('_JEXEC') or die; +// phpcs:enable PSR1.Files.SideEffects + +/** + * MVC Model to interact with the Scheduler logs. + * + * @since __DPELOY_VERSION__ + */ +class LogModel extends AdminModel +{ + /** + * There is no form for the log. + * + * @param array $data Data that needs to go into the form + * @param bool $loadData Should the form load its data from the DB? + * + * @return Form|boolean A Form object on success, false on failure. + * + * @since __DEPLOY_VERSION__ + * @throws \Exception + */ + public function getForm($data = [], $loadData = true) + { + return false; + } + + /** + * Method to get a table object, load it if necessary. + * + * @param string $name The table name. Optional. + * @param string $prefix The class prefix. Optional. + * @param array $options Configuration array for model. Optional. + * + * @return Table + * + * @since __DEPLOY_VERSION__ + * @throws \Exception + */ + public function getTable($name = 'Log', $prefix = 'Administrator', $options = []): Table + { + return parent::getTable($name, $prefix, $options); + } +} diff --git a/administrator/components/com_scheduler/src/Model/LogsModel.php b/administrator/components/com_scheduler/src/Model/LogsModel.php index 979bf17b4d13..ba868339c890 100644 --- a/administrator/components/com_scheduler/src/Model/LogsModel.php +++ b/administrator/components/com_scheduler/src/Model/LogsModel.php @@ -15,7 +15,6 @@ // phpcs:enable PSR1.Files.SideEffects use Joomla\CMS\Component\ComponentHelper; -use Joomla\CMS\Factory; use Joomla\CMS\MVC\Factory\MVCFactoryInterface; use Joomla\CMS\MVC\Model\ListModel; use Joomla\Component\Scheduler\Administrator\Helper\SchedulerHelper; @@ -185,91 +184,4 @@ protected function getListQuery() return $query; } - - /** - * Delete rows. - * - * @param array $pks The ids of the items to delete. - * - * @return boolean Returns true on success, false on failure. - */ - public function delete($pks) - { - if ($this->canDelete($pks)) { - // Delete logs from list - $db = $this->getDatabase(); - $query = $db->getQuery(true) - ->delete($db->quoteName('#__scheduler_logs')) - ->whereIn($db->quoteName('id'), $pks); - - $db->setQuery($query); - $this->setError((string) $query); - - try { - $db->execute(); - } catch (\RuntimeException $e) { - $this->setError($e->getMessage()); - - return false; - } - } else { - Factory::getApplication()->enqueueMessage(Text::_('JERROR_CORE_DELETE_NOT_PERMITTED'), 'error'); - } - - return true; - } - - /** - * Determine whether a record may be deleted taking into consideration - * the user's permissions over the record. - * - * @param object $record The database row/record in question - * - * @return boolean True if the record may be deleted - * - * @since __DEPLOY_VERSION__ - * @throws \Exception - */ - protected function canDelete($record): bool - { - // Record doesn't exist, can't delete - if (empty($record)) { - return false; - } - - return Factory::getApplication()->getIdentity()->authorise('core.delete', 'com_scheduler'); - } - - /** - * @param array $data The task execution data. - * - * @return void - * - * @since __DEPLOY_VERSION__ - * @throws Exception - */ - public function logTask(array $data): void - { - $model = Factory::getApplication()->bootComponent('com_scheduler') - ->getMVCFactory()->createModel('Task', 'Administrator', ['ignore_request' => true]); - $taskInfo = $model->getItem($data['TASK_ID']); - $taskOptions = SchedulerHelper::getTaskOptions(); - $safeTypeTitle = $taskOptions->findOption($taskInfo->type)->title ?? ''; - $duration = ($data['TASK_DURATION'] ?? 0); - $created = Factory::getDate()->toSql(); - - /** @var \Joomla\Component\Schduler\Administrator\Table\LogsTable $table */ - $logsTable = $this->getTable(); - $logsTable->tasktype = $safeTypeTitle; - $logsTable->taskname = $data['TASK_TITLE']; - $logsTable->duration = $duration; - $logsTable->jobid = $data['TASK_ID']; - $logsTable->exitcode = $data['EXIT_CODE']; - $logsTable->taskid = $data['TASK_TIMES']; - $logsTable->lastdate = $created; - $logsTable->nextdate = $taskInfo->next_execution; - - // Log the execution of the task. - $logsTable->store(); - } } diff --git a/administrator/components/com_scheduler/src/Model/TaskModel.php b/administrator/components/com_scheduler/src/Model/TaskModel.php index dbd73a825b0d..76b9dde9ff33 100644 --- a/administrator/components/com_scheduler/src/Model/TaskModel.php +++ b/administrator/components/com_scheduler/src/Model/TaskModel.php @@ -254,7 +254,7 @@ protected function populateState(): void * @since 4.1.0 * @throws \Exception */ - public function getTable($name = 'Task', $prefix = 'Table', $options = []): Table + public function getTable($name = 'Task', $prefix = 'Administrator', $options = []): Table { return parent::getTable($name, $prefix, $options); } diff --git a/administrator/components/com_scheduler/src/Table/LogsTable.php b/administrator/components/com_scheduler/src/Table/LogTable.php similarity index 97% rename from administrator/components/com_scheduler/src/Table/LogsTable.php rename to administrator/components/com_scheduler/src/Table/LogTable.php index 78ec38c5345c..f231eca18803 100644 --- a/administrator/components/com_scheduler/src/Table/LogsTable.php +++ b/administrator/components/com_scheduler/src/Table/LogTable.php @@ -23,7 +23,7 @@ * * @since __DEPLOY_VERSION__ */ -class LogsTable extends Table +class LogTable extends Table { /** * Constructor diff --git a/administrator/language/en-GB/com_scheduler.ini b/administrator/language/en-GB/com_scheduler.ini index eac54933d7d3..c47d66a548b9 100644 --- a/administrator/language/en-GB/com_scheduler.ini +++ b/administrator/language/en-GB/com_scheduler.ini @@ -109,6 +109,8 @@ COM_SCHEDULER_N_ITEMS_CHECKED_IN_1="Task checked in." COM_SCHEDULER_N_ITEMS_CHECKED_IN_MORE="%d tasks checked in." COM_SCHEDULER_N_ITEMS_DELETED="%d tasks deleted." COM_SCHEDULER_N_ITEMS_DELETED_1="Task deleted." +COM_SCHEDULER_LOGS_N_ITEMS_DELETED="%d logs deleted." +COM_SCHEDULER_LOGS_N_ITEMS_DELETED_1="Log deleted." COM_SCHEDULER_N_ITEMS_FAILED_UNLOCKING="Failed to unlock %d tasks." COM_SCHEDULER_N_ITEMS_FAILED_UNLOCKING_1="Failed to unlock one task." COM_SCHEDULER_N_ITEMS_PUBLISHED="%d tasks enabled." diff --git a/plugins/system/tasknotification/src/Extension/TaskNotification.php b/plugins/system/tasknotification/src/Extension/TaskNotification.php index 6be75dec3dad..c77352f00c5a 100644 --- a/plugins/system/tasknotification/src/Extension/TaskNotification.php +++ b/plugins/system/tasknotification/src/Extension/TaskNotification.php @@ -12,11 +12,11 @@ use Joomla\CMS\Event\Model; use Joomla\CMS\Factory; -use Joomla\CMS\Form\Form; use Joomla\CMS\Log\Log; use Joomla\CMS\Mail\MailTemplate; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\CMS\User\UserFactoryAwareTrait; +use Joomla\Component\Scheduler\Administrator\Helper\SchedulerHelper; use Joomla\Component\Scheduler\Administrator\Task\Status; use Joomla\Component\Scheduler\Administrator\Task\Task; use Joomla\Database\DatabaseAwareTrait; @@ -125,13 +125,8 @@ public function notifyFailure(Event $event): void { /** @var Task $task */ $task = $event->getArgument('subject'); - - // @todo safety checks, multiple files [?] - $outFile = $event->getArgument('subject')->snapshot['output_file'] ?? ''; - $data = $this->getDataFromTask($event->getArgument('subject')); - $model = $this->getApplication()->bootComponent('com_scheduler') - ->getMVCFactory()->createModel('Task', 'Administrator', ['ignore_request' => true]); - $model->logTask($data); + $data = $this->getDataFromTask($event->getArgument('subject')); + $this->saveLog($data); if (!(int) $task->get('params.notifications.failure_mail', 1)) { return; @@ -140,6 +135,8 @@ public function notifyFailure(Event $event): void // Load translations $this->loadLanguage(); + // @todo safety checks, multiple files [?] + $outFile = $event->getArgument('subject')->snapshot['output_file'] ?? ''; $this->sendMail('plg_system_tasknotification.failure_mail', $data, $outFile); } @@ -185,13 +182,8 @@ public function notifySuccess(Event $event): void { /** @var Task $task */ $task = $event->getArgument('subject'); - - // @todo safety checks, multiple files [?] - $outFile = $event->getArgument('subject')->snapshot['output_file'] ?? ''; - $data = $this->getDataFromTask($event->getArgument('subject')); - $model = $this->getApplication()->bootComponent('com_scheduler') - ->getMVCFactory()->createModel('Logs', 'Administrator', ['ignore_request' => true]); - $model->logTask($data); + $data = $this->getDataFromTask($event->getArgument('subject')); + $this->saveLog($data); if (!(int) $task->get('params.notifications.success_mail', 0)) { return; @@ -199,6 +191,9 @@ public function notifySuccess(Event $event): void // Load translations $this->loadLanguage(); + + // @todo safety checks, multiple files [?] + $outFile = $event->getArgument('subject')->snapshot['output_file'] ?? ''; $this->sendMail('plg_system_tasknotification.success_mail', $data, $outFile); } @@ -214,10 +209,7 @@ public function notifySuccess(Event $event): void */ public function notifyWillResume(Event $event): void { - $data = $this->getDataFromTask($event->getArgument('subject')); - $model = $this->getApplication()->bootComponent('com_scheduler') - ->getMVCFactory()->createModel('Logs', 'Administrator', ['ignore_request' => true]); - $model->logTask($data); + $this->saveLog($this->getDataFromTask($event->getArgument('subject'))); } /** @@ -341,4 +333,32 @@ private function sendMail(string $template, array $data, string $attachment = '' Log::add($this->getApplication()->getLanguage()->_('PLG_SYSTEM_TASK_NOTIFICATION_NO_MAIL_SENT'), Log::WARNING); } } + + /** + * @param array $data The form data + * + * @return boolean True on success, false on failure + * + * @since __DEPLOY_VERSION__ + * @throws \Exception + */ + private function saveLog($data): void + { + $model = $this->getApplication()->bootComponent('com_scheduler')->getMVCFactory()->createModel('Task', 'Administrator', ['ignore_request' => true]); + $taskInfo = $model->getItem($data['TASK_ID']); + + $obj = new \stdClass(); + $obj->tasktype = SchedulerHelper::getTaskOptions()->findOption($taskInfo->type)->title ?? ''; + $obj->taskname = $data['TASK_TITLE']; + $obj->duration = $data['TASK_DURATION'] ?? 0; + $obj->jobid = $data['TASK_ID']; + $obj->exitcode = $data['EXIT_CODE']; + $obj->taskid = $data['TASK_TIMES']; + $obj->lastdate = Factory::getDate()->toSql(); + $obj->nextdate = $taskInfo->next_execution; + + $model = $this->getApplication()->bootComponent('com_scheduler') + ->getMVCFactory()->createModel('Log', 'Administrator', ['ignore_request' => true]); + $model->save((array)$obj); + } } From 1e6d894127c8ff1b2ca117b3670238ad845f37c0 Mon Sep 17 00:00:00 2001 From: Allon Moritz Date: Sat, 7 Dec 2024 17:35:23 +0100 Subject: [PATCH 2/4] remove string --- administrator/language/en-GB/com_scheduler.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/administrator/language/en-GB/com_scheduler.ini b/administrator/language/en-GB/com_scheduler.ini index c47d66a548b9..dcf0e7df8ab9 100644 --- a/administrator/language/en-GB/com_scheduler.ini +++ b/administrator/language/en-GB/com_scheduler.ini @@ -121,7 +121,6 @@ COM_SCHEDULER_N_ITEMS_UNPUBLISHED="%d tasks disabled." COM_SCHEDULER_N_ITEMS_UNPUBLISHED_1="Task disabled." COM_SCHEDULER_N_ITEMS_UNLOCKED="%d tasks unlocked." COM_SCHEDULER_N_ITEMS_UNLOCKED_1="Task unlocked." -COM_SCHEDULER_NO_LOGS_SELECTED="No execution history logs selected." COM_SCHEDULER_OPTION_EXECUTION_MANUAL_LABEL="Manual Execution" COM_SCHEDULER_OPTION_ORPHANED_HIDE="Hide Orphaned" COM_SCHEDULER_OPTION_ORPHANED_ONLY="Only Orphaned" From 11890a25a04162729fc002efe509f7eaa0a5367a Mon Sep 17 00:00:00 2001 From: Allon Moritz Date: Sat, 7 Dec 2024 19:53:55 +0100 Subject: [PATCH 3/4] types --- .../tasknotification/src/Extension/TaskNotification.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/system/tasknotification/src/Extension/TaskNotification.php b/plugins/system/tasknotification/src/Extension/TaskNotification.php index c77352f00c5a..62611e9c1348 100644 --- a/plugins/system/tasknotification/src/Extension/TaskNotification.php +++ b/plugins/system/tasknotification/src/Extension/TaskNotification.php @@ -337,12 +337,12 @@ private function sendMail(string $template, array $data, string $attachment = '' /** * @param array $data The form data * - * @return boolean True on success, false on failure + * @return void * * @since __DEPLOY_VERSION__ * @throws \Exception */ - private function saveLog($data): void + private function saveLog(array $data): void { $model = $this->getApplication()->bootComponent('com_scheduler')->getMVCFactory()->createModel('Task', 'Administrator', ['ignore_request' => true]); $taskInfo = $model->getItem($data['TASK_ID']); From f9bfbdfbd58ab1974fea5f0d75fb166272a30d72 Mon Sep 17 00:00:00 2001 From: Allon Moritz Date: Thu, 12 Dec 2024 07:47:40 +0100 Subject: [PATCH 4/4] Alpha order --- administrator/language/en-GB/com_scheduler.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/administrator/language/en-GB/com_scheduler.ini b/administrator/language/en-GB/com_scheduler.ini index dcf0e7df8ab9..68f58d23f92e 100644 --- a/administrator/language/en-GB/com_scheduler.ini +++ b/administrator/language/en-GB/com_scheduler.ini @@ -94,6 +94,8 @@ COM_SCHEDULER_LAST_RUN_ASC="Last Run ascending" COM_SCHEDULER_LAST_RUN_DATE="Last Run Date" COM_SCHEDULER_LAST_RUN_DESC="Last Run descending" COM_SCHEDULER_LOGS_CLEAR="All execution history logs have been deleted." +COM_SCHEDULER_LOGS_N_ITEMS_DELETED="%d logs deleted." +COM_SCHEDULER_LOGS_N_ITEMS_DELETED_1="Log deleted." COM_SCHEDULER_MANAGER_TASKS="Scheduled Tasks" COM_SCHEDULER_MANAGER_TASK_EDIT="Edit Task" COM_SCHEDULER_MANAGER_TASK_NEW="New Task" @@ -109,8 +111,6 @@ COM_SCHEDULER_N_ITEMS_CHECKED_IN_1="Task checked in." COM_SCHEDULER_N_ITEMS_CHECKED_IN_MORE="%d tasks checked in." COM_SCHEDULER_N_ITEMS_DELETED="%d tasks deleted." COM_SCHEDULER_N_ITEMS_DELETED_1="Task deleted." -COM_SCHEDULER_LOGS_N_ITEMS_DELETED="%d logs deleted." -COM_SCHEDULER_LOGS_N_ITEMS_DELETED_1="Log deleted." COM_SCHEDULER_N_ITEMS_FAILED_UNLOCKING="Failed to unlock %d tasks." COM_SCHEDULER_N_ITEMS_FAILED_UNLOCKING_1="Failed to unlock one task." COM_SCHEDULER_N_ITEMS_PUBLISHED="%d tasks enabled."