summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Almdal <tnalmdal@shaw.ca>2009-02-27 16:28:20 +0000
committerTim Almdal <tnalmdal@shaw.ca>2009-02-27 16:28:20 +0000
commitdc4f784558db725eb555ce9668231b89aabb8954 (patch)
treec66727af638d7f1716d32c94f20547b00afb999c
parentc4cdecc05f128bac3842852f114b96eaa821f2ca (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.php76
-rw-r--r--core/helpers/core_installer.php4
-rw-r--r--core/helpers/task.php101
-rw-r--r--core/libraries/Task_Definition.php5
-rw-r--r--core/models/task.php18
-rw-r--r--core/views/admin_maintenance.html.php12
-rw-r--r--installer/install.sql4
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`;