Added bulk action support to pools extension
This commit is contained in:
parent
8794258072
commit
9ca800d1c4
@ -9,6 +9,18 @@
|
||||
* Useful for related images like in a comic, etc.
|
||||
*/
|
||||
|
||||
abstract class PoolsConfig
|
||||
{
|
||||
const MAX_IMPORT_RESULTS = "poolsMaxImportResults";
|
||||
const IMAGES_PER_PAGE = "poolsImagesPerPage";
|
||||
const LISTS_PER_PAGE = "poolsListsPerPage";
|
||||
const UPDATED_PER_PAGE = "poolsUpdatedPerPage";
|
||||
const INFO_ON_VIEW_IMAGE = "poolsInfoOnViewImage";
|
||||
const ADDER_ON_VIEW_IMAGE = "poolsAdderOnViewImage";
|
||||
const SHOW_NAV_LINKS = "poolsShowNavLinks";
|
||||
const AUTO_INCREMENT_ORDER = "poolsAutoIncrementOrder";
|
||||
}
|
||||
|
||||
/**
|
||||
* This class is just a wrapper around SCoreException.
|
||||
*/
|
||||
@ -23,6 +35,41 @@ class PoolCreationException extends SCoreException
|
||||
}
|
||||
}
|
||||
|
||||
class PoolAddPostsEvent extends Event
|
||||
{
|
||||
public $pool_id;
|
||||
|
||||
public $posts = [];
|
||||
|
||||
public function __construct(int $pool_id, array $posts)
|
||||
{
|
||||
$this->pool_id = $pool_id;
|
||||
$this->posts = $posts;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class PoolCreationEvent extends Event
|
||||
{
|
||||
public $title;
|
||||
public $user;
|
||||
public $public;
|
||||
public $description;
|
||||
|
||||
public $new_id = -1;
|
||||
|
||||
public function __construct(string $title, User $pool_user = null, bool $public = false, string $description = "")
|
||||
{
|
||||
global $user;
|
||||
|
||||
$this->title = $title;
|
||||
$this->user = $pool_user ?? $user;
|
||||
$this->public = $public;
|
||||
$this->description = $description;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class Pools extends Extension
|
||||
{
|
||||
public function onInitExt(InitExtEvent $event)
|
||||
@ -30,14 +77,14 @@ class Pools extends Extension
|
||||
global $config, $database;
|
||||
|
||||
// Set the defaults for the pools extension
|
||||
$config->set_default_int("poolsMaxImportResults", 1000);
|
||||
$config->set_default_int("poolsImagesPerPage", 20);
|
||||
$config->set_default_int("poolsListsPerPage", 20);
|
||||
$config->set_default_int("poolsUpdatedPerPage", 20);
|
||||
$config->set_default_bool("poolsInfoOnViewImage", false);
|
||||
$config->set_default_bool("poolsAdderOnViewImage", false);
|
||||
$config->set_default_bool("poolsShowNavLinks", false);
|
||||
$config->set_default_bool("poolsAutoIncrementOrder", false);
|
||||
$config->set_default_int(PoolsConfig::MAX_IMPORT_RESULTS, 1000);
|
||||
$config->set_default_int(PoolsConfig::IMAGES_PER_PAGE, 20);
|
||||
$config->set_default_int(PoolsConfig::LISTS_PER_PAGE, 20);
|
||||
$config->set_default_int(PoolsConfig::UPDATED_PER_PAGE, 20);
|
||||
$config->set_default_bool(PoolsConfig::INFO_ON_VIEW_IMAGE, false);
|
||||
$config->set_default_bool(PoolsConfig::ADDER_ON_VIEW_IMAGE, false);
|
||||
$config->set_default_bool(PoolsConfig::SHOW_NAV_LINKS, false);
|
||||
$config->set_default_bool(PoolsConfig::AUTO_INCREMENT_ORDER, false);
|
||||
|
||||
// Create the database tables
|
||||
if ($config->get_int("ext_pools_version") < 1) {
|
||||
@ -86,21 +133,21 @@ class Pools extends Extension
|
||||
public function onSetupBuilding(SetupBuildingEvent $event)
|
||||
{
|
||||
$sb = new SetupBlock("Pools");
|
||||
$sb->add_int_option("poolsMaxImportResults", "Max results on import: ");
|
||||
$sb->add_int_option("poolsImagesPerPage", "<br>Images 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_bool_option("poolsInfoOnViewImage", "<br>Show pool info on image: ");
|
||||
$sb->add_bool_option("poolsShowNavLinks", "<br>Show 'Prev' & 'Next' links when viewing pool images: ");
|
||||
$sb->add_bool_option("poolsAutoIncrementOrder", "<br>Autoincrement order when post is added to pool:");
|
||||
//$sb->add_bool_option("poolsAdderOnViewImage", "<br>Show pool adder on image: ");
|
||||
$sb->add_int_option(PoolsConfig::MAX_IMPORT_RESULTS, "Max results on import: ");
|
||||
$sb->add_int_option(PoolsConfig::IMAGES_PER_PAGE, "<br>Images per page: ");
|
||||
$sb->add_int_option(PoolsConfig::LISTS_PER_PAGE, "<br>Index list items per page: ");
|
||||
$sb->add_int_option(PoolsConfig::UPDATED_PER_PAGE, "<br>Updated list items per page: ");
|
||||
$sb->add_bool_option(PoolsConfig::INFO_ON_VIEW_IMAGE, "<br>Show pool info on image: ");
|
||||
$sb->add_bool_option(PoolsConfig::SHOW_NAV_LINKS, "<br>Show 'Prev' & 'Next' links when viewing pool images: ");
|
||||
$sb->add_bool_option(PoolsConfig::AUTO_INCREMENT_ORDER, "<br>Autoincrement order when post is added to pool:");
|
||||
//$sb->add_bool_option(PoolsConfig::ADDER_ON_VIEW_IMAGE, "<br>Show pool adder on image: ");
|
||||
|
||||
$event->panel->add_block($sb);
|
||||
}
|
||||
|
||||
public function onPageRequest(PageRequestEvent $event)
|
||||
{
|
||||
global $page, $user;
|
||||
global $page, $user, $database;
|
||||
|
||||
if ($event->page_matches("pool")) {
|
||||
$pool_id = 0;
|
||||
@ -129,9 +176,16 @@ class Pools extends Extension
|
||||
|
||||
case "create": // ADD _POST
|
||||
try {
|
||||
$newPoolID = $this->add_pool();
|
||||
$title = $_POST["title"];
|
||||
$event = new PoolCreationEvent(
|
||||
$title,
|
||||
$user,
|
||||
$_POST["public"] === "Y",
|
||||
$_POST["description"]);
|
||||
|
||||
send_event($event);
|
||||
$page->set_mode(PageMode::REDIRECT);
|
||||
$page->set_redirect(make_link("pool/view/".$newPoolID));
|
||||
$page->set_redirect(make_link("pool/view/" . $event->new_id));
|
||||
} catch (PoolCreationException $e) {
|
||||
$this->theme->display_error(400, "Error", $e->error);
|
||||
}
|
||||
@ -193,7 +247,11 @@ class Pools extends Extension
|
||||
|
||||
case "add_posts":
|
||||
if ($this->have_permission($user, $pool)) {
|
||||
$this->add_posts();
|
||||
$images = [];
|
||||
foreach ($_POST['check'] as $imageID) {
|
||||
$images[] = $imageID;
|
||||
}
|
||||
send_event(new PoolAddPostsEvent($pool_id, $images));
|
||||
$page->set_mode(PageMode::REDIRECT);
|
||||
$page->set_redirect(make_link("pool/view/" . $pool_id));
|
||||
} else {
|
||||
@ -260,11 +318,11 @@ class Pools extends Extension
|
||||
{
|
||||
global $config;
|
||||
|
||||
if ($config->get_bool("poolsInfoOnViewImage")) {
|
||||
if ($config->get_bool(PoolsConfig::INFO_ON_VIEW_IMAGE)) {
|
||||
$imageID = $event->image->id;
|
||||
$poolsIDs = $this->get_pool_ids($imageID);
|
||||
|
||||
$show_nav = $config->get_bool("poolsShowNavLinks", false);
|
||||
$show_nav = $config->get_bool(PoolsConfig::SHOW_NAV_LINKS, false);
|
||||
|
||||
$navInfo = [];
|
||||
foreach ($poolsIDs as $poolID) {
|
||||
@ -285,7 +343,7 @@ class Pools extends Extension
|
||||
public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event)
|
||||
{
|
||||
global $config, $database, $user;
|
||||
if ($config->get_bool("poolsAdderOnViewImage") && !$user->is_anonymous()) {
|
||||
if ($config->get_bool(PoolsConfig::ADDER_ON_VIEW_IMAGE) && !$user->is_anonymous()) {
|
||||
if ($user->is_admin()) {
|
||||
$pools = $database->get_all("SELECT * FROM pools");
|
||||
} else {
|
||||
@ -350,6 +408,45 @@ class Pools extends Extension
|
||||
}
|
||||
}
|
||||
|
||||
public function onBulkActionBlockBuilding(BulkActionBlockBuildingEvent $event)
|
||||
{
|
||||
global $user, $database;
|
||||
|
||||
$pools = $database->get_all("SELECT * FROM pools ORDER BY title ");
|
||||
|
||||
|
||||
$event->add_action("bulk_pool_add_existing", "Add To Pool", "", $this->theme->get_bulk_pool_selector($pools));
|
||||
$event->add_action("bulk_pool_add_new", "Create Pool", "", $this->theme->get_bulk_pool_input());
|
||||
}
|
||||
|
||||
public function onBulkAction(BulkActionEvent $event)
|
||||
{
|
||||
global $user;
|
||||
|
||||
switch ($event->action) {
|
||||
case "bulk_pool_add_existing":
|
||||
if (!isset($_POST['bulk_pool_select'])) {
|
||||
return;
|
||||
}
|
||||
$pool_id = intval($_POST['bulk_pool_select']);
|
||||
$pool = $this->get_pool($pool_id);
|
||||
|
||||
if ($this->have_permission($user, $pool)) {
|
||||
send_event(new PoolAddPostsEvent($pool_id, $event->items));
|
||||
}
|
||||
break;
|
||||
case "bulk_pool_add_new":
|
||||
if (!isset($_POST['bulk_pool_new'])) {
|
||||
return;
|
||||
}
|
||||
$new_pool_title = $_POST['bulk_pool_new'];
|
||||
$pce = new PoolCreationEvent($new_pool_title);
|
||||
send_event($pce);
|
||||
send_event(new PoolAddPostsEvent($pce->new_id, $event->items));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------- */
|
||||
/* -------------- Private Functions -------------- */
|
||||
/* ------------------------------------------------- */
|
||||
@ -378,7 +475,7 @@ class Pools extends Extension
|
||||
|
||||
$pageNumber = clamp($pageNumber, 1, null) - 1;
|
||||
|
||||
$poolsPerPage = $config->get_int("poolsListsPerPage");
|
||||
$poolsPerPage = $config->get_int(PoolsConfig::LISTS_PER_PAGE);
|
||||
|
||||
$order_by = "";
|
||||
$order = $page->get_cookie("ui-order-pool");
|
||||
@ -411,31 +508,32 @@ class Pools extends Extension
|
||||
/**
|
||||
* HERE WE CREATE A NEW POOL
|
||||
*/
|
||||
private function add_pool(): int
|
||||
public function onPoolCreation(PoolCreationEvent $event)
|
||||
{
|
||||
global $user, $database;
|
||||
|
||||
if ($user->is_anonymous()) {
|
||||
throw new PoolCreationException("You must be registered and logged in to add a image.");
|
||||
}
|
||||
if (empty($_POST["title"])) {
|
||||
if (empty($event->title)) {
|
||||
throw new PoolCreationException("Pool title is empty.");
|
||||
}
|
||||
if ($this->get_single_pool_from_title($_POST["title"])) {
|
||||
if ($this->get_single_pool_from_title($event->title)) {
|
||||
throw new PoolCreationException("A pool using this title already exists.");
|
||||
}
|
||||
|
||||
$public = $_POST["public"] === "Y" ? "Y" : "N";
|
||||
|
||||
$database->execute(
|
||||
"
|
||||
INSERT INTO pools (user_id, public, title, description, date)
|
||||
VALUES (:uid, :public, :title, :desc, now())",
|
||||
["uid"=>$user->id, "public"=>$public, "title"=>$_POST["title"], "desc"=>$_POST["description"]]
|
||||
["uid" => $event->user->id, "public" => $event->public ? "Y" : "N", "title" => $event->title, "desc" => $event->description]
|
||||
);
|
||||
|
||||
$poolID = $database->get_last_insert_id('pools_id_seq');
|
||||
log_info("pools", "Pool {$poolID} created by {$user->name}");
|
||||
return $poolID;
|
||||
|
||||
$event->new_id = $poolID;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -461,7 +559,7 @@ class Pools extends Extension
|
||||
/**
|
||||
* Retrieve information about a pool given a pool title.
|
||||
*/
|
||||
private function get_single_pool_from_title(string $poolTitle): array
|
||||
private function get_single_pool_from_title(string $poolTitle): ?array
|
||||
{
|
||||
global $database;
|
||||
return $database->get_row("SELECT * FROM pools WHERE title=:title", ["title" => $poolTitle]);
|
||||
@ -493,7 +591,7 @@ class Pools extends Extension
|
||||
{
|
||||
global $page, $config;
|
||||
|
||||
$poolsMaxResults = $config->get_int("poolsMaxImportResults", 1000);
|
||||
$poolsMaxResults = $config->get_int(PoolsConfig::MAX_IMPORT_RESULTS, 1000);
|
||||
|
||||
$images = $images = Image::find_images(0, $poolsMaxResults, Tag::explode($_POST["pool_tag"]));
|
||||
$this->theme->pool_result($page, $images, $this->get_pool($pool_id));
|
||||
@ -503,41 +601,27 @@ class Pools extends Extension
|
||||
/**
|
||||
* 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(): int
|
||||
public function onPoolAddPosts(PoolAddPostsEvent $event)
|
||||
{
|
||||
global $database;
|
||||
global $database, $user;
|
||||
|
||||
$pool = $this->get_single_pool($event->pool_id);
|
||||
if (!$this->have_permission($user, $pool)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$poolID = int_escape($_POST['pool_id']);
|
||||
$images = " ";
|
||||
|
||||
foreach ($_POST['check'] as $imageID) {
|
||||
if (!$this->check_post($poolID, $imageID)) {
|
||||
$database->execute(
|
||||
"
|
||||
INSERT INTO pool_images (pool_id, image_id)
|
||||
VALUES (:pid, :iid)",
|
||||
["pid"=>$poolID, "iid"=>$imageID]
|
||||
);
|
||||
|
||||
$images .= " ".$imageID;
|
||||
foreach ($event->posts as $post_id) {
|
||||
if ($this->add_post($event->pool_id, $post_id, false)) {
|
||||
$images .= " " . $post_id;
|
||||
}
|
||||
}
|
||||
|
||||
if (!strlen($images) == 0) {
|
||||
$count = int_escape($database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", ["pid"=>$poolID]));
|
||||
$this->add_history($poolID, 1, $images, $count);
|
||||
$count = int_escape($database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", ["pid" => $event->pool_id]));
|
||||
$this->add_history($event->pool_id, 1, $images, $count);
|
||||
}
|
||||
|
||||
$database->Execute(
|
||||
"
|
||||
UPDATE pools
|
||||
SET posts=(SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid)
|
||||
WHERE id=:pid",
|
||||
["pid"=>$poolID]
|
||||
);
|
||||
return $poolID;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -682,7 +766,7 @@ class Pools extends Extension
|
||||
$poolID = int_escape($poolID);
|
||||
$pool = $this->get_pool($poolID);
|
||||
|
||||
$imagesPerPage = $config->get_int("poolsImagesPerPage");
|
||||
$imagesPerPage = $config->get_int(PoolsConfig::IMAGES_PER_PAGE);
|
||||
|
||||
// WE CHECK IF THE EXTENSION RATING IS INSTALLED, WHICH VERSION AND IF IT
|
||||
// WORKS TO SHOW/HIDE SAFE, QUESTIONABLE, EXPLICIT AND UNRATED IMAGES FROM USER
|
||||
@ -723,6 +807,7 @@ class Pools extends Extension
|
||||
$totalPages = ceil($database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", ["pid" => $poolID]) / $imagesPerPage);
|
||||
}
|
||||
|
||||
|
||||
$images = [];
|
||||
foreach ($result as $singleResult) {
|
||||
$images[] = Image::by_id($singleResult["image_id"]);
|
||||
@ -831,7 +916,7 @@ class Pools extends Extension
|
||||
$pageNumber--;
|
||||
}
|
||||
|
||||
$historiesPerPage = $config->get_int("poolsUpdatedPerPage");
|
||||
$historiesPerPage = $config->get_int(PoolsConfig::UPDATED_PER_PAGE);
|
||||
|
||||
$history = $database->get_all("
|
||||
SELECT h.id, h.pool_id, h.user_id, h.action, h.images,
|
||||
@ -898,17 +983,17 @@ class Pools extends Extension
|
||||
* HERE WE ADD A SIMPLE POST FROM POOL.
|
||||
* USED WITH FOREACH IN revert_history() & onTagTermParse().
|
||||
*/
|
||||
private function add_post(int $poolID, int $imageID, bool $history=false, int $imageOrder=0)
|
||||
private function add_post(int $poolID, int $imageID, bool $history = false, int $imageOrder = 0): bool
|
||||
{
|
||||
global $database, $config;
|
||||
|
||||
if (!$this->check_post($poolID, $imageID)) {
|
||||
if ($config->get_bool("poolsAutoIncrementOrder") && $imageOrder === 0) {
|
||||
if ($config->get_bool(PoolsConfig::AUTO_INCREMENT_ORDER) && $imageOrder === 0) {
|
||||
$imageOrder = $database->get_one(
|
||||
"
|
||||
SELECT CASE WHEN image_order IS NOT NULL THEN MAX(image_order) + 1 ELSE 0 END
|
||||
SELECT COALESCE(MAX(image_order),0) + 1
|
||||
FROM pool_images
|
||||
WHERE pool_id = :pid",
|
||||
WHERE pool_id = :pid AND image_order IS NOT NULL",
|
||||
["pid" => $poolID]
|
||||
);
|
||||
}
|
||||
@ -919,14 +1004,25 @@ class Pools extends Extension
|
||||
VALUES (:pid, :iid, :ord)",
|
||||
["pid" => $poolID, "iid" => $imageID, "ord" => $imageOrder]
|
||||
);
|
||||
} else {
|
||||
// If the post is already added, there is nothing else to do
|
||||
return false;
|
||||
}
|
||||
|
||||
$database->execute("UPDATE pools SET posts=(SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid) WHERE id=:pid", ["pid"=>$poolID]);
|
||||
$this->update_count($poolID);
|
||||
|
||||
if ($history) {
|
||||
$count = $database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", ["pid" => $poolID]);
|
||||
$this->add_history($poolID, 1, $imageID, $count);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private function update_count($pool_id)
|
||||
{
|
||||
global $database;
|
||||
$database->execute("UPDATE pools SET posts=(SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid) WHERE id=:pid", ["pid" => $pool_id]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -938,7 +1034,8 @@ class Pools extends Extension
|
||||
global $database;
|
||||
|
||||
$database->execute("DELETE FROM pool_images WHERE pool_id = :pid AND image_id = :iid", ["pid" => $poolID, "iid" => $imageID]);
|
||||
$database->execute("UPDATE pools SET posts=(SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid) WHERE id=:pid", ["pid"=>$poolID]);
|
||||
|
||||
$this->update_count($poolID);
|
||||
|
||||
if ($history) {
|
||||
$count = $database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", ["pid" => $poolID]);
|
||||
|
@ -96,7 +96,6 @@ class PoolsTheme extends Themelet
|
||||
$page->add_block(new Block("Pools", $html, "main", 10));
|
||||
|
||||
|
||||
|
||||
$this->display_paginator($page, "pool/list", null, $pageNumber, $totalPages);
|
||||
}
|
||||
|
||||
@ -390,4 +389,18 @@ class PoolsTheme extends Themelet
|
||||
|
||||
$this->display_paginator($page, "pool/updated", null, $pageNumber, $totalPages);
|
||||
}
|
||||
|
||||
public function get_bulk_pool_selector(array $pools)
|
||||
{
|
||||
$output = "<select name='bulk_pool_select' required='required'><option></option>";
|
||||
foreach ($pools as $pool) {
|
||||
$output .= "<option value='" . $pool["id"] . "' >" . $pool["title"] . "</option>";
|
||||
}
|
||||
return $output . "</select>";
|
||||
}
|
||||
|
||||
public function get_bulk_pool_input()
|
||||
{
|
||||
return "<input type='text' name='bulk_pool_new' placeholder='New pool' required='required' />";
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user