summaryrefslogtreecommitdiff
path: root/modules/tag/helpers
diff options
context:
space:
mode:
authorNathan Kinkade <nkinkade@nkinka.de>2010-02-02 02:59:20 +0000
committerNathan Kinkade <nkinkade@nkinka.de>2010-02-02 02:59:20 +0000
commit9d0927dda936756f1f5003813f437d714fe481f8 (patch)
treefe1b887345b37387ab0ddcfd78bf344f6150b6cc /modules/tag/helpers
parenta6f794c20dc3592bcaef17c622413c1b670a20d8 (diff)
parent43985ea2fb137aa7d532617271e37d7c20def3c5 (diff)
Merge branch 'master' of git://github.com/gallery/gallery3
Diffstat (limited to 'modules/tag/helpers')
-rw-r--r--modules/tag/helpers/item_tags_rest.php64
-rw-r--r--modules/tag/helpers/tag.php29
-rw-r--r--modules/tag/helpers/tag_event.php12
-rw-r--r--modules/tag/helpers/tag_item_rest.php50
-rw-r--r--modules/tag/helpers/tag_items_rest.php65
-rw-r--r--modules/tag/helpers/tag_rest.php161
-rw-r--r--modules/tag/helpers/tag_rss.php2
-rw-r--r--modules/tag/helpers/tags_rest.php60
8 files changed, 306 insertions, 137 deletions
diff --git a/modules/tag/helpers/item_tags_rest.php b/modules/tag/helpers/item_tags_rest.php
new file mode 100644
index 00000000..43e2cef0
--- /dev/null
+++ b/modules/tag/helpers/item_tags_rest.php
@@ -0,0 +1,64 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2009 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 item_tags_rest_Core {
+ static function get($request) {
+ $item = rest::resolve($request->url);
+ $tags = array();
+ foreach (tag::item_tags($item) as $tag) {
+ $tags[] = rest::url("tag_item", $tag, $item);
+ }
+
+ return array(
+ "url" => $request->url,
+ "members" => $tags);
+ }
+
+ static function post($request) {
+ $tag = rest::resolve($request->params->tag);
+ $item = rest::resolve($request->params->item);
+ access::required("view", $item);
+
+ tag::add($item, $tag->name);
+ return array(
+ "url" => rest::url("tag_item", $tag, $item),
+ "members" => array(
+ rest::url("tag", $tag),
+ rest::url("item", $item)));
+ }
+
+ static function delete($request) {
+ list ($tag, $item) = rest::resolve($request->url);
+ $tag->remove($item);
+ $tag->save();
+ }
+
+ static function resolve($id) {
+ $item = ORM::factory("item", $id);
+ if (!access::can("view", $item)) {
+ throw new Kohana_404_Exception();
+ }
+
+ return $item;
+ }
+
+ static function url($item) {
+ return url::abs_site("rest/item_tags/{$item->id}");
+ }
+}
diff --git a/modules/tag/helpers/tag.php b/modules/tag/helpers/tag.php
index 8075afe4..a500be58 100644
--- a/modules/tag/helpers/tag.php
+++ b/modules/tag/helpers/tag.php
@@ -37,17 +37,11 @@ class tag_Core {
if (!$tag->loaded()) {
$tag->name = $tag_name;
$tag->count = 0;
- $tag->save();
}
- if (!$tag->has($item)) {
- if (!$tag->add($item, $tag)) {
- throw new Exception("@todo {$tag->name} WAS_NOT_ADDED_TO {$item->id}");
- }
- $tag->count++;
- $tag->save();
- }
- return $tag;
+ $tag->add($item);
+ $tag->count++;
+ return $tag->save();
}
/**
@@ -73,6 +67,9 @@ class tag_Core {
if ($tags) {
$cloud = new View("tag_cloud.html");
$cloud->max_count = $tags[0]->count;
+ if (!$cloud->max_count) {
+ return;
+ }
usort($tags, array("tag", "sort_by_name"));
$cloud->tags = $tags;
return $cloud;
@@ -88,16 +85,10 @@ class tag_Core {
* @return array
*/
static function item_tags($item) {
- $tags = array();
- foreach (db::build()
- ->select("name")
- ->from("tags")
- ->join("items_tags", "tags.id", "items_tags.tag_id", "left")
- ->where("items_tags.item_id", "=", $item->id)
- ->execute() as $row) {
- $tags[] = $row->name;
- }
- return $tags;
+ return ORM::factory("tag")
+ ->join("items_tags", "tags.id", "items_tags.tag_id", "left")
+ ->where("items_tags.item_id", "=", $item->id)
+ ->find_all();
}
static function get_add_form($item) {
diff --git a/modules/tag/helpers/tag_event.php b/modules/tag/helpers/tag_event.php
index 6ee8e708..403ccd52 100644
--- a/modules/tag/helpers/tag_event.php
+++ b/modules/tag/helpers/tag_event.php
@@ -71,9 +71,13 @@ class tag_event_Core {
$('form input[id=tags]').autocomplete(
'$url', {max: 30, multiple: true, multipleSeparator: ',', cacheLength: 1});
});");
- $tag_value = implode(", ", tag::item_tags($item));
+
+ $tag_names = array();
+ foreach (tag::item_tags($item) as $tag) {
+ $tag_names[] = $tag->name;
+ }
$form->edit_item->input("tags")->label(t("Tags (comma separated)"))
- ->value($tag_value);
+ ->value(implode(", ", $tag_names));
}
static function item_edit_form_completed($item, $form) {
@@ -95,7 +99,9 @@ class tag_event_Core {
}
static function item_index_data($item, $data) {
- $data[] = join(" ", tag::item_tags($item));
+ foreach (tag::item_tags($item) as $tag) {
+ $data[] = $tag->name;
+ }
}
static function add_photos_form($album, $form) {
diff --git a/modules/tag/helpers/tag_item_rest.php b/modules/tag/helpers/tag_item_rest.php
new file mode 100644
index 00000000..672cec53
--- /dev/null
+++ b/modules/tag/helpers/tag_item_rest.php
@@ -0,0 +1,50 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2009 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 tag_item_rest_Core {
+ static function get($request) {
+ list ($tag, $item) = rest::resolve($request->url);
+ return array(
+ "url" => $request->url,
+ "members" => array(
+ "tag" => rest::url("tag", $tag),
+ "item" => rest::url("item", $item)));
+ }
+
+ static function delete($request) {
+ list ($tag, $item) = rest::resolve($request->url);
+ $tag->remove($item);
+ $tag->save();
+ }
+
+ static function resolve($tuple) {
+ list ($tag_id, $item_id) = split(",", $tuple);
+ $tag = ORM::factory("tag", $tag_id);
+ $item = ORM::factory("item", $item_id);
+ if (!$tag->loaded() || !$item->loaded() || !$tag->has($item) || !access::can("view", $item)) {
+ throw new Kohana_404_Exception();
+ }
+
+ return array($tag, $item);
+ }
+
+ static function url($tag, $item) {
+ return url::abs_site("rest/tag_item/{$tag->id},{$item->id}");
+ }
+}
diff --git a/modules/tag/helpers/tag_items_rest.php b/modules/tag/helpers/tag_items_rest.php
new file mode 100644
index 00000000..18973ebb
--- /dev/null
+++ b/modules/tag/helpers/tag_items_rest.php
@@ -0,0 +1,65 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2009 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 tag_items_rest_Core {
+ static function get($request) {
+ $tag = rest::resolve($request->url);
+ $items = array();
+ foreach ($tag->items() as $item) {
+ if (access::can("view", $item)) {
+ $items[] = rest::url("tag_item", $tag, $item);
+ }
+ }
+
+ return array(
+ "url" => $request->url,
+ "members" => $items);
+ }
+
+ static function post($request) {
+ $tag = rest::resolve($request->params->tag);
+ $item = rest::resolve($request->params->item);
+ access::required("view", $item);
+
+ if (!$tag->loaded()) {
+ throw new Kohana_404_Exception();
+ }
+
+ tag::add($item, $tag->name);
+ return array(
+ "url" => rest::url("tag_item", $tag, $item),
+ "members" => array(
+ "tag" => rest::url("tag", $tag),
+ "item" => rest::url("item", $item)));
+ }
+
+ static function delete($request) {
+ list ($tag, $item) = rest::resolve($request->url);
+ $tag->remove($item);
+ $tag->save();
+ }
+
+ static function resolve($id) {
+ return ORM::factory("tag", $id);
+ }
+
+ static function url($tag) {
+ return url::abs_site("rest/tag_items/{$tag->id}");
+ }
+}
diff --git a/modules/tag/helpers/tag_rest.php b/modules/tag/helpers/tag_rest.php
index cd1ca6c6..4879cf63 100644
--- a/modules/tag/helpers/tag_rest.php
+++ b/modules/tag/helpers/tag_rest.php
@@ -18,143 +18,74 @@
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class tag_rest_Core {
- // If no arguments just return all the tags. If 2 or more then it is a path then
- // return the tags for that item. But if its only 1, then is it a path or a tag?
- // Assume a tag first, if nothing is found then try finding the item.
static function get($request) {
- $resources = array();
- switch (count($request->arguments)) {
- case 0:
- $tags = ORM::factory("tag")
- ->select("name", "count")
- ->order_by("count", "DESC");
- if (!empty($request->limit)) {
- $tags->limit($request->limit);
- }
- if (!empty($request->offset)) {
- $tags->offset($request->offset);
- }
- $resources = array("tags" => array());
- foreach ($tags->find_all() as $row) {
- $resources["tags"][] = array("name" => $row->name, "count" => $row->count);
- }
- break;
- case 1:
- $resources = tag_rest::_get_items($request);
- if (!empty($resources)) {
- $resources = array("resources" => $resources);
- break;
- }
- default:
- $item = ORM::factory("item")
- ->where("relative_url_cache", "=", implode("/", $request->arguments))
- ->viewable()
- ->find();
- if ($item->loaded()) {
- $resources = array("tags" => tag::item_tags($item));
+ $tag = rest::resolve($request->url);
+ $tag_items = array();
+ foreach ($tag->items() as $item) {
+ if (access::can("view", $item)) {
+ $tag_items[] = rest::url("tag_item", $tag, $item);
}
}
- return rest::success($resources);
+ return array(
+ "url" => $request->url,
+ "entity" => $tag->as_array(),
+ "relationships" => array(
+ "items" => array(
+ "url" => rest::url("tag_items", $tag),
+ "members" => $tag_items)));
}
static function post($request) {
- if (empty($request->arguments) || count($request->arguments) != 1 || empty($request->path)) {
- throw new Rest_Exception(400, "Bad request");
- }
- $path = $request->path;
- $tags = explode(",", $request->arguments[0]);
-
- $item = ORM::factory("item")
- ->where("relative_url_cache", "=", $path)
- ->viewable()
- ->find();
- if (!$item->loaded()) {
- throw new Kohana_404_Exception();
+ if (empty($request->params->url)) {
+ throw new Rest_Exception("Bad request", 400);
}
- if (!access::can("edit", $item)) {
- throw new Kohana_404_Exception();
- }
+ $tag = rest::resolve($request->url);
+ $item = rest::resolve($request->params->url);
+ access::required("edit", $item);
- foreach ($tags as $tag) {
- tag::add($item, $tag);
- }
- return rest::success();
+ tag::add($item, $tag->name);
+ return array("url" => rest::url("tag_item", $tag, $item));
}
static function put($request) {
- if (empty($request->arguments[0]) || empty($request->new_name)) {
- throw new Rest_Exception(400, "Bad request");
+ $tag = rest::resolve($request->url);
+ if (isset($request->params->name)) {
+ $tag->name = $request->params->name;
+ $tag->save();
}
+ }
- $name = $request->arguments[0];
+ static function delete($request) {
+ $tag = rest::resolve($request->url);
+ $tag->delete();
+ }
- $tag = ORM::factory("tag")
- ->where("name", "=", $name)
- ->find();
- if (!$tag->loaded()) {
- throw new Kohana_404_Exception();
+ static function relationships($resource_type, $resource) {
+ switch ($resource_type) {
+ case "item":
+ $tags = array();
+ foreach (tag::item_tags($resource) as $tag) {
+ $tags[] = rest::url("tag_item", $tag, $resource);
+ }
+ return array(
+ "tags" => array(
+ "url" => rest::url("item_tags", $resource),
+ "members" => $tags));
}
-
- $tag->name = $request->new_name;
- $tag->save();
-
- return rest::success();
}
- static function delete($request) {
- if (empty($request->arguments[0])) {
- throw new Rest_Exception(400, "Bad request");
- }
- $tags = explode(",", $request->arguments[0]);
- if (!empty($request->path)) {
- $tag_list = ORM::factory("tag")
- ->join("items_tags", "tags.id", "items_tags.tag_id")
- ->join("items", "items.id", "items_tags.item_id")
- ->where("tags.name", "IN", $tags)
- ->where("relative_url_cache", "=", $request->path)
- ->viewable()
- ->find_all();
- } else {
- $tag_list = ORM::factory("tag")
- ->where("name", "IN", $tags)
- ->find_all();
+ static function resolve($id) {
+ $tag = ORM::factory("tag", $id);
+ if (!$tag->loaded()) {
+ throw new Kohana_404_Exception();
}
- foreach ($tag_list as $row) {
- $row->delete();
- };
-
- tag::compact();
- return rest::success();
+ return $tag;
}
- private static function _get_items($request) {
- $tags = explode(",", $request->arguments[0]);
- $items = ORM::factory("item")
- ->select_distinct("*")
- ->join("items_tags", "items.id", "items_tags.item_id")
- ->join("tags", "tags.id", "items_tags.tag_id")
- ->where("tags.name", "IN", $tags);
- if (!empty($request->limit)) {
- $items->limit($request->limit);
- }
- if (!empty($request->offset)) {
- $items->offset($request->offset);
- }
- $resources = array();
- foreach ($items->find_all() as $item) {
- $resources[] = array("type" => $item->type,
- "has_children" => $item->children_count() > 0,
- "path" => $item->relative_url(),
- "thumb_url" => $item->thumb_url(true),
- "thumb_dimensions" => array("width" => $item->thumb_width,
- "height" => $item->thumb_height),
- "has_thumb" => $item->has_thumb(),
- "title" => $item->title);
- }
-
- return $resources;
+ static function url($tag) {
+ return url::abs_site("rest/tag/{$tag->id}");
}
}
diff --git a/modules/tag/helpers/tag_rss.php b/modules/tag/helpers/tag_rss.php
index f09a4530..5d42caab 100644
--- a/modules/tag/helpers/tag_rss.php
+++ b/modules/tag/helpers/tag_rss.php
@@ -34,6 +34,8 @@ class tag_rss_Core {
if (!$tag->loaded()) {
throw new Kohana_404_Exception();
}
+
+ $feed = new stdClass();
$feed->children = $tag->items($limit, $offset, "photo");
$feed->max_pages = ceil($tag->count / $limit);
$feed->title = $tag->name;
diff --git a/modules/tag/helpers/tags_rest.php b/modules/tag/helpers/tags_rest.php
new file mode 100644
index 00000000..f28be7b5
--- /dev/null
+++ b/modules/tag/helpers/tags_rest.php
@@ -0,0 +1,60 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2009 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 tags_rest_Core {
+ static function get($request) {
+ $tags = array();
+ foreach (ORM::factory("tag")->find_all() as $tag) {
+ $tags[] = rest::url("tag", $tag);
+ }
+ return array("url" => rest::url("tags"),
+ "members" => $tags);
+ }
+
+ static function post($request) {
+ // The user must have some edit permission somewhere to create a tag.
+ if (!identity::active_user()->admin) {
+ $query = db::build()->from("access_caches")->and_open();
+ foreach (identity::active_user()->groups() as $group) {
+ $query->or_where("edit_{$group->id}", "=", access::ALLOW);
+ }
+ $has_any_edit_perm = $query->close()->count_records();
+ if (!$has_any_edit_perm) {
+ access::forbidden();
+ }
+ }
+
+ if (empty($request->params->name)) {
+ throw new Rest_Exception("Bad Request", 400);
+ }
+
+ $tag = ORM::factory("tag")->where("name", "=", $request->params->name)->find();
+ if (!$tag->loaded()) {
+ $tag->name = $request->params->name;
+ $tag->count = 0;
+ $tag->save();
+ }
+
+ return array("url" => rest::url("tag", $tag));
+ }
+
+ static function url() {
+ return url::abs_site("rest/tags");
+ }
+}