diff options
author | Tim Almdal <tnalmdal@shaw.ca> | 2009-02-27 16:28:20 +0000 |
---|---|---|
committer | Tim Almdal <tnalmdal@shaw.ca> | 2009-02-27 16:28:20 +0000 |
commit | dc4f784558db725eb555ce9668231b89aabb8954 (patch) | |
tree | c66727af638d7f1716d32c94f20547b00afb999c | |
parent | c4cdecc05f128bac3842852f114b96eaa821f2ca (diff) |
* 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 ****>>
-rw-r--r-- | core/controllers/admin_maintenance.php | 76 | ||||
-rw-r--r-- | core/helpers/core_installer.php | 4 | ||||
-rw-r--r-- | core/helpers/task.php | 101 | ||||
-rw-r--r-- | core/libraries/Task_Definition.php | 5 | ||||
-rw-r--r-- | core/models/task.php | 18 | ||||
-rw-r--r-- | core/views/admin_maintenance.html.php | 12 | ||||
-rw-r--r-- | installer/install.sql | 4 |
7 files changed, 157 insertions, 63 deletions
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 @@ -19,24 +19,6 @@ */ 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. */ public function index() { @@ -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 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2008 Bharat Mediratta + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ +class task_Core { + /** + * Get all available tasks + */ + static function get_task_definitions($type=array("admin", "both")) { + $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) { + 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 @@ -56,6 +56,9 @@ <?= t("Info") ?> </th> <th> + <?= t("Owner") ?> + </th> + <th> <?= t("Action") ?> </th> </tr> @@ -83,6 +86,9 @@ <?= $task->status ?> </td> <td> + <?= $task->user_name ?> + </td> + <td> <? if ($task->state == "stalled"): ?> <a href="<?= url::site("admin/maintenance/resume/$task->id?csrf=$csrf") ?>" class="gDialogLink"> <?= t("resume") ?> @@ -115,6 +121,9 @@ <?= t("Info") ?> </th> <th> + <?= t("Owner") ?> + </th> + <th> <?= t("Action") ?> </th> </tr> @@ -139,6 +148,9 @@ <?= $task->status ?> </td> <td> + <?= $task->user_name ?> + </td> + <td> <? if ($task->done): ?> <a href="<?= url::site("admin/maintenance/remove/$task->id?csrf=$csrf") ?>"> <?= t("remove") ?> diff --git a/installer/install.sql b/installer/install.sql index 72416653..bedbec55 100644 --- a/installer/install.sql +++ b/installer/install.sql @@ -272,7 +272,9 @@ CREATE TABLE `tasks` ( `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; SET character_set_client = @saved_cs_client; DROP TABLE IF EXISTS `themes`; |