summaryrefslogtreecommitdiff
path: root/modules/tag
diff options
context:
space:
mode:
authorBharat Mediratta <bharat@menalto.com>2011-04-23 13:16:27 -0700
committerBharat Mediratta <bharat@menalto.com>2011-04-23 13:16:27 -0700
commitb57b229543aeab096e8574e9f27cff5d6a9ed07c (patch)
treea9e9595ef6f3a88b3c33e94068191cc148b7160b /modules/tag
parentc1779a9e8f1a2c3cbda576815a37fd9b67b3c82c (diff)
parentc101151616033d53587d1435881dae0fa45aeefa (diff)
Merge branch 'alindeman/1628' of git://github.com/alindeman/gallery3 into andy
Diffstat (limited to 'modules/tag')
-rw-r--r--modules/tag/controllers/admin_tags.php11
-rw-r--r--modules/tag/models/tag.php24
-rw-r--r--modules/tag/tests/Tag_Test.php50
3 files changed, 64 insertions, 21 deletions
diff --git a/modules/tag/controllers/admin_tags.php b/modules/tag/controllers/admin_tags.php
index 73042a55..fd82bc92 100644
--- a/modules/tag/controllers/admin_tags.php
+++ b/modules/tag/controllers/admin_tags.php
@@ -81,9 +81,7 @@ class Admin_Tags_Controller extends Admin_Controller {
$in_place_edit = InPlaceEdit::factory($tag->name)
->action("admin/tags/rename/$tag->id")
- ->rules(array("required", "length[1,64]"))
- ->messages(array("in_use" => t("There is already a tag with that name")))
- ->callback(array($this, "check_for_duplicate"));
+ ->rules(array("required", "length[1,64]"));
if ($in_place_edit->validate()) {
$old_name = $tag->name;
@@ -101,12 +99,5 @@ class Admin_Tags_Controller extends Admin_Controller {
}
}
- public function check_for_duplicate(Validation $post_data, $field) {
- $tag_exists = ORM::factory("tag")->where("name", "=", $post_data[$field])->count_all();
- if ($tag_exists) {
- $post_data->add_error($field, "in_use");
- }
- }
-
}
diff --git a/modules/tag/models/tag.php b/modules/tag/models/tag.php
index bd665667..bb79e707 100644
--- a/modules/tag/models/tag.php
+++ b/modules/tag/models/tag.php
@@ -69,13 +69,23 @@ class Tag_Model_Core extends ORM {
* to this tag.
*/
public function save() {
- $related_item_ids = array();
- foreach (db::build()
- ->select("item_id")
- ->from("items_tags")
- ->where("tag_id", "=", $this->id)
- ->execute() as $row) {
- $related_item_ids[$row->item_id] = 1;
+ // Check to see if another tag exists with the same name
+ $duplicate_tag = ORM::factory("tag")
+ ->where("name", "=", $this->name)
+ ->where("id", "!=", $this->id)
+ ->find();
+ if ($duplicate_tag->loaded()) {
+ // If so, tag its items with this tag so as to merge it
+ $duplicate_tag_items = ORM::factory("item")
+ ->join("items_tags", "items.id", "items_tags.item_id")
+ ->where("items_tags.tag_id", "=", $duplicate_tag->id)
+ ->find_all();
+ foreach ($duplicate_tag_items as $item) {
+ $this->add($item);
+ }
+
+ // ... and remove the duplicate tag
+ $duplicate_tag->delete();
}
if (isset($this->object_relations["items"])) {
diff --git a/modules/tag/tests/Tag_Test.php b/modules/tag/tests/Tag_Test.php
index f5ccb3a2..9e10fa4a 100644
--- a/modules/tag/tests/Tag_Test.php
+++ b/modules/tag/tests/Tag_Test.php
@@ -18,18 +18,60 @@
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class Tag_Test extends Gallery_Unit_Test_Case {
+ public function teardown() {
+ ORM::factory("tag")->delete_all();
+ }
+
public function create_tag_test() {
$album = test::random_album();
tag::add($album, "tag1");
$tag = ORM::factory("tag")->where("name", "=", "tag1")->find();
- $this->assert_true(1, $tag->count);
+ $this->assert_equal(1, $tag->count);
// Make sure adding the tag again doesn't increase the count
tag::add($album, "tag1");
- $this->assert_true(1, $tag->reload()->count);
+ $this->assert_equal(1, $tag->reload()->count);
tag::add(test::random_album(), "tag1");
- $this->assert_true(2, $tag->reload()->count);
+ $this->assert_equal(2, $tag->reload()->count);
+ }
+
+ public function rename_merge_tag_test() {
+ $album1 = test::random_album();
+ $album2 = test::random_album();
+
+ tag::add($album1, "tag1");
+ tag::add($album2, "tag2");
+
+ $tag1 = ORM::factory("tag")->where("name", "=", "tag1")->find();
+ $tag1->name = "tag2";
+ $tag1->save();
+
+ // Tags should be merged; $tag2 should be deleted
+ $tag1->reload();
+
+ $this->assert_equal(2, $tag1->count);
+ $this->assert_true($tag1->has($album1));
+ $this->assert_true($tag1->has($album2));
+ $this->assert_equal(1, ORM::factory("tag")->count_all());
+ }
+
+ public function rename_merge_tag_with_same_items_test() {
+ $album = test::random_album();
+
+ tag::add($album, "tag1");
+ tag::add($album, "tag2");
+
+ $tag1 = ORM::factory("tag")->where("name", "=", "tag1")->find();
+ $tag1->name = "tag2";
+ $tag1->save();
+
+ // Tags should be merged
+ $tag1->reload();
+
+ $this->assert_equal(1, $tag1->count);
+ $this->assert_true($tag1->has($album));
+ $this->assert_equal(1, ORM::factory("tag")->count_all());
}
-} \ No newline at end of file
+}