From 7a6059c23793198172b824bcaa2887986a5fefc8 Mon Sep 17 00:00:00 2001 From: Matthew Wire Date: Thu, 5 Apr 2018 10:34:07 +0100 Subject: [PATCH] dev/core/47 Add clone scheduled job functionality --- CRM/Admin/Page/Job.php | 20 ++++++++++++++++++++ CRM/Core/BAO/Job.php | 21 +++++++++++++++++++++ api/v3/Job.php | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/CRM/Admin/Page/Job.php b/CRM/Admin/Page/Job.php index 92237cccda..9d9d31699d 100644 --- a/CRM/Admin/Page/Job.php +++ b/CRM/Admin/Page/Job.php @@ -96,6 +96,12 @@ class CRM_Admin_Page_Job extends CRM_Core_Page_Basic { 'qs' => 'action=delete&id=%%id%%', 'title' => ts('Delete Scheduled Job'), ), + CRM_Core_Action::COPY => array( + 'name' => ts('Copy'), + 'url' => 'civicrm/admin/job', + 'qs' => 'action=copy&id=%%id%%', + 'title' => ts('Copy Scheduled Job'), + ), ); } return self::$_links; @@ -128,11 +134,25 @@ class CRM_Admin_Page_Job extends CRM_Core_Page_Basic { $this, FALSE, 0 ); + // FIXME: Why are we comparing an integer with a string here? if ($this->_action == 'export') { $session = CRM_Core_Session::singleton(); $session->pushUserContext(CRM_Utils_System::url('civicrm/admin/job', 'reset=1')); } + if (($this->_action & CRM_Core_Action::COPY) && (!empty($this->_id))) { + try { + $jobResult = civicrm_api3('Job', 'clone', array('id' => $this->_id)); + if ($jobResult['count'] > 0) { + CRM_Core_Session::setStatus($jobResult['values'][$jobResult['id']]['name'], ts('Job copied successfully'), 'success'); + } + CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/admin/job', 'reset=1')); + } + catch (Exception $e) { + CRM_Core_Session::setStatus(ts('Failed to copy job'), 'Error'); + } + } + return parent::run(); } diff --git a/CRM/Core/BAO/Job.php b/CRM/Core/BAO/Job.php index fcb749a2c7..a67ffaa5b0 100644 --- a/CRM/Core/BAO/Job.php +++ b/CRM/Core/BAO/Job.php @@ -146,4 +146,25 @@ class CRM_Core_BAO_Job extends CRM_Core_DAO_Job { CRM_Core_DAO::executeQuery($query); } + /** + * Make a copy of a Job. + * + * @param int $id The job id to copy. + * + * @return CRM_Core_DAO + */ + public static function copy($id, $params = array()) { + $fieldsFix = array( + 'suffix' => array( + 'name' => ' - ' . ts('Copy'), + ), + 'replace' => $params, + ); + $copy = &CRM_Core_DAO::copyGeneric('CRM_Core_DAO_Job', array('id' => $id), NULL, $fieldsFix); + $copy->save(); + CRM_Utils_Hook::copy('Job', $copy); + + return $copy; + } + } diff --git a/api/v3/Job.php b/api/v3/Job.php index 7a7e699dc8..3504a766f6 100644 --- a/api/v3/Job.php +++ b/api/v3/Job.php @@ -61,6 +61,41 @@ function civicrm_api3_job_create($params) { return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params, 'Job'); } +/** + * Adjust metadata for clone spec action. + * + * @param array $spec + */ +function _civicrm_api3_job_clone_spec(&$spec) { + $spec['id']['title'] = 'Job ID to clone'; + $spec['id']['type'] = CRM_Utils_Type::T_INT; + $spec['id']['api.required'] = 1; + $spec['is_active']['title'] = 'Job is Active?'; + $spec['is_active']['type'] = CRM_Utils_Type::T_BOOLEAN; + $spec['is_active']['api.required'] = 0; +} + +/** + * Clone Job. + * + * @param array $params + * + * @return array + * @throws \API_Exception + * @throws \CiviCRM_API3_Exception + */ +function civicrm_api3_job_clone($params) { + if (empty($params['id'])) { + throw new API_Exception("Mandatory key(s) missing from params array: id field is required"); + } + $id = $params['id']; + unset($params['id']); + $params['last_run'] = 'null'; + $params['scheduled_run_date'] = 'null'; + $newJobDAO = CRM_Core_BAO_Job::copy($id, $params); + return civicrm_api3('Job', 'get', array('id' => $newJobDAO->id)); +} + /** * Retrieve one or more job. * -- 2.25.1