summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Almdal <tnalmdal@shaw.ca>2009-04-08 15:11:55 +0000
committerTim Almdal <tnalmdal@shaw.ca>2009-04-08 15:11:55 +0000
commit523c467eed670c59580ede2ab1dbe8b4ad59c800 (patch)
tree149ee450f7430c5f2fb34ff6e3143865cf5cce54
parentb6f59e17f1a7f5627eea807dcd049bbc6242d3e6 (diff)
Fixes issues with Server Add:
1) Fixes Ticket #208 2) Fixes Ticket #190 3) Fixes an unticketed issue where two items could collide when creating the thumbnail and/or resize. For example, loading a.flv and a.jpg would have generated the same thumbnail image. This change adds a random value to the name to avoid conflicts. 4) Added item::__set() to clear the relative path if the name changes
-rw-r--r--core/helpers/movie.php3
-rw-r--r--core/helpers/photo.php11
-rw-r--r--core/models/item.php11
-rw-r--r--modules/server_add/controllers/server_add.php46
-rw-r--r--modules/server_add/helpers/server_add_task.php77
-rw-r--r--modules/server_add/js/server_add.js16
6 files changed, 97 insertions, 67 deletions
diff --git a/core/helpers/movie.php b/core/helpers/movie.php
index 658bc185..7ec4c2e0 100644
--- a/core/helpers/movie.php
+++ b/core/helpers/movie.php
@@ -79,7 +79,8 @@ class movie_Core {
$movie->add_to_parent($parent);
// If the thumb or resize already exists then rename it
- if (file_exists($movie->resize_path()) || file_exists($movie->thumb_path())) {
+ if (file_exists($movie->resize_path()) ||
+ file_exists($movie->thumb_path())) {
$movie->name = $pi["filename"] . "-" . rand() . "." . $pi["extension"];
$movie->save();
}
diff --git a/core/helpers/photo.php b/core/helpers/photo.php
index a3f88ecb..a6934286 100644
--- a/core/helpers/photo.php
+++ b/core/helpers/photo.php
@@ -74,11 +74,17 @@ class photo_Core {
// @todo Improve this. Random numbers are not user friendly
$photo->name = rand() . "." . $pi["extension"];
}
+
// This saves the photo
$photo->add_to_parent($parent);
- // If the thumb or resize already exists then rename it
- if (file_exists($photo->resize_path()) || file_exists($photo->thumb_path())) {
+ /*
+ * If the thumb or resize already exists then rename it. We need to do this after the save
+ * because the resize_path and thumb_path both call relative_path which caches the
+ * path. Before add_to_parent the relative path will be incorrect.
+ */
+ if (file_exists($photo->resize_path()) ||
+ file_exists($photo->thumb_path())) {
$photo->name = $pi["filename"] . "-" . rand() . "." . $pi["extension"];
$photo->save();
}
@@ -91,7 +97,6 @@ class photo_Core {
graphics::generate($photo);
// If the parent has no cover item, make this it.
- $parent = $photo->parent();
if ($parent->album_cover_item_id == null) {
$parent->album_cover_item_id = $photo->id;
$parent->save();
diff --git a/core/models/item.php b/core/models/item.php
index b28f71fe..156080c2 100644
--- a/core/models/item.php
+++ b/core/models/item.php
@@ -288,6 +288,17 @@ class Item_Model extends ORM_MPTT {
}
/**
+ * @see ORM::__set()
+ */
+ public function __set($column, $value) {
+ if ($column == "name") {
+ // Clear the relative path as it is no longer valid.
+ $this->relative_path = null;
+ }
+ parent::__set($column, $value);
+ }
+
+ /**
* @see ORM::save()
*/
public function save() {
diff --git a/modules/server_add/controllers/server_add.php b/modules/server_add/controllers/server_add.php
index dd6c5d00..8c99af24 100644
--- a/modules/server_add/controllers/server_add.php
+++ b/modules/server_add/controllers/server_add.php
@@ -66,19 +66,22 @@ class Server_Add_Controller extends Controller {
function start($id) {
access::verify_csrf();
+ $paths = unserialize(module::get_var("server_add", "authorized_paths"));
+ $input_files = $this->input->post("path");
$files = array();
- foreach ($this->input->post("path") as $path) {
- if (is_dir($path)) {
- $dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), true);
- foreach ($dir as $file) {
- $extension = strtolower(substr(strrchr($file->getFilename(), '.'), 1));
- if ($file->isReadable() &&
- in_array($extension, array("gif", "jpeg", "jpg", "png", "flv", "mp4"))) {
- $files[] = $file->getPathname();
- }
+ $total_count = 0;
+ foreach (array_keys($paths) as $valid_path) {
+ $path_length = strlen($valid_path);
+ foreach ($input_files as $key => $path) {
+ if ($path_valid = strpos($path, $valid_path) === 0) {
+ $relative_path = substr(dirname($path), $path_length);
+ $name = basename($path);
+ $files[$valid_path][] = array("path" => $relative_path,
+ "parent_id" => $id, "name" => basename($path),
+ "type" => is_dir($path) ? "album" : "file");
+ $total_count++;
+ unset($input_files[$key]);
}
- } else {
- $files[] = $path;
}
}
@@ -86,13 +89,18 @@ class Server_Add_Controller extends Controller {
->callback("server_add_task::add_from_server")
->description(t("Add photos or movies from the local server"))
->name(t("Add from server"));
- $task = task::create($task_def, array("item_id" => $id, "next" => 0, "paths" => $files));
+ $task = task::create($task_def, array("item_id" => $id, "next_path" => 0, "files" => $files,
+ "counter" => 0, "position" => 0, "total" => $total_count));
batch::start();
print json_encode(array("result" => "started",
"url" => url::site("server_add/add_photo/{$task->id}?csrf=" .
access::csrf_token()),
- "task" => $task->as_array()));
+ "task" => array(
+ "id" => $task->id,
+ "percent_complete" => $task->percent_complete,
+ "status" => $task->status,
+ "done" => $task->done)));
}
function add_photo($task_id) {
@@ -111,11 +119,19 @@ class Server_Add_Controller extends Controller {
break;
}
print json_encode(array("result" => "success",
- "task" => $task->as_array()));
+ "task" => array(
+ "id" => $task->id,
+ "percent_complete" => $task->percent_complete,
+ "status" => $task->status,
+ "done" => $task->done)));
} else {
print json_encode(array("result" => "in_progress",
- "task" => $task->as_array()));
+ "task" => array(
+ "id" => $task->id,
+ "percent_complete" => $task->percent_complete,
+ "status" => $task->status,
+ "done" => $task->done)));
}
}
diff --git a/modules/server_add/helpers/server_add_task.php b/modules/server_add/helpers/server_add_task.php
index 1475a28a..2812777d 100644
--- a/modules/server_add/helpers/server_add_task.php
+++ b/modules/server_add/helpers/server_add_task.php
@@ -26,60 +26,57 @@ class server_add_task_Core {
static function add_from_server($task) {
$context = unserialize($task->context);
try {
- $parent = ORM::factory("item", $context["item_id"]);
+ $paths = array_keys(unserialize(module::get_var("server_add", "authorized_paths")));
+ $path = $paths[$context["next_path"]];
+ $file = $context["files"][$path][$context["position"]];
+ $parent = ORM::factory("item", $file["parent_id"]);
access::required("server_add", $parent);
if (!$parent->is_album()) {
throw new Exception("@todo BAD_ALBUM");
}
- $paths = unserialize(module::get_var("server_add", "authorized_paths"));
- $path = $context["paths"][$context["next"]];
-
- $path_valid = false;
- $item_path = "";
- foreach (array_keys($paths) as $valid_path) {
- if ($path_valid = strpos($path, $valid_path) === 0) {
- $item_path = substr($path, strlen($valid_path));
- $item_path = explode("/", ltrim($item_path,"/"));
- $source_path = $valid_path;
- break;
- }
- }
- if (empty($path_valid)) {
- throw new Exception("@todo BAD_PATH");
- }
- for ($i = 0; $i < count($item_path); $i++) {
- $name = $item_path[$i];
- $source_path .= "/$name";
- if (is_link($source_path) || !is_readable($source_path)) {
- kohana::show_404();
+ $name = $file["name"];
+ if ($file["type"] == "album") {
+ $album = ORM::factory("item")
+ ->where("name", $name)
+ ->where("parent_id", $parent->id)
+ ->find();
+ if (!$album->loaded) {
+ $album = album::create($parent, $name, $name, null, user::active()->id);
}
- $pathinfo = pathinfo($source_path);
- set_time_limit(30);
- if (is_dir($source_path)) {
- $album = ORM::factory("item")
- ->where("name", $name)
- ->where("parent_id", $parent->id)
- ->find();
- if (!$album->loaded) {
- $album = album::create($parent, $name, $name, null, user::active()->id);
+ /*
+ * Now that we have a new album. Go through the remaining files to import and change the
+ * parent_id of any file that has the same relative path as this album's path.
+ */
+ $album_path = "{$file['path']}/$name";
+ for ($idx = $context["position"] + 1; $idx < count($context["files"][$path]); $idx++) {
+ if (strpos($context["files"][$path][$idx]["path"], $album_path) === 0) {
+ $context["files"][$path][$idx]["parent_id"] = $album->id;
}
- $parent = $album;
- } else if (in_array($pathinfo["extension"], array("flv", "mp4"))) {
- $movie = movie::create($parent, $source_path, basename($source_path),
- basename($source_path), null, user::active()->id);
+ }
+ } else {
+ $extension = strtolower(substr(strrchr($name, '.'), 1));
+ $source_path = "$path{$file['path']}/$name";
+ if (in_array($extension, array("flv", "mp4"))) {
+ $movie = movie::create($parent, $source_path, $name, $name,
+ null, user::active()->id);
} else {
- $photo = photo::create($parent, $source_path, basename($source_path),
- basename($source_path), null, user::active()->id);
+ $photo = photo::create($parent, $source_path, $name, $name,
+ null, user::active()->id);
}
}
+
+ $context["counter"]++;
+ if (++$context["position"] >= count($context["files"][$path])) {
+ $context["next_path"]++;
+ $context["position"] = 0;
+ }
} catch(Exception $e) {
$context["errors"][$path] = $e->getMessage();
}
- $task->done = (++$context["next"]) >= count($context["paths"]);
$task->context = serialize($context);
$task->state = "success";
- $task->percent_complete = ($context["next"] / (float)count($context["paths"])) * 100;
+ $task->percent_complete = ($context["counter"] / (float)$context["total"]) * 100;
+ $task->done = $context["counter"] == (float)$context["total"];
}
-
} \ No newline at end of file
diff --git a/modules/server_add/js/server_add.js b/modules/server_add/js/server_add.js
index addc3121..570f3946 100644
--- a/modules/server_add/js/server_add.js
+++ b/modules/server_add/js/server_add.js
@@ -40,8 +40,6 @@ function open_close_branch(icon, event) {
$(parent).append(data);
$(icon).addClass("ui-icon-minus");
$(icon).removeClass("ui-icon-plus");
- var checkbox = $(parent).find(":checkbox")[0];
- checkbox_click(checkbox, null);
});
} else {
$(icon).addClass("ui-icon-minus");
@@ -63,9 +61,15 @@ function get_url(uri, task_id) {
}
function checkbox_click(checkbox, event) {
+ var _this = this;
var parents = $(checkbox).parents("li");
var parent = parents.get(0);
- $(parent).find(".gCheckboxTree :checkbox").attr("checked", checkbox.checked);
+ if ($(parent).hasClass("gDirectory") && $(parent).find(".gCheckboxTree").length == 0) {
+ load_children(parent, function(data, textStatus) {
+ $(parent).append(data);
+ });
+ }
+ $(parent).find(".gCheckboxTree :checkbox").click();
var checked = $("#gServerAdd :checkbox[checked]");
$("#gServerAdd form :submit").attr("disabled", checked.length == 0);
}
@@ -95,11 +99,7 @@ function do_add(submit, event) {
var parms = "";
$.each(check_list, function () {
var parent = $(this).parents("li")[0];
- // If its a file or a directory with no children
- if ($(parent).hasClass("gFile") ||
- ($(parent).hasClass("gDirectory") && $(parent).find(".gCheckboxTree").length == 0)) {
- parms += "&path[]=" + this.value;
- }
+ parms += "&path[]=" + this.value;
});
}
paused = false;