diff options
author | Bharat Mediratta <bharat@menalto.com> | 2009-08-29 10:48:23 -0700 |
---|---|---|
committer | Bharat Mediratta <bharat@menalto.com> | 2009-08-29 10:48:23 -0700 |
commit | b833cb607323000b987428c94995e18a9d07df65 (patch) | |
tree | caba6f8fb4abe617af2a5caef2bbd16f7719a5ba /modules/organize/controllers | |
parent | f257cd3d69a771ce245c432e37c9f9e7e53ad03d (diff) |
Get rid of the task infrastructure. The multiple requests greatly
slow down simple operations. We may run into problems with more
complex operations, but let's only add tasks into the mix when it's
clear that we need them.
Diffstat (limited to 'modules/organize/controllers')
-rw-r--r-- | modules/organize/controllers/organize.php | 205 |
1 files changed, 47 insertions, 158 deletions
diff --git a/modules/organize/controllers/organize.php b/modules/organize/controllers/organize.php index f25a41ca..de53c4ed 100644 --- a/modules/organize/controllers/organize.php +++ b/modules/organize/controllers/organize.php @@ -44,38 +44,63 @@ class Organize_Controller extends Controller { function move_to($album_id) { access::verify_csrf(); - $task_def = Task_Definition::factory() - ->callback("Organize_Controller::move_task_handler"); - $task = task::create($task_def, array("album_id" => $album_id, - "source_ids" => $this->input->post("source_ids"))); + $album = ORM::factory("item", $album_id); + foreach ($this->input->post("source_ids") as $source_id) { + item::move(ORM::factory("item", $source_id), $album); + } print json_encode( - array("result" => "started", - "status" => $task->status, - "url" => url::site("organize/run/$task->id?csrf=" . access::csrf_token()))); + array("tree" => self::_tree($album)->__toString(), + "grid" => self::_get_micro_thumb_grid($album, 0)->__toString())); } function rearrange($target_id, $before_or_after) { access::verify_csrf(); $target = ORM::factory("item", $target_id); - $parent = $target->parent(); - access::required("view", $parent); - access::required("edit", $parent); - - $task_def = Task_Definition::factory() - ->callback("Organize_Controller::rearrange_task_handler"); - $task = task::create( - $task_def, - array("target_id" => $target_id, - "album_id" => $parent->id, - "before_or_after" => $before_or_after, - "source_ids" => $this->input->post("source_ids"))); + $album = $target->parent(); + access::required("view", $album); + access::required("edit", $album); + + $source_ids = $this->input->post("source_ids", array()); + + if ($album->sort_column != "weight") { + $i = 0; + foreach ($album->children() as $child) { + // Do this directly in the database to avoid sending notifications + Database::Instance()->update("items", array("weight" => ++$i), array("id" => $child->id)); + } + $album->sort_column = "weight"; + $album->sort_order = "ASC"; + $album->save(); + $target->reload(); + } + + // Find the insertion point + $target_weight = $target->weight; + if ($before_or_after == "after") { + $target_weight++; + } + + // Make a hole + $count = count($source_ids); + Database::Instance()->query( + "UPDATE {items} " . + "SET `weight` = `weight` + $count " . + "WHERE `weight` >= $target_weight AND `parent_id` = {$album->id}"); + + // Insert source items into the hole + foreach ($source_ids as $source_id) { + Database::Instance()->update( + "items", array("weight" => $target_weight++), array("id" => $source_id)); + } + + module::event("album_rearrange", $album); print json_encode( - array("result" => "started", - "status" => $task->status, - "url" => url::site("organize/run/$task->id?csrf=" . access::csrf_token()))); + array("grid" => self::_get_micro_thumb_grid($album, 0)->__toString(), + "sort_column" => $album->sort_column, + "sort_order" => $album->sort_order)); } function sort_order($album_id, $col, $dir) { @@ -107,146 +132,10 @@ class Organize_Controller extends Controller { return $v; } - /** - * Run the task - */ - function run($task_id) { - access::verify_csrf(); - - $task = ORM::factory("task", $task_id); - if (!$task->loaded || $task->owner_id != user::active()->id) { - access::forbidden(); - } - - $task = task::run($task_id); - $results = array("done" => $task->done, "status" => $task->status, - "percent_complete" => $task->percent_complete); - - $album = ORM::factory("item", $task->get("album_id")); - $result = array( - "done" => $task->done, - "status" => $task->status, - "percent_complete" => $task->percent_complete); - if ($task->done) { - $result["tree"] = self::_tree($album)->__toString(); - $result["grid"] = self::_get_micro_thumb_grid($album, 0)->__toString(); - } - print json_encode($result); - } - private static function _tree($album) { $v = new View("organize_tree.html"); $v->parents = $album->parents(); $v->album = $album; return $v; } - - static function move_task_handler($task) { - $start = microtime(true); - if ($task->percent_complete == 0) { - batch::start(); - } - - $target_album = ORM::factory("item", $task->get("album_id")); - $source_ids = $task->get("source_ids", array()); - $idx = $task->get("current", 0); - $count = 0; - for (; $idx < count($source_ids) && microtime(true) - $start < 0.5; $idx++) { - item::move(ORM::factory("item", $source_ids[$idx]), $target_album); - $count++; - } - $task->set("current", $idx); - $task->percent_complete = (int)($idx / count($source_ids) * 100); - if ($task->percent_complete == 100) { - batch::stop(); - $task->done = true; - $task->state = "success"; - $parents = array(); - foreach ($target_album->parents() as $parent) { - $parents[$parent->id] = 1; - } - $parents[$target_album->id] = 1; - } - } - - static function rearrange_task_handler($task) { - $start = microtime(true); - $mode = $task->get("mode", "init"); - - if ($task->percent_complete == 0) { - batch::start(); - } - while (microtime(true) - $start < 1.5) { - switch ($mode) { - case "init": - $album = ORM::factory("item", $task->get("album_id")); - if ($album->sort_column != "weight") { - $mode = "convert-to-weight-order"; - } else { - $mode = "find-insertion-point"; - } - break; - - case "convert-to-weight-order": - $i = 0; - $album = ORM::factory("item", $task->get("album_id")); - foreach ($album->children() as $child) { - // Do this directly in the database to avoid sending notifications - Database::Instance()->update("items", array("weight" => ++$i), array("id" => $child->id)); - } - $album->sort_column = "weight"; - $album->sort_order = "ASC"; - $album->save(); - $mode = "find-insertion-point"; - $task->percent_complete = 25; - break; - - case "find-insertion-point": - $album = ORM::factory("item", $task->get("album_id")); - $target_weight = $album->weight; - - if ($task->get("before_or_after") == "after") { - $target_weight++; - } - $task->set("target_weight", $target_weight); - $task->percent_complete = 40; - $mode = "make-a-hole"; - break; - - case "make-a-hole": - $target_weight = $task->get("target_weight"); - $source_ids = $task->get("source_ids"); - $count = count($source_ids); - $album_id = $task->get("album_id"); - Database::Instance()->query( - "UPDATE {items} " . - "SET `weight` = `weight` + $count " . - "WHERE `weight` >= $target_weight AND `parent_id` = {$album_id}"); - - $mode = "insert-source-items"; - $task->percent_complete = 80; - break; - - case "insert-source-items": - $target_weight = $task->get("target_weight"); - foreach ($source_ids as $source_id) { - Database::Instance()->update( - "items", array("weight" => $target_weight++), array("id" => $source_id)); - } - $mode = "done"; - break; - - case "done": - $album = ORM::factory("item", $task->get("album_id")); - module::event("album_rearrange", $album); - batch::stop(); - $task->done = true; - $task->state = "success"; - $task->percent_complete = 100; - break; - } - } - - $task->set("mode", $mode); - } } |