From dc4f784558db725eb555ce9668231b89aabb8954 Mon Sep 17 00:00:00 2001 From: Tim Almdal Date: Fri, 27 Feb 2009 16:28:20 +0000 Subject: * Refactor task management methods from admin_maintenance.php to task.php * Added a owner_id field to the task database * Modified the admin maintenace to show the owner of the task <<**** Requires a reinstallation of core ****>> --- core/controllers/admin_maintenance.php | 76 ++++++------------------- core/helpers/core_installer.php | 4 +- core/helpers/task.php | 101 +++++++++++++++++++++++++++++++++ core/libraries/Task_Definition.php | 5 ++ core/models/task.php | 18 +++++- core/views/admin_maintenance.html.php | 12 ++++ 6 files changed, 154 insertions(+), 62 deletions(-) create mode 100644 core/helpers/task.php (limited to 'core') diff --git a/core/controllers/admin_maintenance.php b/core/controllers/admin_maintenance.php index beb6cef7..e24cc50b 100644 --- a/core/controllers/admin_maintenance.php +++ b/core/controllers/admin_maintenance.php @@ -18,24 +18,6 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Admin_Maintenance_Controller extends Admin_Controller { - /** - * Get all available tasks - * @todo move task definition out into the modules - */ - private function _get_task_definitions() { - $tasks = array(); - foreach (module::installed() as $module_name => $module_info) { - $class_name = "{$module_name}_task"; - if (method_exists($class_name, "available_tasks")) { - foreach (call_user_func(array($class_name, "available_tasks")) as $task) { - $tasks[$task->callback] = $task; - } - } - } - - return $tasks; - } - /** * Show a list of all available, running and finished tasks. */ @@ -58,11 +40,15 @@ class Admin_Maintenance_Controller extends Admin_Controller { $view = new Admin_View("admin.html"); $view->content = new View("admin_maintenance.html"); - $view->content->task_definitions = $this->_get_task_definitions(); - $view->content->running_tasks = - ORM::factory("task")->where("done", 0)->orderby("updated", "DESC")->find_all(); - $view->content->finished_tasks = - ORM::factory("task")->where("done", 1)->orderby("updated", "DESC")->find_all(); + $view->content->task_definitions = task::get_task_definitions(); + $view->content->running_tasks = ORM::factory("task") + ->select("tasks.*", "users.name as user_name") + ->join("users", "tasks.owner_id", "users.id") + ->where("done", 0)->orderby("updated", "DESC")->find_all(); + $view->content->finished_tasks = ORM::factory("task") + ->select("tasks.*", "users.name as user_name") + ->join("users", "tasks.owner_id", "users.id") + ->where("done", 1)->orderby("updated", "DESC")->find_all(); $view->content->csrf = access::csrf_token(); print $view; } @@ -74,16 +60,7 @@ class Admin_Maintenance_Controller extends Admin_Controller { public function start($task_callback) { access::verify_csrf(); - $task_definitions = $this->_get_task_definitions(); - - $task = ORM::factory("task"); - $task->callback = $task_callback; - $task->name = $task_definitions[$task_callback]->name; - $task->percent_complete = 0; - $task->status = ""; - $task->state = "started"; - $task->context = serialize(array()); - $task->save(); + $task = task::create($task_callback); $view = new View("admin_maintenance_task.html"); $view->csrf = access::csrf_token(); @@ -123,13 +100,7 @@ class Admin_Maintenance_Controller extends Admin_Controller { public function cancel($task_id) { access::verify_csrf(); - $task = ORM::factory("task", $task_id); - if (!$task->loaded) { - throw new Exception("@todo MISSING_TASK"); - } - $task->done = 1; - $task->state = "cancelled"; - $task->save(); + task::cancel($task_id); message::success(t("Task cancelled")); url::redirect("admin/maintenance"); @@ -142,11 +113,8 @@ class Admin_Maintenance_Controller extends Admin_Controller { public function remove($task_id) { access::verify_csrf(); - $task = ORM::factory("task", $task_id); - if (!$task->loaded) { - throw new Exception("@todo MISSING_TASK"); - } - $task->delete(); + task::remove($task_id); + message::success(t("Task removed")); url::redirect("admin/maintenance"); } @@ -159,14 +127,7 @@ class Admin_Maintenance_Controller extends Admin_Controller { public function run($task_id) { access::verify_csrf(); - $task = ORM::factory("task", $task_id); - if (!$task->loaded) { - throw new Exception("@todo MISSING_TASK"); - } - - $task->state = "running"; - call_user_func_array($task->callback, array(&$task)); - $task->save(); + $task = task::run($task_id); if ($task->done) { switch ($task->state) { @@ -184,14 +145,9 @@ class Admin_Maintenance_Controller extends Admin_Controller { message::success(t("Task failed")); break; } - print json_encode( - array("result" => "success", - "task" => $task->as_array(), - "location" => url::site("admin/maintenance"))); + print task::success($task, url::site("admin/maintenance")); } else { - print json_encode( - array("result" => "in_progress", - "task" => $task->as_array())); + print task::in_progress($task); } } } diff --git a/core/helpers/core_installer.php b/core/helpers/core_installer.php index bf83c339..e1dd34c2 100644 --- a/core/helpers/core_installer.php +++ b/core/helpers/core_installer.php @@ -171,7 +171,9 @@ class core_installer { `percent_complete` int(9) default 0, `state` varchar(32) default NULL, `status` varchar(255) default NULL, - PRIMARY KEY (`id`)) + `owner_id` int(9) default NULL, + PRIMARY KEY (`id`), + KEY (`owner_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); $db->query("CREATE TABLE `vars` ( diff --git a/core/helpers/task.php b/core/helpers/task.php new file mode 100644 index 00000000..816a5288 --- /dev/null +++ b/core/helpers/task.php @@ -0,0 +1,101 @@ + $module_info) { + $class_name = "{$module_name}_task"; + if (method_exists($class_name, "available_tasks")) { + foreach (call_user_func(array($class_name, "available_tasks")) as $task) { + if (in_array($task->type, $type)) { + $tasks[$task->callback] = $task; + } + } + } + } + + return $tasks; + } + + static function create($task_callback) { + $task_definitions = self::get_task_definitions(array("admin", "general", "both")); + + $task = ORM::factory("task"); + $task->callback = $task_callback; + $task->name = $task_definitions[$task_callback]->name; + $task->percent_complete = 0; + $task->status = ""; + $task->state = "started"; + $task->owner_id = user::active()->id; + $task->context = serialize(array()); + $task->save(); + + return $task; + } + + static function cancel($task_id) { + $task = ORM::factory("task", $task_id); + if (!$task->loaded) { + throw new Exception("@todo MISSING_TASK"); + } + $task->done = 1; + $task->state = "cancelled"; + $task->save(); + + return $task; + } + + static function remove($task_id) { + $task = ORM::factory("task", $task_id); + if ($task->loaded) { + $task->delete(); + } + } + + static function run($task_id) { + $task = ORM::factory("task", $task_id); + if (!$task->loaded) { + throw new Exception("@todo MISSING_TASK"); + } + + $task->state = "running"; + call_user_func_array($task->callback, array(&$task)); + $task->save(); + + return $task; + } + + static function success($task, $location=null) { + $result = array("result" => "success", "task" => $task->as_array()); + if (!empty($location)) { + $result["location"] = $location; + } + return json_encode($result); + } + + static function in_progress($task) { + return json_encode( + array("result" => "in_progress", + "task" => $task->as_array())); + } +} \ No newline at end of file diff --git a/core/libraries/Task_Definition.php b/core/libraries/Task_Definition.php index 454b39ad..1f1e3287 100644 --- a/core/libraries/Task_Definition.php +++ b/core/libraries/Task_Definition.php @@ -23,6 +23,7 @@ class Task_Definition_Core { public $description; public $name; public $severity; + public $type = "admin"; // admin, general, both static function factory() { return new Task_Definition(); @@ -48,4 +49,8 @@ class Task_Definition_Core { return $this; } + function type($type) { + $this->type = $type; + return $this; + } } diff --git a/core/models/task.php b/core/models/task.php index b88e34b7..85713419 100644 --- a/core/models/task.php +++ b/core/models/task.php @@ -18,7 +18,23 @@ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ class Task_Model extends ORM { - + /** + * @see ORM::__get() + */ + public function __get($column) { + if ($column == "owner") { + // This relationship depends on an outside module, which may not be present so handle + // failures gracefully. + try { + return model_cache::get("user", $this->owner_id); + } catch (Exception $e) { + return null; + } + } else { + return parent::__get($column); + } + } + public function get($key, $default=null) { $context = unserialize($this->context); if (array_key_exists($key, $context)) { diff --git a/core/views/admin_maintenance.html.php b/core/views/admin_maintenance.html.php index c2e28276..2570dcee 100644 --- a/core/views/admin_maintenance.html.php +++ b/core/views/admin_maintenance.html.php @@ -55,6 +55,9 @@ + + + @@ -82,6 +85,9 @@ status ?> + + user_name ?> + state == "stalled"): ?> id?csrf=$csrf") ?>" class="gDialogLink"> @@ -114,6 +120,9 @@ + + + @@ -138,6 +147,9 @@ status ?> + + user_name ?> + done): ?> id?csrf=$csrf") ?>"> -- cgit v1.2.3