X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FLog.pm;h=6b8ff17e45b26fad3a0cb26a22bcb6b292660d46;hb=49c35ba38eee7bf4880f9975c9b4a5bed5227cc4;hp=a308d225eacd72d25a8343d2b4c6b8a42f693e9e;hpb=04a108482dafd286a1c6bd8c4becc8cf56e1a46a;p=koha_gimpoz diff --git a/C4/Log.pm b/C4/Log.pm index a308d225ea..6b8ff17e45 100644 --- a/C4/Log.pm +++ b/C4/Log.pm @@ -1,9 +1,10 @@ -package C4::Log; #assumes C4/Log +package C4::Log; #package to deal with Logging Actions in DB # Copyright 2000-2002 Katipo Communications +# Copyright 2011 MJ Ray and software.coop # # This file is part of Koha. # @@ -16,20 +17,25 @@ package C4::Log; #assumes C4/Log # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, -# Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. use strict; -use C4::Context; -use C4::Date; +use warnings; -require Exporter; +use C4::Context; +use C4::Dates qw(format_date); use vars qw($VERSION @ISA @EXPORT); -# set the version for version checking -$VERSION = do { my @v = '$Revision$' =~ /\d+/g; shift(@v) . "." . join( "_", map { sprintf "%03d", $_ } @v ); }; +BEGIN { + # set the version for version checking + $VERSION = 3.01; + require Exporter; + @ISA = qw(Exporter); + @EXPORT = qw(&logaction &GetLogStatus &displaylog &GetLogs); +} =head1 NAME @@ -47,23 +53,27 @@ The functions in this module perform various functions in order to log all the o =over 2 -=cut - -@ISA = qw(Exporter); -@EXPORT = qw(&logaction &GetLogStatus &displaylog &GetLogs); - =item logaction - &logaction($usernumber, $modulename, $actionname, $infos); + &logaction($modulename, $actionname, $objectnumber, $infos); -Adds a record into action_logs table to report the different changes upon the database +Adds a record into action_logs table to report the different changes upon the database. +Each log entry includes the number of the user currently logged in. For batch +jobs, which operate without authenticating a user and setting up a session, the user +number is set to 0, which is the same as the superlibrarian's number. =cut #' sub logaction { - my ($usernumber,$modulename, $actionname, $objectnumber, $infos)=@_; - $usernumber='' unless $usernumber; + my ($modulename, $actionname, $objectnumber, $infos)=@_; + + # Get ID of logged in user. if called from a batch job, + # no user session exists and C4::Context->userenv() returns + # the scalar '0'. + my $userenv = C4::Context->userenv(); + my $usernumber = (ref($userenv) eq 'HASH') ? $userenv->{'number'} : 0; + my $dbh = C4::Context->dbh; my $sth=$dbh->prepare("Insert into action_logs (timestamp,user,module,action,object,info) values (now(),?,?,?,?,?)"); $sth->execute($usernumber,$modulename,$actionname,$objectnumber,$infos); @@ -90,11 +100,10 @@ sub GetLogStatus { $hash{BorrowersLog} = C4::Context->preference("BorrowersLog"); $hash{CataloguingLog} = C4::Context->preference("CataloguingLog"); $hash{IssueLog} = C4::Context->preference("IssueLog"); - $hash{ReturnLog} = C4::Context->preference("CataloguingLog"); - $hash{SubscriptionLog} = C4::Context->preference("CataloguingLog"); + $hash{ReturnLog} = C4::Context->preference("ReturnLog"); + $hash{SubscriptionLog} = C4::Context->preference("SubscriptionLog"); $hash{LetterLog} = C4::Context->preference("LetterLog"); - $hash{FinesLog} = C4::Context->preference("FinesLog"); - + $hash{FinesLog} = C4::Context->preference("FinesLog"); return \%hash; } @@ -114,94 +123,69 @@ returns a table of hash containing who did what on which object at what time sub displaylog { my ($modulename, @filters) = @_; my $dbh = C4::Context->dbh; - my $strsth; - if ($modulename eq "catalogue"){ - $strsth="select action_logs.timestamp, action_logs.action, action_logs.info, borrowers.cardnumber, borrowers.surname, borrowers.firstname, borrowers.userid,"; - $strsth .= "biblio.biblionumber, biblio.title, biblio.author" ;#if ($modulename eq "acqui.simple"); - $strsth .= " FROM action_logs LEFT JOIN borrowers ON borrowers.borrowernumber=action_logs.user"; - $strsth .= " LEFT JOIN biblio ON action_logs.object=biblio.biblionumber " ;#if ($modulename eq "acqui.simple"); - - $strsth .=" WHERE action_logs.module = 'cataloguing' ";# if ($modulename eq "acqui.simple"); - if (@filters) { - foreach my $filter (@filters) { - if ($filter->{name} =~ /user/) { - $filter->{value}=~s/\*/%/g; - $strsth .= " AND borrowers.surname like ".$filter->{value}; - } elsif ($filter->{name} =~ /title/) { - $filter->{value}=~s/\*/%/g; - $strsth .= " AND biblio.title like ".$filter->{value}; - } elsif ($filter->{name} =~ /author/) { - $filter->{value}=~s/\*/%/g; - $strsth .= " AND biblio.author like ".$filter->{value}; - } - } - } - } elsif ($modulename eq "acqui") { - $strsth=qq|select action_logs.timestamp, action_logs.action, action_logs.info, borrowers.cardnumber, borrowers.surname, borrowers.firstname, borrowers.userid, - biblio.biblionumber, biblio.title, biblio.author - FROM action_logs LEFT JOIN borrowers ON borrowers.borrowernumber=action_logs.user - LEFT JOIN biblio ON action_logs.object=biblio.biblionumber - WHERE action_logs.module = 'cataloguing' |;# if ($modulename eq "acqui.simple"); - if (@filters){ - foreach my $filter (@filters){ - if ($filter->{name} =~ /user/){ - $filter->{value}=~s/\*/%/g; - $strsth .= " AND borrowers.surname like ".$filter->{value}; - }elsif ($filter->{name} =~ /title/){ - $filter->{value}=~s/\*/%/g; - $strsth .= " AND biblio.title like ".$filter->{value}; - }elsif ($filter->{name} =~ /author/){ - $filter->{value}=~s/\*/%/g; - $strsth .= " AND biblio.author like ".$filter->{value}; - } - } - } - } elsif ($modulename eq "members"){ - $strsth=qq|SELECT action_logs.timestamp, action_logs.action, action_logs.info, - borrowers.cardnumber, borrowers.surname, borrowers.firstname, borrowers.userid, - bor2.cardnumber, bor2.surname, bor2.firstname, bor2.userid - FROM action_logs LEFT JOIN borrowers ON borrowers.borrowernumber=action_logs.user LEFT JOIN borrowers as bor2 ON action_logs.object=bor2.borrowernumber - WHERE action_logs.module = 'members' |;# if ($modulename eq "acqui.simple"); - if (@filters){ - foreach my $filter (@filters){ - if ($filter->{name} =~ /user/){ - $filter->{value}=~s/\*/%/g; - $strsth .= " AND borrowers.surname like ".$filter->{value}; - }elsif ($filter->{name} =~ /surname/){ - $filter->{value}=~s/\*/%/g; - $strsth .= " AND bor2.surname like ".$filter->{value}; - }elsif ($filter->{name} =~ /firstname/){ - $filter->{value}=~s/\*/%/g; - $strsth .= " AND bor2.firsntame like ".$filter->{value}; - }elsif ($filter->{name} =~ /cardnumber/){ - $filter->{value}=~s/\*/%/g; - $strsth .= " AND bor2.cardnumber like ".$filter->{value}; - } - } - } + my $strsth=qq| + SELECT action_logs.timestamp, action_logs.action, action_logs.info, + borrowers.cardnumber, borrowers.surname, borrowers.firstname, borrowers.userid, + biblio.biblionumber, biblio.title, biblio.author + FROM action_logs + LEFT JOIN borrowers ON borrowers.borrowernumber=action_logs.user + LEFT JOIN biblio ON action_logs.object=biblio.biblionumber + WHERE action_logs.module = 'cataloguing' + |; + my %filtermap = (); + if ($modulename eq "catalogue" or $modulename eq "acqui") { + %filtermap = ( + user => 'borrowers.surname', + title => 'biblio.title', + author => 'biblio.author', + ); + } elsif ($modulename eq "members") { + $strsth=qq| + SELECT action_logs.timestamp, action_logs.action, action_logs.info, + borrowers.cardnumber, borrowers.surname, borrowers.firstname, borrowers.userid, + bor2.cardnumber, bor2.surname, bor2.firstname, bor2.userid + FROM action_logs + LEFT JOIN borrowers ON borrowers.borrowernumber=action_logs.user + LEFT JOIN borrowers as bor2 ON action_logs.object=bor2.borrowernumber + WHERE action_logs.module = 'members' + |; + %filtermap = ( + user => 'borrowers.surname', + surname => 'bor2.surname', + firstname => 'bor2.firstname', + cardnumber => 'bor2.cardnumber', + ); + } else { + return 0; + } + + if (@filters) { + foreach my $filter (@filters) { + my $tempname = $filter->{name} or next; + (grep {/^$tempname$/} keys %filtermap) or next; + $filter->{value} =~ s/\*/%/g; + $strsth .= " AND " . $filtermap{$tempname} . " LIKE " . $filter->{value}; + } + } + my $sth=$dbh->prepare($strsth); + $sth->execute; + my @results; + my $count; + my $hilighted=1; + while (my $data = $sth->fetchrow_hashref){ + $data->{hilighted} = ($hilighted>0); + $data->{info} =~ s/\n//g; + $data->{day} = format_date($data->{timestamp}); + push @results, $data; + $count++; + $hilighted = -$hilighted; } - - if ($strsth){ - my $sth=$dbh->prepare($strsth); - $sth->execute; - my @results; - my $count; - my $hilighted=1; - while (my $data = $sth->fetchrow_hashref){ - $data->{hilighted} = ($hilighted>0); - $data->{info} =~ s/\n//g; - $data->{day} = format_date($data->{timestamp}); - push @results, $data; - $count++; - $hilighted = -$hilighted; - } - return ($count, \@results); - } else {return 0;} + return ($count, \@results); } -=head2 GetLogs +=item GetLogs -$logs = GetLogs($datefrom,$dateto,$user,$module,$action,$object,$info); +$logs = GetLogs($datefrom,$dateto,$user,\@modules,$action,$object,$info); Return: C<$logs> is a ref to a hash which containts all columns from action_logs @@ -212,27 +196,47 @@ sub GetLogs { my $datefrom = shift; my $dateto = shift; my $user = shift; - my $module = shift; + my $modules = shift; my $action = shift; my $object = shift; my $info = shift; - + + my $iso_datefrom = C4::Dates->new($datefrom,C4::Context->preference("dateformat"))->output('iso'); + my $iso_dateto = C4::Dates->new($dateto,C4::Context->preference("dateformat"))->output('iso'); + my $dbh = C4::Context->dbh; my $query = " SELECT * FROM action_logs WHERE 1 "; - $query .= " AND DATE_FORMAT(timestamp, '%Y-%m-%d') >= \"".$datefrom."\" " if $datefrom; - $query .= " AND DATE_FORMAT(timestamp, '%Y-%m-%d') <= \"".$dateto."\" " if $dateto; - $query .= " AND user LIKE \"%".$user."%\" " if $user; - $query .= " AND module LIKE \"%".$module."%\" " if $module; - $query .= " AND action LIKE \"%".$action."%\" " if $action; - $query .= " AND object LIKE \"%".$object."%\" " if $object; - $query .= " AND info LIKE \"%".$info."%\" " if $info; - + + my @parameters; + $query .= " AND DATE_FORMAT(timestamp, '%Y-%m-%d') >= \"".$iso_datefrom."\" " if $iso_datefrom; #fix me - mysql specific + $query .= " AND DATE_FORMAT(timestamp, '%Y-%m-%d') <= \"".$iso_dateto."\" " if $iso_dateto; + if($user ne "") { + $query .= " AND user = ? "; + push(@parameters,$user); + } + if($modules && scalar(@$modules)) { + $query .= " AND module IN (".join(",",map {"?"} @$modules).") "; + push(@parameters,@$modules); + } + if($action && scalar(@$action)) { + $query .= " AND action IN (".join(",",map {"?"} @$action).") "; + push(@parameters,@$action); + } + if($object) { + $query .= " AND object = ? "; + push(@parameters,$object); + } + if($info) { + $query .= " AND info LIKE ? "; + push(@parameters,"%".$info."%"); + } + my $sth = $dbh->prepare($query); - $sth->execute; + $sth->execute(@parameters); my @logs; while( my $row = $sth->fetchrow_hashref ) { @@ -242,8 +246,6 @@ sub GetLogs { return \@logs; } -END { } # module clean-up code here (global destructor) - 1; __END__ @@ -251,6 +253,6 @@ __END__ =head1 AUTHOR -Koha Developement team +Koha Development Team =cut