summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorBharat Mediratta <bharat@menalto.com>2010-02-09 15:49:43 -0800
committerBharat Mediratta <bharat@menalto.com>2010-02-09 15:49:43 -0800
commit8a8d8b4bc4425bddb4661df3bf081d131f369171 (patch)
tree981fc3b95bb641a5ca1f43043e04adc99d909196 /modules
parent86721ce280f02dbf4127c83bb03372e09e616519 (diff)
Rename item name and slug if necessary to avoid a conflict when we
move photos. Fixes ticket #957.
Diffstat (limited to 'modules')
-rw-r--r--modules/gallery/helpers/item.php51
-rw-r--r--modules/gallery/tests/Item_Helper_Test.php28
2 files changed, 73 insertions, 6 deletions
diff --git a/modules/gallery/helpers/item.php b/modules/gallery/helpers/item.php
index 41d49ce9..36193071 100644
--- a/modules/gallery/helpers/item.php
+++ b/modules/gallery/helpers/item.php
@@ -40,7 +40,56 @@ class item_Core {
}
$source->parent_id = $target->id;
- $source->save();
+
+ // Moving may result in name or slug conflicts. If that happens, try up to 5 times to pick a
+ // random name (or slug) to avoid the conflict.
+ $orig_name = $source->name;
+ $orig_name_filename = pathinfo($source->name, PATHINFO_FILENAME);
+ $orig_name_extension = pathinfo($source->name, PATHINFO_EXTENSION);
+ $orig_slug = $source->slug;
+ for ($i = 0; $i < 5; $i++) {
+ try {
+ $source->save();
+ if ($orig_name != $source->name) {
+ switch ($source->type) {
+ case "album":
+ message::info(
+ t("Album <b>%old_name</b> renamed to <b>%new_name</b> to avoid a conflict",
+ array("old_name" => $orig_name, "new_name" => $source->name)));
+ break;
+
+ case "photo":
+ message::info(
+ t("Photo <b>%old_name</b> renamed to <b>%new_name</b> to avoid a conflict",
+ array("old_name" => $orig_name, "new_name" => $source->name)));
+ break;
+
+ case "movie":
+ message::info(
+ t("Movie <b>%old_name</b> renamed to <b>%new_name</b> to avoid a conflict",
+ array("old_name" => $orig_name, "new_name" => $source->name)));
+ break;
+ }
+ }
+ break;
+ } catch (ORM_Validation_Exception $e) {
+ $rand = rand(10, 99);
+ $errors = $e->validation->errors();
+ if (isset($errors["name"])) {
+ $source->name = $orig_name_filename . "-{$rand}." . $orig_name_extension;
+ unset($errors["name"]);
+ }
+ if (isset($errors["slug"])) {
+ $source->slug = $orig_slug . "-{$rand}";
+ unset($errors["slug"]);
+ }
+
+ if ($errors) {
+ // There were other validation issues-- we don't know how to handle those
+ throw $e;
+ }
+ }
+ }
// If the target has no cover item, make this it.
if ($target->album_cover_item_id == null) {
diff --git a/modules/gallery/tests/Item_Helper_Test.php b/modules/gallery/tests/Item_Helper_Test.php
index d6817ef9..50587702 100644
--- a/modules/gallery/tests/Item_Helper_Test.php
+++ b/modules/gallery/tests/Item_Helper_Test.php
@@ -19,6 +19,10 @@
*/
class Item_Helper_Test extends Gallery_Unit_Test_Case {
+ public function setup() {
+ identity::set_active_user(identity::admin_user());
+ }
+
public function viewable_test() {
$album = test::random_album();
$item = test::random_photo($album);
@@ -44,7 +48,6 @@ class Item_Helper_Test extends Gallery_Unit_Test_Case {
}
public function move_test() {
- identity::set_active_user(identity::admin_user());
$photo = test::random_photo(item::root());
$dst_album = test::random_album();
@@ -54,8 +57,6 @@ class Item_Helper_Test extends Gallery_Unit_Test_Case {
public function move_updates_album_covers_test() {
- identity::set_active_user(identity::admin_user());
-
// 2 photos in the source album
$src_album = test::random_album();
$photo1 = test::random_photo($src_album);
@@ -78,8 +79,6 @@ class Item_Helper_Test extends Gallery_Unit_Test_Case {
}
public function move_leaves_empty_album_with_no_album_cover_test() {
- identity::set_active_user(identity::admin_user());
-
$src_album = test::random_album();
$photo = test::random_photo($src_album);
@@ -89,4 +88,23 @@ class Item_Helper_Test extends Gallery_Unit_Test_Case {
$this->assert_false($src_album->album_cover_item_id);
}
+ public function move_conflicts_result_in_a_rename_test() {
+ $rand = rand();
+ $photo1 = test::random_photo_unsaved(item::root());
+ $photo1->name = "{$rand}.jpg";
+ $photo1->slug = (string)$rand;
+ $photo1->save();
+
+ $src_album = test::random_album();
+ $photo2 = test::random_photo_unsaved($src_album);
+ $photo2->name = "{$rand}.jpg";
+ $photo2->slug = (string)$rand;
+ $photo2->save();
+
+ item::move($photo2, item::root());
+
+ $this->assert_same(item::root()->id, $photo2->parent_id);
+ $this->assert_not_same("{$rand}.jpg", $photo2->name);
+ $this->assert_not_same($rand, $photo2->slug);
+ }
}