Merge branch 'master' of github.com:shish/shimmie2

This commit is contained in:
Shish 2012-02-09 14:22:19 +00:00
commit 3291e0c302
6 changed files with 382 additions and 279 deletions

View File

@ -1,19 +1,31 @@
<?php <?php
/** /**
* Name: Pools System * Name: Pools System
* Author: Sein Kraft <mail@seinkraft.info> * Author: Sein Kraft <mail@seinkraft.info>, jgen <jgen.tech@gmail.com>
* License: GPLv2 * License: GPLv2
* Description: Allow users to create groups of images * Description: Allow users to create groups of images and order them.
* Documentation: * 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 { class PoolCreationException extends SCoreException {
var $error;
public function __construct($error) {
$this->error = $error;
}
} }
class Pools extends Extension { class Pools extends Extension {
public function onInitExt(InitExtEvent $event) { public function onInitExt(InitExtEvent $event) {
global $config, $database; global $config, $database;
// Create the database tables
if ($config->get_int("ext_pools_version") < 1){ if ($config->get_int("ext_pools_version") < 1){
$database->create_table("pools", " $database->create_table("pools", "
id SCORE_AIPK, id SCORE_AIPK,
@ -41,6 +53,7 @@ class Pools extends Extension {
INDEX (id) INDEX (id)
"); ");
// Set the defaults for the pools extension
$config->set_int("ext_pools_version", 1); $config->set_int("ext_pools_version", 1);
$config->set_int("poolsMaxImportResults", 1000); $config->set_int("poolsMaxImportResults", 1000);
@ -49,11 +62,13 @@ class Pools extends Extension {
$config->set_int("poolsUpdatedPerPage", 20); $config->set_int("poolsUpdatedPerPage", 20);
$config->set_bool("poolsInfoOnViewImage", "N"); $config->set_bool("poolsInfoOnViewImage", "N");
$config->set_bool("poolsAdderOnViewImage", "N"); $config->set_bool("poolsAdderOnViewImage", "N");
$config->set_bool("poolsShowNextLink","N");
log_info("pools", "extension installed"); log_info("pools", "extension installed");
} }
} }
// Add a block to the Board Config / Setup
public function onSetupBuilding(SetupBuildingEvent $event) { public function onSetupBuilding(SetupBuildingEvent $event) {
$sb = new SetupBlock("Pools"); $sb = new SetupBlock("Pools");
$sb->add_int_option("poolsMaxImportResults", "Max results on import: "); $sb->add_int_option("poolsMaxImportResults", "Max results on import: ");
@ -61,20 +76,32 @@ class Pools extends Extension {
$sb->add_int_option("poolsListsPerPage", "<br>Index list items per page: "); $sb->add_int_option("poolsListsPerPage", "<br>Index list items per page: ");
$sb->add_int_option("poolsUpdatedPerPage", "<br>Updated list items per page: "); $sb->add_int_option("poolsUpdatedPerPage", "<br>Updated list items per page: ");
$sb->add_bool_option("poolsInfoOnViewImage", "<br>Show pool info on image: "); $sb->add_bool_option("poolsInfoOnViewImage", "<br>Show pool info on image: ");
$sb->add_bool_option("poolsShowNextLink", "<br>Show 'Next' link when viewing pool images: ");
//$sb->add_bool_option("poolsAdderOnViewImage", "<br>Show pool adder on image: "); //$sb->add_bool_option("poolsAdderOnViewImage", "<br>Show pool adder on image: ");
$event->panel->add_block($sb); $event->panel->add_block($sb);
} }
public function onPageRequest(PageRequestEvent $event) { public function onPageRequest(PageRequestEvent $event) {
global $config, $page, $user; global $config, $page, $user;
if ($event->page_matches("pool")) {
if($event->page_matches("pool")) { $pool_id = 0;
$pool = array();
// 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);
}
// What action are we trying to perform?
switch($event->get_arg(0)) { switch($event->get_arg(0)) {
case "list": //index case "list": //index
$this->list_pools($page, int_escape($event->get_arg(1))); $this->list_pools($page, int_escape($event->get_arg(1)));
break; break;
case "new": // Show form case "new": // Show form for new pools
if(!$user->is_anonymous()){ if(!$user->is_anonymous()){
$this->theme->new_pool_composer($page); $this->theme->new_pool_composer($page);
} else { } else {
@ -89,8 +116,8 @@ class Pools extends Extension {
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$newPoolID)); $page->set_redirect(make_link("pool/view/".$newPoolID));
} }
catch(PoolCreationException $pce) { catch(PoolCreationException $e) {
$this->theme->display_error($pce->getMessage()); $this->theme->display_error($e->error);
} }
break; break;
@ -112,41 +139,26 @@ class Pools extends Extension {
} }
break; break;
case "edit": case "edit": // Edit the pool (remove images)
$poolID = int_escape($event->get_arg(1)); if ($this->have_permission($user, $pool)) {
$pools = $this->get_pool($poolID); $this->theme->edit_pool($page, $this->get_pool($pool_id), $this->edit_posts($pool_id));
} else {
foreach($pools as $pool) { $page->set_mode("redirect");
// if the pool is public and user is logged OR if the user is admin OR the user is the owner $page->set_redirect(make_link("pool/view/".$pool_id));
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->theme->edit_pool($page, $this->get_pool($poolID), $this->edit_posts($poolID));
} else {
$page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$poolID));
}
} }
break; break;
case "order": case "order": // Order the pool (view and change the order of images within the pool)
if($_SERVER["REQUEST_METHOD"] == "GET") { if (isset($_POST["order_view"])) {
$poolID = int_escape($event->get_arg(1)); if ($this->have_permission($user, $pool)) {
$pools = $this->get_pool($poolID); $this->theme->edit_order($page, $this->get_pool($pool_id), $this->edit_order($pool_id));
} else {
foreach($pools as $pool) { $page->set_mode("redirect");
//if the pool is public and user is logged OR if the user is admin $page->set_redirect(make_link("pool/view/".$pool_id));
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->theme->edit_order($page, $this->get_pool($poolID), $this->edit_order($poolID));
} else {
$page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$poolID));
}
} }
} }
else { else {
$pool_id = int_escape($_POST["pool_id"]); if ($this->have_permission($user, $pool)) {
$pool = $this->get_single_pool($pool_id);
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->order_posts(); $this->order_posts();
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$pool_id)); $page->set_redirect(make_link("pool/view/".$pool_id));
@ -157,21 +169,15 @@ class Pools extends Extension {
break; break;
case "import": case "import":
$pool_id = int_escape($_POST["pool_id"]); if ($this->have_permission($user, $pool)) {
$pool = $this->get_single_pool($pool_id); $this->import_posts($pool_id);
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->import_posts();
} else { } else {
$this->theme->display_error("Permssion denied."); $this->theme->display_error("Permssion denied.");
} }
break; break;
case "add_posts": case "add_posts":
$pool_id = int_escape($_POST["pool_id"]); if ($this->have_permission($user, $pool)) {
$pool = $this->get_single_pool($pool_id);
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->add_posts(); $this->add_posts();
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$pool_id)); $page->set_redirect(make_link("pool/view/".$pool_id));
@ -181,10 +187,7 @@ class Pools extends Extension {
break; break;
case "remove_posts": case "remove_posts":
$pool_id = int_escape($_POST["pool_id"]); if ($this->have_permission($user, $pool)) {
$pool = $this->get_single_pool($pool_id);
if(($pool['public'] == "Y" && !$user->is_anonymous()) || $user->is_admin() || $user->id == $pool['user_id']) {
$this->remove_posts(); $this->remove_posts();
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/view/".$pool_id)); $page->set_redirect(make_link("pool/view/".$pool_id));
@ -195,11 +198,9 @@ class Pools extends Extension {
break; break;
case "nuke": case "nuke":
$pool_id = int_escape($_POST['pool_id']); // Completely remove the given pool.
$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); $this->nuke_pool($pool_id);
$page->set_mode("redirect"); $page->set_mode("redirect");
$page->set_redirect(make_link("pool/list")); $page->set_redirect(make_link("pool/list"));
@ -221,8 +222,10 @@ class Pools extends Extension {
} }
/* /**
* HERE WE GET THE POOLS WHERE THE IMAGE APPEARS WHEN THE IMAGE IS DISPLAYED * When displaying an image, optionally list all the pools that the
* 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(DisplayingImageEvent $event) { public function onDisplayingImage(DisplayingImageEvent $event) {
global $config, $database, $page; global $config, $database, $page;
@ -230,12 +233,22 @@ class Pools extends Extension {
if($config->get_bool("poolsInfoOnViewImage")) { if($config->get_bool("poolsInfoOnViewImage")) {
$imageID = $event->image->id; $imageID = $event->image->id;
$poolsIDs = $this->get_pool_id($imageID); $poolsIDs = $this->get_pool_id($imageID);
$show_next = $config->get_bool("poolsShowNextLink", false);
$linksPools = array(); $linksPools = array();
foreach($poolsIDs as $poolID) { foreach($poolsIDs as $poolID) {
$pools = $this->get_pool($poolID['pool_id']); $pools = $this->get_pool($poolID['pool_id']);
foreach ($pools as $pool){ foreach ($pools as $pool){
$linksPools[] = "<a href='".make_link("pool/view/".$pool['id'])."'>".html_escape($pool['title'])."</a>"; $linksPools[] = "<a href='".make_link("pool/view/".$pool['id'])."'>".html_escape($pool['title'])."</a>";
// Optionally show a link the Next image in the Pool.
if ($show_next) {
$next_image_in_pool = $this->get_next_post($pool, $imageID);
if (!empty($next_image_in_pool)) {
$linksPools[] = '<a href="'.make_link('post/view/'.$next_image_in_pool).'" class="pools_next_img">Next</a>';
}
}
} }
} }
$this->theme->pool_info($linksPools); $this->theme->pool_info($linksPools);
@ -257,7 +270,25 @@ class Pools extends Extension {
} }
} }
/* ------------------------------------------------- */
/* -------------- Private Functions -------------- */
/* ------------------------------------------------- */
/**
* 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) {
// 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 * HERE WE GET THE LIST OF POOLS
*/ */
@ -308,28 +339,41 @@ class Pools extends Extension {
INSERT INTO pools (user_id, public, title, description, date) INSERT INTO pools (user_id, public, title, description, date)
VALUES (:uid, :public, :title, :desc, now())", VALUES (:uid, :public, :title, :desc, now())",
array("uid"=>$user->id, "public"=>$public, "title"=>$_POST["title"], "desc"=>$_POST["description"])); array("uid"=>$user->id, "public"=>$public, "title"=>$_POST["title"], "desc"=>$_POST["description"]));
$result = $database->get_row("SELECT LAST_INSERT_ID() AS poolID"); # FIXME database specific? //$result = $database->get_row("SELECT LAST_INSERT_ID() AS poolID"); # FIXME database specific?
$result['poolID'] = $database->get_last_insert_id();
log_info("pools", "Pool {$result["poolID"]} created by {$user->name}"); log_info("pools", "Pool {$result["poolID"]} created by {$user->name}");
return $result["poolID"]; return $result["poolID"];
} }
private function get_pool($poolID) { /**
* Retrieve information about pools given mulitiple pool IDs.
* @param $poolID Array of integers
* @retval 2D Array
*/
private function get_pool(/*int*/ $poolID) {
global $database; global $database;
return $database->get_all("SELECT * FROM pools WHERE id=:id", array("id"=>$poolID)); return $database->get_all("SELECT * FROM pools WHERE id=:id", array("id"=>$poolID));
} }
private function get_single_pool($poolID) { /**
* Retrieve information about a pool given a pool ID.
* @param $poolID Integer
* @retval 2D array (with only 1 element in the one dimension)
*/
private function get_single_pool(/*int*/ $poolID) {
global $database; global $database;
return $database->get_row("SELECT * FROM pools WHERE id=:id", array("id"=>$poolID)); return $database->get_row("SELECT * FROM pools WHERE id=:id", array("id"=>$poolID));
} }
/* /**
* HERE WE GET THE ID OF THE POOL FROM AN IMAGE * Get all of the pool IDs that an image is in, given an image ID.
* @param $imageID Integer
* @retval 2D array
*/ */
private function get_pool_id($imageID) { private function get_pool_id(/*int*/ $imageID) {
global $database; global $database;
return $database->get_all("SELECT pool_id FROM pool_images WHERE image_id=:iid", array("iid"=>$imageID)); return $database->get_all("SELECT pool_id FROM pool_images WHERE image_id=:iid", array("iid"=>$imageID));
} }
@ -338,13 +382,11 @@ class Pools extends Extension {
/* /*
* HERE WE GET THE IMAGES FROM THE TAG ON IMPORT * 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; global $page, $config, $database;
$pool_id = int_escape($_POST["pool_id"]);
$poolsMaxResults = $config->get_int("poolsMaxImportResults", 1000); $poolsMaxResults = $config->get_int("poolsMaxImportResults", 1000);
$images = $images = Image::find_images(0, $poolsMaxResults, Tag::explode($_POST["pool_tag"])); $images = $images = Image::find_images(0, $poolsMaxResults, Tag::explode($_POST["pool_tag"]));
$this->theme->pool_result($page, $images, $pool_id); $this->theme->pool_result($page, $images, $pool_id);
} }
@ -352,6 +394,8 @@ class Pools extends Extension {
/* /*
* HERE WE ADD CHECKED IMAGES FROM POOL AND UPDATE THE HISTORY * 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() { private function add_posts() {
global $database; global $database;
@ -385,6 +429,9 @@ class Pools extends Extension {
return $poolID; return $poolID;
} }
/*
* TODO: Fix this so that the pool ID and images are passed as Arguments to the function.
*/
private function order_posts() { private function order_posts() {
global $database; global $database;
@ -406,6 +453,8 @@ class Pools extends Extension {
/* /*
* HERE WE REMOVE CHECKED IMAGES FROM POOL AND UPDATE THE HISTORY * 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() { private function remove_posts() {
global $database; global $database;
@ -420,25 +469,58 @@ class Pools extends Extension {
$count = $database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", array("pid"=>$poolID)); $count = $database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", array("pid"=>$poolID));
$this->add_history($poolID, 0, $images, $count); $this->add_history($poolID, 0, $images, $count);
return $poolID; return $poolID;
} }
/* /**
* HERE WE CHECK IF THE POST IS ALREADY ON POOL * This function checks if a given image is contained within a given pool.
* USED IN add_posts() * 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; global $database;
$result = $database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid AND image_id=:iid", array("pid"=>$poolID, "iid"=>$imageID)); $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); return ($result != 0);
} }
/**
/* * Gets the next successive image from a pool, given a pool ID and an image ID.
* HERE WE GET ALL IMAGES FOR THE POOL *
* @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_posts($event, $poolID) { private function get_next_post(/*array*/ $pool, /*int*/ $imageID) {
global $database;
if (empty($pool) || empty($imageID))
return null;
$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"=>$pool['id'], "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.
*/
private function get_posts($event, /*int*/ $poolID) {
global $config, $user, $database; global $config, $user, $database;
$pageNumber = int_escape($event->get_arg(2)); $pageNumber = int_escape($event->get_arg(2));
@ -450,6 +532,7 @@ class Pools extends Extension {
$pageNumber--; $pageNumber--;
$poolID = int_escape($poolID); $poolID = int_escape($poolID);
$pool = $this->get_pool($poolID);
$imagesPerPage = $config->get_int("poolsImagesPerPage"); $imagesPerPage = $config->get_int("poolsImagesPerPage");
@ -457,6 +540,8 @@ class Pools extends Extension {
// WORKS TO SHOW/HIDE SAFE, QUESTIONABLE, EXPLICIT AND UNRATED IMAGES FROM USER // WORKS TO SHOW/HIDE SAFE, QUESTIONABLE, EXPLICIT AND UNRATED IMAGES FROM USER
if(class_exists("Ratings")) { if(class_exists("Ratings")) {
$rating = Ratings::privs_to_sql(Ratings::get_user_privs($user)); $rating = Ratings::privs_to_sql(Ratings::get_user_privs($user));
}
if (isset($rating) && !empty($rating)) {
$result = $database->get_all(" $result = $database->get_all("
SELECT p.image_id SELECT p.image_id
@ -473,8 +558,8 @@ class Pools extends Extension {
INNER JOIN images AS i ON i.id = p.image_id INNER JOIN images AS i ON i.id = p.image_id
WHERE pool_id=:pid AND i.rating IN ($rating)", WHERE pool_id=:pid AND i.rating IN ($rating)",
array("pid"=>$poolID)) / $imagesPerPage); array("pid"=>$poolID)) / $imagesPerPage);
} } else {
else {
$result = $database->get_all(" $result = $database->get_all("
SELECT image_id SELECT image_id
FROM pool_images FROM pool_images
@ -482,6 +567,7 @@ class Pools extends Extension {
ORDER BY image_order ASC ORDER BY image_order ASC
LIMIT :l OFFSET :o", LIMIT :l OFFSET :o",
array("pid"=>$poolID, "l"=>$imagesPerPage, "o"=>$pageNumber * $imagesPerPage)); array("pid"=>$poolID, "l"=>$imagesPerPage, "o"=>$pageNumber * $imagesPerPage));
$totalPages = ceil($database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", array("pid"=>$poolID)) / $imagesPerPage); $totalPages = ceil($database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", array("pid"=>$poolID)) / $imagesPerPage);
} }
@ -490,26 +576,26 @@ class Pools extends Extension {
$images[] = Image::by_id($singleResult["image_id"]); $images[] = Image::by_id($singleResult["image_id"]);
} }
$pool = $this->get_pool($poolID);
$this->theme->view_pool($pool, $images, $pageNumber + 1, $totalPages); $this->theme->view_pool($pool, $images, $pageNumber + 1, $totalPages);
} }
/* /**
* 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; global $database;
$result = $database->Execute("SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC", array("pid"=>$poolID)); $result = $database->Execute("SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC", array("pid"=>$poolID));
$images = array(); $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); $images[] = array($image);
$result->MoveNext();
} }
return $images; return $images;
} }
@ -517,29 +603,23 @@ class Pools extends Extension {
/* /*
* WE GET THE ORDER OF THE IMAGES BUT HERE WE SEND KEYS ADDED IN ARRAY TO GET THE ORDER IN THE INPUT VALUE * 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; global $database;
$result = $database->Execute("SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC", array("pid"=>$poolID)); $result = $database->Execute("SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC", array("pid"=>$poolID));
$images = array(); $images = array();
while(!$result->EOF) {
while($row = $result->fetch())
{
$image = $database->get_row(" $image = $database->get_row("
SELECT * FROM images AS i SELECT * FROM images AS i
INNER JOIN pool_images AS p ON i.id = p.image_id INNER JOIN pool_images AS p ON i.id = p.image_id
WHERE pool_id=:pid AND i.id=:iid", WHERE pool_id=:pid AND i.id=:iid",
array("pid"=>$poolID, "iid"=>$result->fields["image_id"])); array("pid"=>$poolID, "iid"=>$row['image_id']));
$image = ($image ? new Image($image) : null); $image = ($image ? new Image($image) : null);
$images[] = array($image); $images[] = array($image);
$result->MoveNext();
} }
// Original code
//
// $images = array();
// while(!$result->EOF) {
// $image = Image::by_id($result->fields["image_id"]);
// $images[] = array($image);
// $result->MoveNext();
// }
return $images; return $images;
} }
@ -547,7 +627,7 @@ class Pools extends Extension {
/* /*
* HERE WE NUKE ENTIRE POOL. WE REMOVE POOLS AND POSTS FROM REMOVED POOL AND HISTORIES ENTRIES FROM REMOVED POOL * 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; global $user, $database;
$p_id = $database->get_one("SELECT user_id FROM pools WHERE id = :pid", array("pid"=>$poolID)); $p_id = $database->get_one("SELECT user_id FROM pools WHERE id = :pid", array("pid"=>$poolID));
@ -567,7 +647,7 @@ class Pools extends Extension {
* HERE WE ADD A HISTORY ENTRY * HERE WE ADD A HISTORY ENTRY
* FOR $action 1 (one) MEANS ADDED, 0 (zero) MEANS REMOVED * 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; global $user, $database;
$database->execute(" $database->execute("
INSERT INTO pool_history (pool_id, user_id, action, images, count, date) INSERT INTO pool_history (pool_id, user_id, action, images, count, date)
@ -579,7 +659,7 @@ class Pools extends Extension {
/* /*
* HERE WE GET THE HISTORY LIST * HERE WE GET THE HISTORY LIST
*/ */
private function get_history($pageNumber) { private function get_history(/*int*/ $pageNumber) {
global $config, $database; global $config, $database;
if(is_null($pageNumber) || !is_numeric($pageNumber)) if(is_null($pageNumber) || !is_numeric($pageNumber))
@ -614,7 +694,7 @@ class Pools extends Extension {
/* /*
* HERE GO BACK IN HISTORY AND ADD OR REMOVE POSTS TO POOL * 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; global $database;
$status = $database->get_all("SELECT * FROM pool_history WHERE id=:hid", array("hid"=>$historyID)); $status = $database->get_all("SELECT * FROM pool_history WHERE id=:hid", array("hid"=>$historyID));
@ -656,7 +736,7 @@ class Pools extends Extension {
* HERE WE ADD A SIMPLE POST FROM POOL * HERE WE ADD A SIMPLE POST FROM POOL
* USED WITH FOREACH IN revert_history() * USED WITH FOREACH IN revert_history()
*/ */
private function add_post($poolID, $imageID) { private function add_post(/*int*/ $poolID, /*int*/ $imageID) {
global $database; global $database;
if(!$this->check_post($poolID, $imageID)) { if(!$this->check_post($poolID, $imageID)) {
@ -675,7 +755,7 @@ class Pools extends Extension {
* HERE WE REMOVE A SIMPLE POST FROM POOL * HERE WE REMOVE A SIMPLE POST FROM POOL
* USED WITH FOREACH IN revert_history() * USED WITH FOREACH IN revert_history()
*/ */
private function delete_post($poolID, $imageID) { private function delete_post(/*int*/ $poolID, /*int*/ $imageID) {
global $database; global $database;
$database->execute("DELETE FROM pool_images WHERE pool_id = :pid AND image_id = :iid", array("pid"=>$poolID, "iid"=>$imageID)); $database->execute("DELETE FROM pool_images WHERE pool_id = :pid AND image_id = :iid", array("pid"=>$poolID, "iid"=>$imageID));

View File

@ -1,7 +1,8 @@
<?php <?php
class PoolsTheme extends Themelet { class PoolsTheme extends Themelet {
/* /**
* HERE WE ADD THE POOL INFO ON IMAGE * Adds a block to the panel with information on the pool(s) the image is in.
*/ */
public function pool_info($linksPools) { public function pool_info($linksPools) {
global $page; global $page;
@ -10,14 +11,13 @@ class PoolsTheme extends Themelet {
} }
} }
public function get_adder_html(Image $image, $pools) { public function get_adder_html(Image $image, /*array*/ $pools) {
$editor = ""; $editor = "";
$h = ""; $h = "";
foreach($pools as $pool) { foreach($pools as $pool) {
$h .= "<option value='".$pool['id']."'>".html_escape($pool['title'])."</option>"; $h .= "<option value='".$pool['id']."'>".html_escape($pool['title'])."</option>";
} }
$editor = " $editor = "\n".make_form(make_link("pool/add_post"))."
".make_form(make_link("pool/add_post"))."
<select name='pool_id'> <select name='pool_id'>
$h $h
</select> </select>
@ -32,17 +32,20 @@ class PoolsTheme extends Themelet {
/* /*
* HERE WE SHOWS THE LIST OF POOLS * 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; global $user;
$html = '<table id="poolsList" class="zebra">'. $html = '
"<thead><tr>". <table id="poolsList" class="zebra">
"<th>Name</th>". <thead><tr>
"<th>Creator</th>". <th>Name</th>
"<th>Posts</th>". <th>Creator</th>
"<th>Public</th>". <th>Posts</th>
"</tr></thead>"; <th>Public</th>
</tr></thead><tbody>';
$n = 0; $n = 0;
// Build up the list of pools.
foreach($pools as $pool) { foreach($pools as $pool) {
$oe = ($n++ % 2 == 0) ? "even" : "odd"; $oe = ($n++ % 2 == 0) ? "even" : "odd";
@ -60,12 +63,11 @@ class PoolsTheme extends Themelet {
$html .= "</tbody></table>"; $html .= "</tbody></table>";
$nav_html = '
$nav_html = " <a href="'.make_link().'">Index</a>
<a href=".make_link().">Index</a> <br><a href="'.make_link("pool/new").'">Create Pool</a>
<br><a href=".make_link("pool/new").">Create Pool</a> <br><a href="'.make_link("pool/updated").'">Pool Changes</a>
<br><a href=".make_link("pool/updated").">Pool Changes</a> ';
";
$blockTitle = "Pools"; $blockTitle = "Pools";
$page->set_title(html_escape($blockTitle)); $page->set_title(html_escape($blockTitle));
@ -99,7 +101,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; global $page, $user;
$page->set_title($heading); $page->set_title($heading);
@ -114,11 +116,12 @@ class PoolsTheme extends Themelet {
$page->add_block(new Block(html_escape($pool['title']), html_escape($pool['description']), "main", 10)); $page->add_block(new Block(html_escape($pool['title']), html_escape($pool['description']), "main", 10));
} }
else { else {
$pool_info = "<table id='poolsList' class='zebra'>". $pool_info = '
"<thead><tr>". <table id="poolsList" class="zebra">
"<th class='left'>Title</th>". <thead><tr>
"<th class='left'>Description</th>". <th class="left">Title</th>
"</tr></thead>"; <th class="left">Description</th>
</tr></thead><tbody>';
$n = 0; $n = 0;
foreach($pools as $pool) { foreach($pools as $pool) {
@ -146,7 +149,7 @@ class PoolsTheme extends Themelet {
/* /*
* HERE WE DISPLAY THE POOL WITH TITLE DESCRIPTION AND IMAGES WITH PAGINATION * 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; global $user, $page;
$this->display_top($pools, "Pool: ".html_escape($pools[0]['title'])); $this->display_top($pools, "Pool: ".html_escape($pools[0]['title']));
@ -154,9 +157,7 @@ class PoolsTheme extends Themelet {
$pool_images = ''; $pool_images = '';
foreach($images as $image) { foreach($images as $image) {
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">'. $pool_images .= "\n".$thumb_html."\n";
'<a href="$image_link">'.$thumb_html.'</a>'.
'</span>';
} }
$page->add_block(new Block("Viewing Posts", $pool_images, "main", 30)); $page->add_block(new Block("Viewing Posts", $pool_images, "main", 30));
@ -167,43 +168,49 @@ 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 * 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; global $user;
$editor = " $editor = "\n".make_form( make_link('pool/import') ).'
".make_form(make_link("pool/import"))." <input type="text" name="pool_tag" id="edit_pool_tag" value="Please enter a tag" onclick="this.value=\'\';"/>
<input type='text' name='pool_tag' id='edit' value='Please enter a tag' onclick='this.value=\"\";'/> <input type="submit" name="edit" id="edit_pool_import_btn" value="Import"/>
<input type='submit' name='edit' id='edit' value='Import'/> <input type="hidden" name="pool_id" value="'.$pool['id'].'">
<input type='hidden' name='pool_id' value='".$pool['id']."'>
</form> </form>
<form method='GET' action='".make_link("pool/edit/".$pool['id'])."'> '.make_form( make_link('pool/edit') ).'
<input type='submit' name='edit' id='edit' value='Edit Pool'/> <input type="submit" name="edit" id="edit_pool_btn" value="Edit Pool"/>
<input type="hidden" name="edit_pool" value="yes">
<input type="hidden" name="pool_id" value="'.$pool['id'].'">
</form> </form>
<form method='GET' action='".make_link("pool/order/".$pool['id'])."'> '.make_form( make_link('pool/order') ).'
<input type='submit' name='edit' id='edit' value='Order Pool'/> <input type="submit" name="edit" id="edit_pool_order_btn" value="Order Pool"/>
<input type="hidden" name="order_view" value="yes">
<input type="hidden" name="pool_id" value="'.$pool['id'].'">
</form> </form>
"; ';
if($user->id == $pool['user_id'] || $user->is_admin()){ if($user->id == $pool['user_id'] || $user->is_admin()){
$editor .= " $editor .= "
<script type='text/javascript'> <script language='javascript' type='text/javascript'>
<!--
function confirm_action() { function confirm_action() {
return confirm('Are you sure that you want to delete this pool?'); return confirm('Are you sure that you want to delete this pool?');
} }
//-->
</script> </script>
".make_form(make_link("pool/nuke"))." ".make_form(make_link("pool/nuke"))."
<input type='submit' name='delete' id='delete' value='Delete Pool' onclick='return confirm_action()' /> <input type='submit' name='delete' id='delete_pool_btn' value='Delete Pool' onclick='return confirm_action()' />
<input type='hidden' name='pool_id' value='".$pool['id']."'> <input type='hidden' name='pool_id' value='".$pool['id']."'>
</form> </form>
"; ";
} }
if($check_all) { if($check_all) {
$editor .= " $editor .= "
<script language='JavaScript' type='text/javascript'> <script language='javascript' type='text/javascript'>
<!--
function setAll(value) { function setAll(value) {
var a=new Array(); var a=new Array();
a=document.getElementsByName('check[]'); a=document.getElementsByName('check[]');
@ -212,6 +219,7 @@ class PoolsTheme extends Themelet {
a[i].checked = value; a[i].checked = value;
} }
} }
//-->
</script> </script>
<br><input type='button' name='CheckAll' value='Check All' onClick='setAll(true)'> <br><input type='button' name='CheckAll' value='Check All' onClick='setAll(true)'>
<input type='button' name='UnCheckAll' value='Uncheck All' onClick='setAll(false)'> <input type='button' name='UnCheckAll' value='Uncheck All' onClick='setAll(false)'>
@ -224,9 +232,11 @@ class PoolsTheme extends Themelet {
/* /*
* HERE WE DISPLAY THE RESULT OF THE SEARCH ON IMPORT * 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 = " $pool_images = "
<script language='JavaScript' type='text/javascript'> <script language='javascript' type='text/javascript'>
<!--
function setAll(value) { function setAll(value) {
var a=new Array(); var a=new Array();
a=document.getElementsByName('check[]'); a=document.getElementsByName('check[]');
@ -239,6 +249,7 @@ class PoolsTheme extends Themelet {
function confirm_action() { function confirm_action() {
return confirm('Are you sure you want to add selected posts to this pool?'); return confirm('Are you sure you want to add selected posts to this pool?');
} }
//-->
</script> </script>
"; ";
@ -247,14 +258,12 @@ class PoolsTheme extends Themelet {
foreach($images as $image) { foreach($images as $image) {
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">'. $pool_images .= '<span class="thumb">'. $thumb_html .'<br>'.
'<a href="$image_link">'.$thumb_html.'</a>'.
'<br>'.
'<input name="check[]" type="checkbox" value="'.$image->id.'" />'. '<input name="check[]" type="checkbox" value="'.$image->id.'" />'.
'</span>'; '</span>';
} }
$pool_images .= "<br>". $pool_images .= "<br>".
"<input type='submit' name='edit' id='edit' value='Add Selected' onclick='return confirm_action()'/>". "<input type='submit' name='edit' id='edit_pool_add_btn' value='Add Selected' onclick='return confirm_action()'/>".
"<input type='hidden' name='pool_id' value='".$pool_id."'>". "<input type='hidden' name='pool_id' value='".$pool_id."'>".
"</form>"; "</form>";
@ -273,18 +282,17 @@ class PoolsTheme extends Themelet {
* HERE WE DISPLAY THE POOL ORDERER * HERE WE DISPLAY THE POOL ORDERER
* WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH A TEXT INPUT TO SET A NUMBER AND CHANGE THE ORDER * WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH A TEXT INPUT TO SET A NUMBER AND CHANGE THE ORDER
*/ */
public function edit_order(Page $page, $pools, $images) { public function edit_order(Page $page, /*array*/ $pools, /*array*/ $images) {
global $user; global $user;
$this->display_top($pools, "Sorting Pool"); $this->display_top($pools, "Sorting Pool");
$pool_images = "<form action='".make_link("pool/order")."' method='POST' name='checks'>"; $pool_images = "\n<form action='".make_link("pool/order")."' method='POST' name='checks'>";
$n = 0; $n = 0;
foreach($images as $pair) { foreach($images as $pair) {
$image = $pair[0]; $image = $pair[0];
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">'. $pool_images .= '<span class="thumb">'."\n".$thumb_html."\n".
'<a href="$image_link">'.$thumb_html.'</a>'.
'<br><input name="imgs['.$n.'][]" type="text" style="max-width:50px;" value="'.$image->image_order.'" />'. '<br><input name="imgs['.$n.'][]" type="text" style="max-width:50px;" value="'.$image->image_order.'" />'.
'<input name="imgs['.$n.'][]" type="hidden" value="'.$image->id.'" />'. '<input name="imgs['.$n.'][]" type="hidden" value="'.$image->id.'" />'.
'</span>'; '</span>';
@ -292,7 +300,7 @@ class PoolsTheme extends Themelet {
} }
$pool_images .= "<br>". $pool_images .= "<br>".
"<input type='submit' name='edit' id='edit' value='Order'/>". "<input type='submit' name='edit' id='edit_pool_order' value='Order'/>".
"<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>". "<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>".
"</form>"; "</form>";
@ -305,29 +313,25 @@ class PoolsTheme extends Themelet {
* WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH * WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH
* A CHECKBOX TO SELECT WHICH IMAGE WE WANT TO REMOVE * A CHECKBOX TO SELECT WHICH IMAGE WE WANT TO REMOVE
*/ */
public function edit_pool(Page $page, $pools, $images) { public function edit_pool(Page $page, /*array*/ $pools, /*array*/ $images) {
global $user; global $user;
$this->display_top($pools, "Editing Pool", true); $this->display_top($pools, "Editing Pool", true);
$pool_images = " $pool_images = "\n<form action='".make_link("pool/remove_posts")."' method='POST' name='checks'>";
";
$pool_images = "<form action='".make_link("pool/remove_posts")."' method='POST' name='checks'>";
foreach($images as $pair) { foreach($images as $pair) {
$image = $pair[0]; $image = $pair[0];
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">'. $pool_images .= '<span class="thumb">'."\n".$thumb_html."\n".
'<a href="$image_link">'.$thumb_html.'</a>'.
'<br><input name="check[]" type="checkbox" value="'.$image->id.'" />'. '<br><input name="check[]" type="checkbox" value="'.$image->id.'" />'.
'</span>'; '</span>';
} }
$pool_images .= "<br>". $pool_images .= "<br>".
"<input type='submit' name='edit' id='edit' value='Remove Selected'/>". "<input type='submit' name='edit' id='edit_pool_remove_sel' value='Remove Selected'/>".
"<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>". "<input type='hidden' name='pool_id' value='".$pools[0]['id']."'>".
"</form>"; "</form>";
@ -338,17 +342,18 @@ class PoolsTheme extends Themelet {
/* /*
* HERE WE DISPLAY THE HISTORY LIST * HERE WE DISPLAY THE HISTORY LIST
*/ */
public function show_history($histories, $pageNumber, $totalPages) { public function show_history($histories, /*int*/ $pageNumber, /*int*/ $totalPages) {
global $page; global $page;
$html = "<table id='poolsList' class='zebra'>". $html = '
"<thead><tr>". <table id="poolsList" class="zebra">
"<th>Pool</th>". <thead><tr>
"<th>Post Count</th>". <th>Pool</th>
"<th>Changes</th>". <th>Post Count</th>
"<th>Updater</th>". <th>Changes</th>
"<th>Date</th>". <th>Updater</th>
"<th>Action</th>". <th>Date</th>
"</tr></thead>"; <th>Action</th>
</tr></thead><tbody>';
$n = 0; $n = 0;
foreach($histories as $history) { foreach($histories as $history) {
@ -392,10 +397,10 @@ class PoolsTheme extends Themelet {
} }
/* /**
* HERE WE DISPLAY THE ERROR * Display an error message to the user.
*/ */
public function display_error($errMessage) { public function display_error(/*string*/ $errMessage) {
global $page; global $page;
$page->set_title("Error"); $page->set_title("Error");

View File

@ -24,6 +24,7 @@ class RandomImage extends Extension {
public function onPageRequest(PageRequestEvent $event) { public function onPageRequest(PageRequestEvent $event) {
global $config, $database, $page, $user; global $config, $database, $page, $user;
if($event->page_matches("random_image")) { if($event->page_matches("random_image")) {
$action = '';
if($event->count_args() == 1) { if($event->count_args() == 1) {
$action = $event->get_arg(0); $action = $event->get_arg(0);
$search_terms = array(); $search_terms = array();
@ -37,14 +38,14 @@ class RandomImage extends Extension {
} }
$image = Image::by_random($search_terms); $image = Image::by_random($search_terms);
if($action == "download") { if($action === "download") {
if(!is_null($image)) { if(!is_null($image)) {
$page->set_mode("data"); $page->set_mode("data");
$page->set_type("image/jpeg"); $page->set_type("image/jpeg");
$page->set_data(file_get_contents($image->get_image_filename())); $page->set_data(file_get_contents($image->get_image_filename()));
} }
} }
if($action == "view") { if($action === "view") {
if(!is_null($image)) { if(!is_null($image)) {
send_event(new DisplayingImageEvent($image, $page)); send_event(new DisplayingImageEvent($image, $page));
} }

View File

@ -17,7 +17,7 @@ class RandomImageTheme extends Themelet {
<center><div> <center><div>
<a href='$h_view_link' style='position: relative; height: {$tsize[1]}px; width: {$tsize[0]}px;'> <a href='$h_view_link' style='position: relative; height: {$tsize[1]}px; width: {$tsize[0]}px;'>
<img id='thumb_$i_id' title='$h_tip' alt='$h_tip' class='highlighted' style='height: {$tsize[1]}px; width: {$tsize[0]}px;' src='$h_thumb_link'> <img id='thumb_rand_$i_id' title='$h_tip' alt='$h_tip' class='highlighted' style='height: {$tsize[1]}px; width: {$tsize[0]}px;' src='$h_thumb_link'>
</a> </a>
</div></center> </div></center>

View File

@ -19,13 +19,109 @@ class RatingSetEvent extends Event {
} }
class Ratings extends Extension { class Ratings extends Extension {
public function get_priority() {return 50;}
public function onInitExt($event) {
global $config;
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');
}
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, "<br>Users: ");
$sb->add_choice_option("ext_rating_admin_privs", $privs, "<br>Admins: ");
$event->panel->add_block($sb);
}
public function onAdminBuilding(AdminBuildingEvent $event) { public function onAdminBuilding(AdminBuildingEvent $event) {
$this->theme->display_bulk_rater(); $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) { public function onPageRequest(PageRequestEvent $event) {
if($event->page_matches("admin/bulk_rate")) { global $database, $user, $page;
global $database, $user, $page;
if ($event->page_matches("admin/bulk_rate")) {
if(!$user->is_admin()) { if(!$user->is_admin()) {
throw PermissionDeniedException(); throw PermissionDeniedException();
} }
@ -52,97 +148,12 @@ class Ratings extends Extension {
} }
} }
} }
public function onInitExt(InitExtEvent $event) {
global $config;
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');
}
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 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, "<br>Users: ");
$sb->add_choice_option("ext_rating_admin_privs", $privs, "<br>Admins: ");
$event->panel->add_block($sb);
}
public function onParseLinkTemplate(ParseLinkTemplateEvent $event) {
$event->replace('$rating', $this->theme->rating_to_name($event->image->rating));
}
public function onSearchTermParse(SearchTermParseEvent $event) {
$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 onDisplayingImage(DisplayingImageEvent $event) {
/**
* Deny images upon insufficient permissions.
**/
global $user, $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 $user) { public static function get_user_privs($user) {
global $config; global $config;
if($user->is_anonymous()) { if($user->is_anonymous()) {
$sqes = $config->get_string("ext_rating_anon_privs"); $sqes = $config->get_string("ext_rating_anon_privs");

View File

@ -149,6 +149,12 @@ UL {
margin-bottom: 32px; margin-bottom: 32px;
} }
.pools_next_img {
display: block;
font-size: 77%;
text-align: right;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* the main part of each page * * the main part of each page *