From 76c6031b0446301ee508e232c4f7645db3b77cd5 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Tue, 7 Feb 2012 23:15:23 -0500 Subject: [PATCH 01/19] Working on fixing the Pools extension. --- contrib/pools/main.php | 86 +++++++++++++++++++++++++---------------- contrib/pools/theme.php | 48 ++++++++++------------- 2 files changed, 73 insertions(+), 61 deletions(-) diff --git a/contrib/pools/main.php b/contrib/pools/main.php index a679f222..cc2a7b07 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -1,16 +1,28 @@ + * Author: Sein Kraft , jgen * License: GPLv2 - * Description: Allow users to create groups of images - * Documentation: + * Description: Allow users to create groups of images and order them. + * Documentation: This extension allows users to created named groups of + * images, and order the images within the group. + * Useful for related images like in a comic, etc. */ +/** + * This class is just a wrapper around SCoreException. + */ class PoolCreationException extends SCoreException { + var $error; + + public function __construct($error) { + $this->error = $error; + } } + class Pools extends SimpleExtension { + public function onInitExt($event) { global $config, $database; @@ -67,8 +79,16 @@ class Pools extends SimpleExtension { public function onPageRequest($event) { global $config, $page, $user; + + if ($event->page_matches("pool")) { - if($event->page_matches("pool")) { + var $pool_id, $pool; + // Check if we have pool id, since this is most often the case. + if (isset($_POST["pool_id"])) { + $pool_id = int_escape($_POST["pool_id"]); + $pool = $this->get_single_pool($pool_id); + } + switch($event->get_arg(0)) { case "list": //index $this->list_pools($page, int_escape($event->get_arg(1))); @@ -89,8 +109,8 @@ class Pools extends SimpleExtension { $page->set_mode("redirect"); $page->set_redirect(make_link("pool/view/".$newPoolID)); } - catch(PoolCreationException $pce) { - $this->theme->display_error($pce->getMessage()); + catch(PoolCreationException $e) { + $this->theme->display_error($e->error); } break; @@ -117,8 +137,7 @@ class Pools extends SimpleExtension { $pools = $this->get_pool($poolID); foreach($pools as $pool) { - // if the pool is public and user is logged OR if the user is admin OR the user is the owner - if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + if (have_permission($user, $pool)) { $this->theme->edit_pool($page, $this->get_pool($poolID), $this->edit_posts($poolID)); } else { $page->set_mode("redirect"); @@ -133,8 +152,7 @@ class Pools extends SimpleExtension { $pools = $this->get_pool($poolID); foreach($pools as $pool) { - //if the pool is public and user is logged OR if the user is admin - if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + if (have_permission($user, $pool)) { $this->theme->edit_order($page, $this->get_pool($poolID), $this->edit_order($poolID)); } else { $page->set_mode("redirect"); @@ -143,10 +161,7 @@ class Pools extends SimpleExtension { } } else { - $pool_id = int_escape($_POST["pool_id"]); - $pool = $this->get_single_pool($pool_id); - - if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + if (have_permission($user, $pool)) { $this->order_posts(); $page->set_mode("redirect"); $page->set_redirect(make_link("pool/view/".$pool_id)); @@ -157,10 +172,7 @@ class Pools extends SimpleExtension { break; case "import": - $pool_id = int_escape($_POST["pool_id"]); - $pool = $this->get_single_pool($pool_id); - - if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + if (have_permission($user, $pool)) { $this->import_posts(); } else { $this->theme->display_error("Permssion denied."); @@ -168,10 +180,7 @@ class Pools extends SimpleExtension { break; case "add_posts": - $pool_id = int_escape($_POST["pool_id"]); - $pool = $this->get_single_pool($pool_id); - - if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + if (have_permission($user, $pool)) { $this->add_posts(); $page->set_mode("redirect"); $page->set_redirect(make_link("pool/view/".$pool_id)); @@ -181,10 +190,7 @@ class Pools extends SimpleExtension { break; case "remove_posts": - $pool_id = int_escape($_POST["pool_id"]); - $pool = $this->get_single_pool($pool_id); - - if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) { + if (have_permission($user, $pool)) { $this->remove_posts(); $page->set_mode("redirect"); $page->set_redirect(make_link("pool/view/".$pool_id)); @@ -195,11 +201,8 @@ class Pools extends SimpleExtension { break; case "nuke": - $pool_id = int_escape($_POST['pool_id']); - $pool = $this->get_single_pool($pool_id); - - // only admins and owners may do this - if($user->is_admin() || $user->id == $pool['user_id']) { + // only admins and owners may do this + if($user->is_admin() || $user->id == $pool['user_id']) { $this->nuke_pool($pool_id); $page->set_mode("redirect"); $page->set_redirect(make_link("pool/list")); @@ -257,7 +260,24 @@ class Pools extends SimpleExtension { } } - + /* ------------------------------------------------- */ + /* -------------- Private Functions -------------- */ + /* ------------------------------------------------- */ + + /** + * Check if the given user has permission to edit/change the pool. + * @retval bool + */ + private function have_permission($user, $pool) { + // If the pool is public and user is logged OR if the user is admin OR if the pool is owned by the user. + if ( (($pool['public'] == "Y" || $pool['public'] == "y") && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) + { + return true; + } else { + return false; + } + } + /* * HERE WE GET THE LIST OF POOLS */ @@ -420,7 +440,7 @@ class Pools extends SimpleExtension { $count = $database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", array("pid"=>$poolID)); $this->add_history($poolID, 0, $images, $count); - return $poolID; + return $poolID; } diff --git a/contrib/pools/theme.php b/contrib/pools/theme.php index 1f44a904..4fa35ca6 100644 --- a/contrib/pools/theme.php +++ b/contrib/pools/theme.php @@ -1,7 +1,8 @@ "; - $nav_html = " Index
Create Pool @@ -154,9 +154,7 @@ class PoolsTheme extends Themelet { $pool_images = ''; foreach($images as $image) { $thumb_html = $this->build_thumb_html($image); - $pool_images .= ''. - ''.$thumb_html.''. - ''; + $pool_images .= "\n".$thumb_html."\n"; } $page->add_block(new Block("Viewing Posts", $pool_images, "main", 30)); @@ -172,17 +170,17 @@ class PoolsTheme extends Themelet { $editor = " ".make_form(make_link("pool/import"))." - - + +
- +
- +
"; @@ -195,7 +193,7 @@ class PoolsTheme extends Themelet { ".make_form(make_link("pool/nuke"))." - + "; @@ -225,6 +223,7 @@ class PoolsTheme extends Themelet { * HERE WE DISPLAY THE RESULT OF THE SEARCH ON IMPORT */ public function pool_result(Page $page, $images, $pool_id) { + // TODO: this could / should be done using jQuery $pool_images = " ".make_form(make_link("pool/nuke"))." - - + + "; } From 44d7fe2689a06501ce86f11a561d2673bed3c317 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Wed, 8 Feb 2012 14:14:11 -0500 Subject: [PATCH 06/19] Change to $pool_id --- contrib/pools/main.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/pools/main.php b/contrib/pools/main.php index ddc703ea..b344d477 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -142,10 +142,10 @@ class Pools extends SimpleExtension { //foreach($pools as $pool) { if ($this->have_permission($user, $pool)) { - $this->theme->edit_pool($page, $this->get_pool($poolID), $this->edit_posts($poolID)); + $this->theme->edit_pool($page, $this->get_pool($pool_id), $this->edit_posts($pool_id)); } else { $page->set_mode("redirect"); - $page->set_redirect(make_link("pool/view/".$poolID)); + $page->set_redirect(make_link("pool/view/".$pool_id)); } //} break; @@ -157,10 +157,10 @@ class Pools extends SimpleExtension { //foreach($pools as $pool) { if ($this->have_permission($user, $pool)) { - $this->theme->edit_order($page, $this->get_pool($poolID), $this->edit_order($poolID)); + $this->theme->edit_order($page, $this->get_pool($pool_id), $this->edit_order($pool_id)); } else { $page->set_mode("redirect"); - $page->set_redirect(make_link("pool/view/".$poolID)); + $page->set_redirect(make_link("pool/view/".$pool_id)); } //} } From d2be97d446a20bd22540b930e414afdf0370311a Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Wed, 8 Feb 2012 14:39:01 -0500 Subject: [PATCH 07/19] Fixed while loops. Also added some type hints and more comments. --- contrib/pools/main.php | 73 +++++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/contrib/pools/main.php b/contrib/pools/main.php index b344d477..ab51d8d4 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -177,7 +177,7 @@ class Pools extends SimpleExtension { case "import": if ($this->have_permission($user, $pool)) { - $this->import_posts(); + $this->import_posts($pool_id); } else { $this->theme->display_error("Permssion denied."); } @@ -347,7 +347,7 @@ class Pools extends SimpleExtension { * @param $poolID Array of integers * @retval 2D Array */ - private function get_pool($poolID) { + private function get_pool(/*int*/ $poolID) { global $database; return $database->get_all("SELECT * FROM pools WHERE id=:id", array("id"=>$poolID)); } @@ -357,7 +357,7 @@ class Pools extends SimpleExtension { * @param $poolID Integer * @retval 2D array (with only 1 element in the one dimension) */ - private function get_single_pool($poolID) { + private function get_single_pool(/*int*/ $poolID) { global $database; return $database->get_row("SELECT * FROM pools WHERE id=:id", array("id"=>$poolID)); } @@ -367,7 +367,7 @@ class Pools extends SimpleExtension { * @param $imageID Integer * @retval 2D array */ - private function get_pool_id($imageID) { + private function get_pool_id(/*int*/ $imageID) { global $database; return $database->get_all("SELECT pool_id FROM pool_images WHERE image_id=:iid", array("iid"=>$imageID)); } @@ -376,13 +376,11 @@ class Pools extends SimpleExtension { /* * HERE WE GET THE IMAGES FROM THE TAG ON IMPORT */ - private function import_posts() { + private function import_posts(/*int*/ $pool_id) { global $page, $config, $database; - $pool_id = int_escape($_POST["pool_id"]); - $poolsMaxResults = $config->get_int("poolsMaxImportResults", 1000); - + $images = $images = Image::find_images(0, $poolsMaxResults, Tag::explode($_POST["pool_tag"])); $this->theme->pool_result($page, $images, $pool_id); } @@ -390,6 +388,8 @@ class Pools extends SimpleExtension { /* * HERE WE ADD CHECKED IMAGES FROM POOL AND UPDATE THE HISTORY + * + * TODO: Fix this so that the pool ID and images are passed as Arguments to the function. */ private function add_posts() { global $database; @@ -423,6 +423,9 @@ class Pools extends SimpleExtension { return $poolID; } + /* + * TODO: Fix this so that the pool ID and images are passed as Arguments to the function. + */ private function order_posts() { global $database; @@ -444,6 +447,8 @@ class Pools extends SimpleExtension { /* * HERE WE REMOVE CHECKED IMAGES FROM POOL AND UPDATE THE HISTORY + * + * TODO: Fix this so that the pool ID and images are passed as Arguments to the function. */ private function remove_posts() { global $database; @@ -462,11 +467,16 @@ class Pools extends SimpleExtension { } - /* - * HERE WE CHECK IF THE POST IS ALREADY ON POOL - * USED IN add_posts() + /** + * This function checks if a given image is contained within a given pool. + * Used by add_posts() + * + * @see add_posts() + * @param $poolID integer + * @param $imageID integer + * @retval bool */ - private function check_post($poolID, $imageID) { + private function check_post(/*int*/ $poolID, /*int*/ $imageID) { global $database; $result = $database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid AND image_id=:iid", array("pid"=>$poolID, "iid"=>$imageID)); return ($result != 0); @@ -476,7 +486,7 @@ class Pools extends SimpleExtension { /** * Retrieve all the images in a pool, given a pool ID. */ - private function get_posts($event, $poolID) { + private function get_posts($event, /*int*/ $poolID) { global $config, $user, $database; $pageNumber = int_escape($event->get_arg(2)); @@ -536,21 +546,22 @@ class Pools extends SimpleExtension { } - /* - * WE GET THE ORDER OF THE IMAGES + /** + * This function gets the current order of images from a given pool. + * @param $poolID integer + * @retval Array of image objects. */ - private function edit_posts($poolID) { + private function edit_posts(/*int*/ $poolID) { global $database; $result = $database->Execute("SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC", array("pid"=>$poolID)); - $images = array(); - while(!$result->EOF) { - $image = Image::by_id($result->fields["image_id"]); + + while($row = $result->fetch()) { + $image = Image::by_id($row["image_id"]); $images[] = array($image); - $result->MoveNext(); } - + return $images; } @@ -558,11 +569,23 @@ class Pools extends SimpleExtension { /* * WE GET THE ORDER OF THE IMAGES BUT HERE WE SEND KEYS ADDED IN ARRAY TO GET THE ORDER IN THE INPUT VALUE */ - private function edit_order($poolID) { + private function edit_order(/*int*/ $poolID) { global $database; $result = $database->Execute("SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC", array("pid"=>$poolID)); $images = array(); + + while($row = $result->fetch()) + { + $image = $database->get_row(" + SELECT * FROM images AS i + INNER JOIN pool_images AS p ON i.id = p.image_id + WHERE pool_id=:pid AND i.id=:iid", + array("pid"=>$poolID, "iid"=>$row['image_id'])); + $image = ($image ? new Image($image) : null); + $images[] = array($image); + } + while(!$result->EOF) { $image = $database->get_row(" SELECT * FROM images AS i @@ -588,7 +611,7 @@ class Pools extends SimpleExtension { /* * HERE WE NUKE ENTIRE POOL. WE REMOVE POOLS AND POSTS FROM REMOVED POOL AND HISTORIES ENTRIES FROM REMOVED POOL */ - private function nuke_pool($poolID) { + private function nuke_pool(/*int*/ $poolID) { global $user, $database; $p_id = $database->get_one("SELECT user_id FROM pools WHERE id = :pid", array("pid"=>$poolID)); @@ -608,7 +631,7 @@ class Pools extends SimpleExtension { * HERE WE ADD A HISTORY ENTRY * FOR $action 1 (one) MEANS ADDED, 0 (zero) MEANS REMOVED */ - private function add_history($poolID, $action, $images, $count) { + private function add_history(/*int*/ $poolID, $action, $images, $count) { global $user, $database; $database->execute(" INSERT INTO pool_history (pool_id, user_id, action, images, count, date) @@ -620,7 +643,7 @@ class Pools extends SimpleExtension { /* * HERE WE GET THE HISTORY LIST */ - private function get_history($pageNumber) { + private function get_history(/*int*/ $pageNumber) { global $config, $database; if(is_null($pageNumber) || !is_numeric($pageNumber)) From c30743d22d23400b67a9866f494338e8630d7b3e Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Wed, 8 Feb 2012 14:49:52 -0500 Subject: [PATCH 08/19] Cleaning up the code and adding type hints. --- contrib/pools/main.php | 47 ++++++++++++++++++----------------------- contrib/pools/theme.php | 20 +++++++++--------- 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/contrib/pools/main.php b/contrib/pools/main.php index ab51d8d4..02203c3a 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -26,6 +26,7 @@ class Pools extends SimpleExtension { public function onInitExt($event) { global $config, $database; + // Create the database tables if ($config->get_int("ext_pools_version") < 1){ $database->create_table("pools", " id SCORE_AIPK, @@ -92,7 +93,8 @@ class Pools extends SimpleExtension { $pool_id = int_escape($_POST["pool_id"]); $pool = $this->get_single_pool($pool_id); } - + + // What action are we trying to perform? switch($event->get_arg(0)) { case "list": //index $this->list_pools($page, int_escape($event->get_arg(1))); @@ -136,33 +138,23 @@ class Pools extends SimpleExtension { } break; - case "edit": - //$poolID = int_escape($event->get_arg(1)); - //$pools = $this->get_pool($poolID); + case "edit": // Edit the pool (remove images) + if ($this->have_permission($user, $pool)) { + $this->theme->edit_pool($page, $this->get_pool($pool_id), $this->edit_posts($pool_id)); + } else { + $page->set_mode("redirect"); + $page->set_redirect(make_link("pool/view/".$pool_id)); + } + break; - //foreach($pools as $pool) { + case "order": // Order the pool (view and change the order of images within the pool) + if (isset($_POST["order_view"])) { if ($this->have_permission($user, $pool)) { - $this->theme->edit_pool($page, $this->get_pool($pool_id), $this->edit_posts($pool_id)); + $this->theme->edit_order($page, $this->get_pool($pool_id), $this->edit_order($pool_id)); } else { $page->set_mode("redirect"); $page->set_redirect(make_link("pool/view/".$pool_id)); } - //} - break; - - case "order": - if (isset($_POST["order_view"])) { - //$poolID = int_escape($event->get_arg(1)); - //$pools = $this->get_pool($poolID); - - //foreach($pools as $pool) { - if ($this->have_permission($user, $pool)) { - $this->theme->edit_order($page, $this->get_pool($pool_id), $this->edit_order($pool_id)); - } else { - $page->set_mode("redirect"); - $page->set_redirect(make_link("pool/view/".$pool_id)); - } - //} } else { if ($this->have_permission($user, $pool)) { @@ -205,7 +197,8 @@ class Pools extends SimpleExtension { break; case "nuke": - // only admins and owners may do this + // Completely remove the given pool. + // -> Only admins and owners may do this if($user->is_admin() || $user->id == $pool['user_id']) { $this->nuke_pool($pool_id); $page->set_mode("redirect"); @@ -286,7 +279,7 @@ class Pools extends SimpleExtension { /* * HERE WE GET THE LIST OF POOLS */ - private function list_pools(Page $page, $pageNumber) { + private function list_pools(Page $page, /*int*/ $pageNumber) { global $config, $database; if(is_null($pageNumber) || !is_numeric($pageNumber)) @@ -678,7 +671,7 @@ class Pools extends SimpleExtension { /* * HERE GO BACK IN HISTORY AND ADD OR REMOVE POSTS TO POOL */ - private function revert_history($historyID) { + private function revert_history(/*int*/ $historyID) { global $database; $status = $database->get_all("SELECT * FROM pool_history WHERE id=:hid", array("hid"=>$historyID)); @@ -720,7 +713,7 @@ class Pools extends SimpleExtension { * HERE WE ADD A SIMPLE POST FROM POOL * USED WITH FOREACH IN revert_history() */ - private function add_post($poolID, $imageID) { + private function add_post(/*int*/ $poolID, /*int*/ $imageID) { global $database; if(!$this->check_post($poolID, $imageID)) { @@ -739,7 +732,7 @@ class Pools extends SimpleExtension { * HERE WE REMOVE A SIMPLE POST FROM POOL * USED WITH FOREACH IN revert_history() */ - private function delete_post($poolID, $imageID) { + private function delete_post(/*int*/ $poolID, /*int*/ $imageID) { global $database; $database->execute("DELETE FROM pool_images WHERE pool_id = :pid AND image_id = :iid", array("pid"=>$poolID, "iid"=>$imageID)); diff --git a/contrib/pools/theme.php b/contrib/pools/theme.php index 80269e6f..ea993e46 100644 --- a/contrib/pools/theme.php +++ b/contrib/pools/theme.php @@ -11,7 +11,7 @@ class PoolsTheme extends Themelet { } } - public function get_adder_html(Image $image, $pools) { + public function get_adder_html(Image $image, /*array*/ $pools) { $editor = ""; $h = ""; foreach($pools as $pool) { @@ -33,7 +33,7 @@ class PoolsTheme extends Themelet { /* * HERE WE SHOWS THE LIST OF POOLS */ - public function list_pools(Page $page, $pools, $pageNumber, $totalPages) { + public function list_pools(Page $page, /*array*/ $pools, /*int*/ $pageNumber, /*int*/ $totalPages) { global $user; $html = ''. "". @@ -99,7 +99,7 @@ class PoolsTheme extends Themelet { } - private function display_top($pools, $heading, $check_all=false) { + private function display_top(/*array*/ $pools, /*string*/ $heading, $check_all=false) { global $page, $user; $page->set_title($heading); @@ -146,7 +146,7 @@ class PoolsTheme extends Themelet { /* * HERE WE DISPLAY THE POOL WITH TITLE DESCRIPTION AND IMAGES WITH PAGINATION */ - public function view_pool($pools, $images, $pageNumber, $totalPages) { + public function view_pool(/*array*/ $pools, /*array*/ $images, /*int*/ $pageNumber, /*int*/ $totalPages) { global $user, $page; $this->display_top($pools, "Pool: ".html_escape($pools[0]['title'])); @@ -165,7 +165,7 @@ class PoolsTheme extends Themelet { /* * HERE WE DISPLAY THE POOL OPTIONS ON SIDEBAR BUT WE HIDE REMOVE OPTION IF THE USER IS NOT THE OWNER OR ADMIN */ - public function sidebar_options(Page $page, $pool, $check_all) { + public function sidebar_options(Page $page, $pool, /*bool*/ $check_all) { global $user; $editor = "\n".make_form( make_link('pool/import') ).' @@ -225,7 +225,7 @@ class PoolsTheme extends Themelet { /* * HERE WE DISPLAY THE RESULT OF THE SEARCH ON IMPORT */ - public function pool_result(Page $page, $images, $pool_id) { + public function pool_result(Page $page, /*array*/ $images, /*int*/ $pool_id) { // TODO: this could / should be done using jQuery $pool_images = " ".make_form(make_link("pool/nuke"))." @@ -204,7 +209,8 @@ class PoolsTheme extends Themelet { if($check_all) { $editor .= " -
@@ -228,7 +235,8 @@ class PoolsTheme extends Themelet { public function pool_result(Page $page, /*array*/ $images, /*int*/ $pool_id) { // TODO: this could / should be done using jQuery $pool_images = " - "; @@ -335,15 +344,16 @@ class PoolsTheme extends Themelet { */ public function show_history($histories, /*int*/ $pageNumber, /*int*/ $totalPages) { global $page; - $html = "
". - "". - "". - "". - "". - "". - "". - "". - ""; + $html = ' +
PoolPost CountChangesUpdaterDateAction
+ + + + + + + + '; $n = 0; foreach($histories as $history) { From 98e7359c6e4b873b3433f4d84e5649253ccdd8d5 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Wed, 8 Feb 2012 16:32:41 -0500 Subject: [PATCH 11/19] Show a link for the Next image in a pool. --- contrib/pools/main.php | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/contrib/pools/main.php b/contrib/pools/main.php index 6986867e..900c3435 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -100,7 +100,7 @@ class Pools extends SimpleExtension { $this->list_pools($page, int_escape($event->get_arg(1))); break; - case "new": // Show form + case "new": // Show form for new pools if(!$user->is_anonymous()){ $this->theme->new_pool_composer($page); } else { @@ -237,6 +237,11 @@ class Pools extends SimpleExtension { $pools = $this->get_pool($poolID['pool_id']); foreach ($pools as $pool){ $linksPools[] = "".html_escape($pool['title']).""; + // TODO: make a config for this + $next_image_in_pool = get_next_post($pool['id'], $imageID); + if (!empty($next_image_in_pool)) { + $linksPools[] = 'Next'; + } } } $this->theme->pool_info($linksPools); @@ -475,6 +480,30 @@ class Pools extends SimpleExtension { return ($result != 0); } + /** + * Gets the next successive image from a pool, given a pool ID and an image ID. + */ + private function get_next_post(/*int*/ $poolID, /*int*/ $imageID) { + global $database; + + $poolID = int_escape($poolID); + $pool = $this->get_pool($poolID); + + $result = $database->get_one(" + SELECT image_id + FROM pool_images + WHERE pool_id=:pid + AND image_order > (SELECT image_order FROM pool_images WHERE pool_id=:pid AND image_id =:iid LIMIT 1 ) + ORDER BY image_order ASC LIMIT 1", + array("pid"=>$poolID, "iid"=>$imageID) ); + + if (empty($result)) { + // assume that we are at the end of the pool + return null; + } else { + return $result; + } + } /** * Retrieve all the images in a pool, given a pool ID. From 050a9a17dfe1a9607e278dad1662d4c0de30bdc4 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Wed, 8 Feb 2012 16:42:29 -0500 Subject: [PATCH 12/19] Added config option for Next image. --- contrib/pools/main.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/contrib/pools/main.php b/contrib/pools/main.php index 900c3435..dc637c60 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -63,6 +63,7 @@ class Pools extends SimpleExtension { $config->set_int("poolsUpdatedPerPage", 20); $config->set_bool("poolsInfoOnViewImage", "N"); $config->set_bool("poolsAdderOnViewImage", "N"); + $config->set_bool("poolsShowNextLink","N"); log_info("pools", "extension installed"); } @@ -76,6 +77,7 @@ class Pools extends SimpleExtension { $sb->add_int_option("poolsListsPerPage", "
Index list items per page: "); $sb->add_int_option("poolsUpdatedPerPage", "
Updated list items per page: "); $sb->add_bool_option("poolsInfoOnViewImage", "
Show pool info on image: "); + $sb->add_bool_option("poolsShowNextLink", "
Show 'Next' link when viewing pool images: "); //$sb->add_bool_option("poolsAdderOnViewImage", "
Show pool adder on image: "); $event->panel->add_block($sb); } @@ -223,7 +225,8 @@ class Pools extends SimpleExtension { /** * When displaying an image, optionally list all the pools that the - * image is currently a member of on a side panel. + * image is currently a member of on a side panel, as well as a link + * to the Next image in the pool. */ public function onDisplayingImage($event) { global $config, $database, $page; @@ -231,16 +234,22 @@ class Pools extends SimpleExtension { if($config->get_bool("poolsInfoOnViewImage")) { $imageID = $event->image->id; $poolsIDs = $this->get_pool_id($imageID); + + $show_next = $config->get_bool("poolsShowNextLink", false); + $linksPools = array(); foreach($poolsIDs as $poolID) { $pools = $this->get_pool($poolID['pool_id']); foreach ($pools as $pool){ $linksPools[] = "".html_escape($pool['title']).""; - // TODO: make a config for this - $next_image_in_pool = get_next_post($pool['id'], $imageID); - if (!empty($next_image_in_pool)) { - $linksPools[] = 'Next'; + + // Optionally show a link the Next image in the Pool. + if ($show_next) { + $next_image_in_pool = $this->get_next_post($pool['id'], $imageID); + if (!empty($next_image_in_pool)) { + $linksPools[] = 'Next'; + } } } } From 7cfad30bb3aa1d518ad099ad03060d9d0586a301 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Wed, 8 Feb 2012 16:51:10 -0500 Subject: [PATCH 13/19] Reduce redundant database queries, re-use the pool array. --- contrib/pools/main.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/contrib/pools/main.php b/contrib/pools/main.php index dc637c60..ed140cc0 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -236,7 +236,6 @@ class Pools extends SimpleExtension { $poolsIDs = $this->get_pool_id($imageID); $show_next = $config->get_bool("poolsShowNextLink", false); - $linksPools = array(); foreach($poolsIDs as $poolID) { @@ -246,7 +245,7 @@ class Pools extends SimpleExtension { // Optionally show a link the Next image in the Pool. if ($show_next) { - $next_image_in_pool = $this->get_next_post($pool['id'], $imageID); + $next_image_in_pool = $this->get_next_post($pool, $imageID); if (!empty($next_image_in_pool)) { $linksPools[] = 'Next'; } @@ -491,12 +490,16 @@ class Pools extends SimpleExtension { /** * Gets the next successive image from a pool, given a pool ID and an image ID. + * + * @param $pool Array for the given pool + * @param $imageID Integer + * @retval Integer which is the next Image ID or NULL if none. */ - private function get_next_post(/*int*/ $poolID, /*int*/ $imageID) { + private function get_next_post(/*array*/ $pool, /*int*/ $imageID) { global $database; - - $poolID = int_escape($poolID); - $pool = $this->get_pool($poolID); + + if (empty($pool) || empty($imageID)) + return null; $result = $database->get_one(" SELECT image_id @@ -504,7 +507,7 @@ class Pools extends SimpleExtension { WHERE pool_id=:pid AND image_order > (SELECT image_order FROM pool_images WHERE pool_id=:pid AND image_id =:iid LIMIT 1 ) ORDER BY image_order ASC LIMIT 1", - array("pid"=>$poolID, "iid"=>$imageID) ); + array("pid"=>$pool['id'], "iid"=>$imageID) ); if (empty($result)) { // assume that we are at the end of the pool From b4a384c2b1523c81fdd036bc4f7df3ecf68faef6 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Wed, 8 Feb 2012 16:57:29 -0500 Subject: [PATCH 14/19] Added some minuscule theming the default theme. --- themes/default/style.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/themes/default/style.css b/themes/default/style.css index 1b2c7355..7aa10387 100644 --- a/themes/default/style.css +++ b/themes/default/style.css @@ -149,6 +149,12 @@ UL { margin-bottom: 32px; } +.pools_next_img { + display: block; + font-size: 77%; + text-align: right; +} + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * the main part of each page * From 562ba3585a91a1b6b65c31fdb0f5ac14d44a7198 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Wed, 8 Feb 2012 23:32:22 -0500 Subject: [PATCH 15/19] Should this be a global? --- contrib/pools/main.php | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/pools/main.php b/contrib/pools/main.php index b7688a50..dd562548 100644 --- a/contrib/pools/main.php +++ b/contrib/pools/main.php @@ -276,6 +276,7 @@ class Pools extends Extension { /** * Check if the given user has permission to edit/change the pool. + * TODO: Should the user variable be global? * @retval bool */ private function have_permission($user, $pool) { From e227965802caff6140ae789139cd917afd56d885 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Thu, 9 Feb 2012 00:40:01 -0500 Subject: [PATCH 16/19] Converting Ratings to new Extension (simple extension). --- contrib/rating/main.php | 199 +++++++++++++++++++++------------------- 1 file changed, 103 insertions(+), 96 deletions(-) diff --git a/contrib/rating/main.php b/contrib/rating/main.php index 160f6de5..ac9ba0fb 100644 --- a/contrib/rating/main.php +++ b/contrib/rating/main.php @@ -18,21 +18,110 @@ class RatingSetEvent extends Event { } } -class Ratings implements Extension { - var $theme; +class Ratings extends Extension { public function get_priority() {return 50;} - public function receive_event(Event $event) { - global $config, $database, $page, $user; - if(is_null($this->theme)) $this->theme = get_theme_object($this); - - if($event instanceof AdminBuildingEvent) { - $this->theme->display_bulk_rater(); + public function onInitExt($event) { + global $config; + + if($config->get_int("ext_ratings2_version") < 2) { + $this->install(); } - if(($event instanceof PageRequestEvent) && $event->page_matches("admin/bulk_rate")) { - global $database, $user, $page; + $config->set_default_string("ext_rating_anon_privs", 'squ'); + $config->set_default_string("ext_rating_user_privs", 'sqeu'); + $config->set_default_string("ext_rating_admin_privs", 'sqeu'); + } + + public function onSetupBuilding(SetupBuildingEvent $event) { + $privs = array(); + $privs['Safe Only'] = 's'; + $privs['Safe and Unknown'] = 'su'; + $privs['Safe and Questionable'] = 'sq'; + $privs['Safe, Questionable, Unknown'] = 'squ'; + $privs['All'] = 'sqeu'; + + $sb = new SetupBlock("Image Ratings"); + $sb->add_choice_option("ext_rating_anon_privs", $privs, "Anonymous: "); + $sb->add_choice_option("ext_rating_user_privs", $privs, "
Users: "); + $sb->add_choice_option("ext_rating_admin_privs", $privs, "
Admins: "); + $event->panel->add_block($sb); + } + + public function onAdminBuilding(AdminBuildingEvent $event) { + $this->theme->display_bulk_rater(); + } + + public function onDisplayingImage(DisplayingImageEvent $event) { + global $user, $database, $page; + /** + * Deny images upon insufficient permissions. + **/ + $user_view_level = Ratings::get_user_privs($user); + $user_view_level = preg_split('//', $user_view_level, -1); + if(!in_array($event->image->rating, $user_view_level)) { + $page->set_mode("redirect"); + $page->set_redirect(make_link("post/list")); + } + } + + public function onRatingSet(RatingSetEvent $event) { + if(empty($event->image->rating)){ + $old_rating = ""; + }else{ + $old_rating = $event->image->rating; + } + $this->set_rating($event->image->id, $event->rating, $old_rating); + } + + public function onImageInfoBoxBuilding(ImageInfoBoxBuildingEvent $event) { + if($this->can_rate()) { + $event->add_part($this->theme->get_rater_html($event->image->id, $event->image->rating), 80); + } + } + + public function onImageInfoSet(ImageInfoSetEvent $event) { + global $user; + + if($this->can_rate() && isset($_POST["rating"])) { + send_event(new RatingSetEvent($event->image, $user, $_POST['rating'])); + } + } + + public function onParseLinkTemplate(ParseLinkTemplateEvent $event) { + $event->replace('$rating', $this->theme->rating_to_name($event->image->rating)); + } + + public function onSearchTermParse(SearchTermParseEvent $event) { + global $user; + + $matches = array(); + if(is_null($event->term) && $this->no_rating_query($event->context)) { + $set = Ratings::privs_to_sql(Ratings::get_user_privs($user)); + $event->add_querylet(new Querylet("rating IN ($set)")); + } + if(preg_match("/^rating=([sqeu]+)$/", $event->term, $matches)) { + $sqes = $matches[1]; + $arr = array(); + $length = strlen($sqes); + for($i=0; $i<$length; $i++) { + $arr[] = "'" . $sqes[$i] . "'"; + } + $set = join(', ', $arr); + $event->add_querylet(new Querylet("rating IN ($set)")); + } + if(preg_match("/^rating=(safe|questionable|explicit|unknown)$/", strtolower($event->term), $matches)) { + $text = $matches[1]; + $char = $text[0]; + $event->add_querylet(new Querylet("rating = :img_rating", array("img_rating"=>$char))); + } + } + + public function onPageRequest(PageRequestEvent $event) { + global $database, $user, $page; + + if ($event->page_matches("admin/bulk_rate")) { if(!$user->is_admin()) { throw PermissionDeniedException(); } @@ -58,93 +147,11 @@ class Ratings implements Extension { $page->set_redirect(make_link("admin")); } } - - if($event instanceof InitExtEvent) { - if($config->get_int("ext_ratings2_version") < 2) { - $this->install(); - } - - $config->set_default_string("ext_rating_anon_privs", 'squ'); - $config->set_default_string("ext_rating_user_privs", 'sqeu'); - $config->set_default_string("ext_rating_admin_privs", 'sqeu'); - } - - if($event instanceof RatingSetEvent) { - if(empty($event->image->rating)){ - $old_rating = ""; - }else{ - $old_rating = $event->image->rating; - } - $this->set_rating($event->image->id, $event->rating, $old_rating); - } - - if($event instanceof ImageInfoBoxBuildingEvent) { - if($this->can_rate()) { - $event->add_part($this->theme->get_rater_html($event->image->id, $event->image->rating), 80); - } - } - - if($event instanceof ImageInfoSetEvent) { - if($this->can_rate() && isset($_POST["rating"])) { - send_event(new RatingSetEvent($event->image, $user, $_POST['rating'])); - } - } - - if($event instanceof SetupBuildingEvent) { - $privs = array(); - $privs['Safe Only'] = 's'; - $privs['Safe and Unknown'] = 'su'; - $privs['Safe and Questionable'] = 'sq'; - $privs['Safe, Questionable, Unknown'] = 'squ'; - $privs['All'] = 'sqeu'; - - $sb = new SetupBlock("Image Ratings"); - $sb->add_choice_option("ext_rating_anon_privs", $privs, "Anonymous: "); - $sb->add_choice_option("ext_rating_user_privs", $privs, "
Users: "); - $sb->add_choice_option("ext_rating_admin_privs", $privs, "
Admins: "); - $event->panel->add_block($sb); - } - - if($event instanceof ParseLinkTemplateEvent) { - $event->replace('$rating', $this->theme->rating_to_name($event->image->rating)); - } - - if($event instanceof SearchTermParseEvent) { - $matches = array(); - if(is_null($event->term) && $this->no_rating_query($event->context)) { - $set = Ratings::privs_to_sql(Ratings::get_user_privs($user)); - $event->add_querylet(new Querylet("rating IN ($set)")); - } - if(preg_match("/^rating=([sqeu]+)$/", $event->term, $matches)) { - $sqes = $matches[1]; - $arr = array(); - $length = strlen($sqes); - for($i=0; $i<$length; $i++) { - $arr[] = "'" . $sqes[$i] . "'"; - } - $set = join(', ', $arr); - $event->add_querylet(new Querylet("rating IN ($set)")); - } - if(preg_match("/^rating=(safe|questionable|explicit|unknown)$/", strtolower($event->term), $matches)) { - $text = $matches[1]; - $char = $text[0]; - $event->add_querylet(new Querylet("rating = :img_rating", array("img_rating"=>$char))); - } - } - - if($event instanceof DisplayingImageEvent) { - /** - * Deny images upon insufficient permissions. - **/ - global $user, $database, $page; - $user_view_level = Ratings::get_user_privs($user); - $user_view_level = preg_split('//', $user_view_level, -1); - if(!in_array($event->image->rating, $user_view_level)) { - $page->set_mode("redirect"); - $page->set_redirect(make_link("post/list")); - } - } } + + + + public static function get_user_privs($user) { global $config; From 06e648d3e4f14308135611a7c86e40d1a0a6ff54 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Thu, 9 Feb 2012 01:01:36 -0500 Subject: [PATCH 17/19] Fixing shared HTML ID for Random extension. --- contrib/random_image/main.php | 5 +++-- contrib/random_image/theme.php | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/contrib/random_image/main.php b/contrib/random_image/main.php index 0ff3a1b2..23ec6623 100644 --- a/contrib/random_image/main.php +++ b/contrib/random_image/main.php @@ -24,6 +24,7 @@ class RandomImage extends Extension { public function onPageRequest(PageRequestEvent $event) { global $config, $database, $page, $user; if($event->page_matches("random_image")) { + var $action; if($event->count_args() == 1) { $action = $event->get_arg(0); $search_terms = array(); @@ -37,14 +38,14 @@ class RandomImage extends Extension { } $image = Image::by_random($search_terms); - if($action == "download") { + if($action === "download") { if(!is_null($image)) { $page->set_mode("data"); $page->set_type("image/jpeg"); $page->set_data(file_get_contents($image->get_image_filename())); } } - if($action == "view") { + if($action === "view") { if(!is_null($image)) { send_event(new DisplayingImageEvent($image, $page)); } diff --git a/contrib/random_image/theme.php b/contrib/random_image/theme.php index 306f984f..87806bec 100644 --- a/contrib/random_image/theme.php +++ b/contrib/random_image/theme.php @@ -17,7 +17,7 @@ class RandomImageTheme extends Themelet {
From a43b407c4192f5166cd73c27ffa3d5e9e23e71fb Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Thu, 9 Feb 2012 01:33:23 -0500 Subject: [PATCH 18/19] Change to empty string. --- contrib/random_image/main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/random_image/main.php b/contrib/random_image/main.php index 23ec6623..5a77bb25 100644 --- a/contrib/random_image/main.php +++ b/contrib/random_image/main.php @@ -24,7 +24,7 @@ class RandomImage extends Extension { public function onPageRequest(PageRequestEvent $event) { global $config, $database, $page, $user; if($event->page_matches("random_image")) { - var $action; + $action = ''; if($event->count_args() == 1) { $action = $event->get_arg(0); $search_terms = array(); From 793b49a054b5e3a3342cb987a14c53ee915aaa44 Mon Sep 17 00:00:00 2001 From: "green-ponies (jgen)" Date: Thu, 9 Feb 2012 01:42:45 -0500 Subject: [PATCH 19/19] For HTML correctness. --- contrib/pools/theme.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/pools/theme.php b/contrib/pools/theme.php index f8aa4f48..687fbba5 100644 --- a/contrib/pools/theme.php +++ b/contrib/pools/theme.php @@ -41,7 +41,7 @@ class PoolsTheme extends Themelet {
- '; + '; $n = 0; @@ -121,7 +121,7 @@ class PoolsTheme extends Themelet { - '; + '; $n = 0; foreach($pools as $pool) { @@ -353,7 +353,7 @@ class PoolsTheme extends Themelet { - '; + '; $n = 0; foreach($histories as $history) {
PoolPost CountChangesUpdaterDateAction
Creator Posts Public
Title Description
Updater Date Action