use strict;
use warnings;
-use Carp;
+use Carp qw( carp );
use Exporter;
use C4::Context;
-use C4::Debug;
-use Module::Load::Conditional qw/check_install/;
-#use Data::Dumper;
+use Module::Load::Conditional qw( check_install );
+use Koha::Tags;
+use Koha::Tags::Approvals;
+use Koha::Tags::Indexes;
use constant TAG_FIELDS => qw(tag_id borrowernumber biblionumber term language date_created);
use constant TAG_SELECT => "SELECT " . join(',', TAG_FIELDS) . "\n FROM tags_all\n";
-use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-
+our (@ISA, @EXPORT_OK);
BEGIN {
- @ISA = qw(Exporter);
+ @ISA = qw(Exporter);
@EXPORT_OK = qw(
- &get_tag &get_tags &get_tag_rows
- &add_tags &add_tag
- &delete_tag_row_by_id
- &remove_tag
- &delete_tag_rows_by_ids
- &get_approval_rows
- &blacklist
- &whitelist
- &is_approved
- &approval_counts
- &get_count_by_tag_status
- &get_filters
+ get_tags get_tag_rows
+ add_tags
+ add_tag
+ add_tag_approval
+ add_tag_index
+ remove_tag
+ get_approval_rows
+ blacklist
+ whitelist
+ is_approved
+ approval_counts
+ get_count_by_tag_status
+ get_filters
stratify_tags
);
- # %EXPORT_TAGS = ();
my $ext_dict = C4::Context->preference('TagsExternalDictionary');
if ( $ext_dict && ! check_install( module => 'Lingua::Ispell' ) ) {
warn "Ignoring TagsExternalDictionary, because Lingua::Ispell is not installed.";
$ext_dict = q{};
}
- if ($debug) {
- require Data::Dumper;
- import Data::Dumper qw(:DEFAULT);
- print STDERR __PACKAGE__ . " external dictionary = " . ($ext_dict||'none') . "\n";
- }
if ($ext_dict) {
require Lingua::Ispell;
import Lingua::Ispell qw(spellcheck add_word_lc);
$Lingua::Ispell::path = $ext_dict;
- $debug and print STDERR "\$Lingua::Ispell::path = $Lingua::Ispell::path\n";
}
}
=head1 C4::Tags.pm - Support for user tagging of biblios.
-More verose debugging messages are sent in the presence of non-zero $ENV{"DEBUG"}.
-
=cut
sub get_filters {
$sth->execute;
my $result = $sth->fetchrow_hashref();
$result->{approved_total} = $result->{approved_count} + $result->{rejected_count} + $result->{unapproved_count};
- $debug and warn "counts returned: " . Dumper $result;
return $result;
}
}
sub remove_tag {
- my $tag_id = shift or return;
- my $user_id = (@_) ? shift : undef;
- my $rows = (defined $user_id) ?
- get_tag_rows({tag_id=>$tag_id, borrowernumber=>$user_id}) :
- get_tag_rows({tag_id=>$tag_id}) ;
- $rows or return 0;
- (scalar(@$rows) == 1) or return; # should never happen (duplicate ids)
- my $row = shift(@$rows);
- ($tag_id == $row->{tag_id}) or return 0;
- my $tags = get_tags({term=>$row->{term}, biblionumber=>$row->{biblionumber}});
- my $index = shift(@$tags);
- $debug and print STDERR
- sprintf "remove_tag: tag_id=>%s, biblionumber=>%s, weight=>%s, weight_total=>%s\n",
- $row->{tag_id}, $row->{biblionumber}, $index->{weight}, $index->{weight_total};
- if ($index->{weight} <= 1) {
- delete_tag_index($row->{term},$row->{biblionumber});
- } else {
- decrement_weight($row->{term},$row->{biblionumber});
- }
- if ($index->{weight_total} <= 1) {
- delete_tag_approval($row->{term});
- } else {
- decrement_weight_total($row->{term});
- }
- delete_tag_row_by_id($tag_id);
-}
-
-sub delete_tag_index {
- (@_) or return;
- my $sth = C4::Context->dbh->prepare("DELETE FROM tags_index WHERE term = ? AND biblionumber = ? LIMIT 1");
- $sth->execute(@_);
- return $sth->rows || 0;
-}
-sub delete_tag_approval {
- (@_) or return;
- my $sth = C4::Context->dbh->prepare("DELETE FROM tags_approval WHERE term = ? LIMIT 1");
- $sth->execute(shift);
- return $sth->rows || 0;
-}
-sub delete_tag_row_by_id {
- (@_) or return;
- my $sth = C4::Context->dbh->prepare("DELETE FROM tags_all WHERE tag_id = ? LIMIT 1");
- $sth->execute(shift);
- return $sth->rows || 0;
-}
-sub delete_tag_rows_by_ids {
- (@_) or return;
- my $i=0;
- foreach(@_) {
- $i += delete_tag_row_by_id($_);
- }
- ($i == scalar(@_)) or
- warn sprintf "delete_tag_rows_by_ids tried %s tag_ids, only succeeded on $i", scalar(@_);
- return $i;
+ my $tag_id = shift or return;
+ my $user_id = (@_) ? shift : undef;
+ my $rows = (defined $user_id) ?
+ get_tag_rows({tag_id=>$tag_id, borrowernumber=>$user_id}) :
+ get_tag_rows({tag_id=>$tag_id}) ;
+ $rows or return 0;
+ (scalar(@$rows) == 1) or return; # should never happen (duplicate ids)
+ my $row = shift(@$rows);
+ ($tag_id == $row->{tag_id}) or return 0;
+ my $tags = get_tags({term=>$row->{term}, biblionumber=>$row->{biblionumber}});
+ my $index = shift(@$tags);
+ if ($index->{weight} <= 1) {
+ Koha::Tags::Indexes->search({ term => $row->{term}, biblionumber => $row->{biblionumber} })->delete;
+ } else {
+ decrement_weight($row->{term},$row->{biblionumber});
+ }
+ if ($index->{weight_total} <= 1) {
+ Koha::Tags::Approvals->search({ term => $row->{term} })->delete;
+ } else {
+ decrement_weight_total($row->{term});
+ }
+ Koha::Tags->search({ tag_id => $tag_id })->delete;
}
sub get_tag_rows {
my $limit = "";
my @exe_args = ();
foreach my $key (keys %$hash) {
- $debug and print STDERR "get_tag_rows arg. '$key' = ", $hash->{$key}, "\n";
unless (length $key) {
carp "Empty argument key to get_tag_rows: ignoring!";
next;
}
}
my $query = TAG_SELECT . ($wheres||'') . $limit;
- $debug and print STDERR "get_tag_rows query:\n $query\n",
- "get_tag_rows query args: ", join(',', @exe_args), "\n";
my $sth = C4::Context->dbh->prepare($query);
if (@exe_args) {
$sth->execute(@exe_args);
my $order = "";
my @exe_args = ();
foreach my $key (keys %$hash) {
- $debug and print STDERR "get_tags arg. '$key' = ", $hash->{$key}, "\n";
unless (length $key) {
carp "Empty argument key to get_tags: ignoring!";
next;
LEFT JOIN tags_approval
ON tags_index.term = tags_approval.term
" . ($wheres||'') . $order . $limit;
- $debug and print STDERR "get_tags query:\n $query\n",
- "get_tags query args: ", join(',', @exe_args), "\n";
my $sth = C4::Context->dbh->prepare($query);
if (@exe_args) {
$sth->execute(@exe_args);
my $order = "";
my @exe_args = ();
foreach my $key (keys %$hash) {
- $debug and print STDERR "get_approval_rows arg. '$key' = ", $hash->{$key}, "\n";
unless (length $key) {
carp "Empty argument key to get_approval_rows: ignoring!";
next;
LEFT JOIN borrowers
ON tags_approval.approved_by = borrowers.borrowernumber ";
$query .= ($wheres||'') . $order . $limit;
- $debug and print STDERR "get_approval_rows query:\n $query\n",
- "get_approval_rows query args: ", join(',', @exe_args), "\n";
my $sth = C4::Context->dbh->prepare($query);
if (@exe_args) {
$sth->execute(@exe_args);
}
sub add_tag_approval { # or disapproval
- $debug and warn "add_tag_approval(" . join(", ",map {defined($_) ? $_ : 'UNDEF'} @_) . ")";
my $term = shift or return;
my $query = "SELECT * FROM tags_approval WHERE term = ?";
my $sth = C4::Context->dbh->prepare($query);
} else {
$query = "INSERT INTO tags_approval (term,date_approved) VALUES (?,NOW())";
}
- $debug and print STDERR "add_tag_approval query: $query\nadd_tag_approval args: (" . join(", ", @exe_args) . ")\n";
$sth = C4::Context->dbh->prepare($query);
$sth->execute(@exe_args);
return $sth->rows;
my $term = shift or return;
my $approval = (scalar @_ ? shift : 1); # default is to approve
my $query = "UPDATE tags_approval SET approved_by=?, approved=?, date_approved=NOW() WHERE term = ?";
- $debug and print STDERR "mod_tag_approval query: $query\nmod_tag_approval args: ($operator,$approval,$term)\n";
my $sth = C4::Context->dbh->prepare($query);
$sth->execute($operator,$approval,$term);
}
$sth->execute($term,$biblionumber);
($sth->rows) and return increment_weight($term,$biblionumber);
$query = "INSERT INTO tags_index (term,biblionumber) VALUES (?,?)";
- $debug and print STDERR "add_tag_index query: $query\nadd_tag_index args: ($term,$biblionumber)\n";
$sth = C4::Context->dbh->prepare($query);
$sth->execute($term,$biblionumber);
return $sth->rows;
}
-sub get_tag { # by tag_id
- (@_) or return;
- my $sth = C4::Context->dbh->prepare(TAG_SELECT . "WHERE tag_id = ?");
- $sth->execute(shift);
- return $sth->fetchrow_hashref;
-}
-
sub increment_weights {
increment_weight(@_);
increment_weight_total(shift);
my $query = "INSERT INTO tags_all
(borrowernumber,biblionumber,term,date_created)
VALUES (?,?,?,NOW())";
- $debug and print STDERR "add_tag query: $query\n",
- "add_tag query args: ($borrowernumber,$biblionumber,$term)\n";
if (scalar @$rows) {
- $debug and carp "Duplicate tag detected. Tag not added.";
return;
}
# add to tags_all regardless of approaval
# then
if (scalar @_) { # if arg remains, it is the borrowernumber of the approver: tag is pre-approved.
my $approver = shift;
- $debug and print STDERR "term '$term' pre-approved by borrower #$approver\n";
add_tag_approval($term,$approver,1);
add_tag_index($term,$biblionumber,$approver);
} elsif (is_approved($term) >= 1) {
- $debug and print STDERR "term '$term' approved by whitelist\n";
add_tag_approval($term,0,1);
add_tag_index($term,$biblionumber,1);
} else {
- $debug and print STDERR "term '$term' NOT approved (yet)\n";
add_tag_approval($term);
add_tag_index($term,$biblionumber);
}