put untags in the database

This commit is contained in:
Shish 2013-07-13 09:35:26 +01:00
parent 00e297c7d4
commit 1c5d717d27
2 changed files with 143 additions and 14 deletions

View File

@ -9,6 +9,17 @@
class NotATag extends Extension {
public function get_priority() {return 30;} // before ImageUploadEvent and tag_history
public function onInitExt(InitExtEvent $event) {
global $config, $database;
if($config->get_int("ext_notatag_version") < 1) {
$database->create_table("untags", "
tag VARCHAR(128) NOT NULL PRIMARY KEY,
redirect VARCHAR(255) NOT NULL
");
$config->set_int("ext_notatag_version", 1);
}
}
public function onImageAddition(ImageAdditionEvent $event) {
$this->scan($event->image->get_tag_array());
}
@ -18,18 +29,13 @@ class NotATag extends Extension {
}
private function scan(/*array*/ $tags_mixed) {
global $config;
$text = $config->get_string("not_a_tag_untags");
if(empty($text)) return;
global $config, $database;
$tags = array();
foreach($tags_mixed as $tag) $tags[] = strtolower($tag);
$pairs = explode("\n", $text);
foreach($pairs as $pair) {
$tag_url = explode(",", $pair);
if(count($tag_url) != 2) continue;
$pairs = $database->get_all("SELECT * FROM untags");
foreach($pairs as $tag_url) {
$tag = strtolower($tag_url[0]);
$url = $tag_url[1];
if(in_array($tag, $tags)) {
@ -39,14 +45,78 @@ class NotATag extends Extension {
}
}
public function onSetupBuilding(SetupBuildingEvent $event) {
$sb = new SetupBlock("Un-Tags");
public function onUserBlockBuilding(UserBlockBuildingEvent $event) {
global $user;
if($user->can("ban_image")) {
$event->add_link("UnTags", make_link("untag/list/1"));
}
}
$sb->add_label("List tag,url pairs");
$sb->add_longtext_option("not_a_tag_untags");
$sb->add_label("<br>(eg. 'deleteme,/wiki/reporting-images')");
public function onPageRequest(PageRequestEvent $event) {
global $config, $database, $page, $user;
$event->panel->add_block($sb);
if($event->page_matches("untag")) {
if($user->can("ban_image")) {
if($event->get_arg(0) == "add") {
$tag = isset($_POST["tag"]) ? $_POST["tag"] : $image->tag;
$redirect = isset($_POST['redirect']) ? $_POST['redirect'] : "DNP";
$database->Execute(
"INSERT INTO untags(tag, redirect) VALUES (?, ?)",
array($tag, $redirect));
$page->set_mode("redirect");
$page->set_redirect($_SERVER['HTTP_REFERER']);
}
else if($event->get_arg(0) == "remove") {
if(isset($_POST['tag'])) {
$database->Execute("DELETE FROM untags WHERE tag = ?", array($_POST['tag']));
flash_message("Image ban removed");
$page->set_mode("redirect");
$page->set_redirect($_SERVER['HTTP_REFERER']);
}
}
else if($event->get_arg(0) == "list") {
$page_num = 0;
if($event->count_args() == 2) {
$page_num = int_escape($event->get_arg(1));
}
$page_size = 100;
$page_count = ceil($database->get_one("SELECT COUNT(tag) FROM untags")/$page_size);
$this->theme->display_untags($page, $page_num, $page_count, $this->get_untags($page_num, $page_size));
}
}
}
}
public function get_untags($page, $size=100) {
global $database;
// FIXME: many
$size_i = int_escape($size);
$offset_i = int_escape($page-1)*$size_i;
$where = array("(1=1)");
$args = array();
if(!empty($_GET['tag'])) {
$where[] = 'tag SCORE_ILIKE ?';
$args[] = "%".$_GET['tag']."%";
}
if(!empty($_GET['redirect'])) {
$where[] = 'redirect SCORE_ILIKE ?';
$args[] = "%".$_GET['redirect']."%";
}
$where = implode(" AND ", $where);
$bans = $database->get_all($database->scoreql_to_sql("
SELECT *
FROM untags
WHERE $where
ORDER BY tag
LIMIT $size_i
OFFSET $offset_i
"), $args);
if($bans) {return $bans;}
else {return array();}
}
}
?>

59
ext/not_a_tag/theme.php Normal file
View File

@ -0,0 +1,59 @@
<?php
class NotATagTheme extends Themelet {
public function display_untags(Page $page, $page_number, $page_count, $bans) {
$h_bans = "";
$n = 0;
foreach($bans as $ban) {
$h_bans .= "
<tr>
".make_form(make_link("untag/remove"))."
<td width='30%'>{$ban['tag']}</td>
<td>{$ban['redirect']}</td>
<td width='10%'>
<input type='hidden' name='tag' value='{$ban['tag']}'>
<input type='submit' value='Remove'>
</td>
</form>
</tr>
";
}
$html = "
<table id='image_bans' class='zebra sortable'>
<thead>
<th>Hash</th><th>Reason</th><th>Action</th>
<tr>
<form action='".make_link("untag/list/1")."' method='GET'>
<td><input type='text' name='tag'></td>
<td><input type='text' name='redirect'></td>
<td><input type='submit' value='Search'></td>
</form>
</tr>
</thead>
$h_bans
<tfoot><tr>
".make_form(make_link("untag/add"))."
<td><input type='text' name='tag'></td>
<td><input type='text' name='redirect'></td>
<td><input type='submit' value='Ban'></td>
</form>
</tr></tfoot>
</table>
";
$prev = $page_number - 1;
$next = $page_number + 1;
$h_prev = ($page_number <= 1) ? "Prev" : "<a href='".make_link("untag/list/$prev")."'>Prev</a>";
$h_index = "<a href='".make_link()."'>Index</a>";
$h_next = ($page_number >= $page_count) ? "Next" : "<a href='".make_link("untag/list/$next")."'>Next</a>";
$nav = "$h_prev | $h_index | $h_next";
$page->set_title("UnTags");
$page->set_heading("UnTags");
$page->add_block(new Block("Edit UnTags", $html));
$page->add_block(new Block("Navigation", $nav, "left", 0));
$this->display_paginator($page, "untag/list", null, $page_number, $page_count);
}
}
?>