Adding page to display log views.

can be called by admin/viewlog.pl
Works with C4/Log.pm
uses action_logs table
This commit is contained in:
hdl 2005-07-20 16:09:03 +00:00
parent 6bbbfe0b18
commit 552d398bf7
3 changed files with 452 additions and 17 deletions

View file

@ -49,7 +49,7 @@ The functions in this module perform various functions in order to log all the o
=cut
@ISA = qw(Exporter);
@EXPORT = qw(&logaction &logstatus);
@EXPORT = qw(&logaction &logstatus &displaylog);
=item logaction
@ -95,14 +95,14 @@ sub displaylog{
my ($modulename, @filters)=@_;
my $dbh = C4::Context->dbh;
my $strsth;
if ($modulename eq "acqui.simple"){
$strsth="select action_logs.timestamp, action_logs.action, borrowers.cardnumber, borrowers.surname, borrowers.firstname, borrowers.userid,";
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 borrowers,action_logs ";
$strsth .= ",biblio" ;#if ($modulename eq "acqui.simple");
$strsth .= " FROM borrowers,action_logs ";
$strsth .= ",biblio " ;#if ($modulename eq "acqui.simple");
$strsth .="WHERE borrowers.borrowernumber=action_logs.user";
$strsth .= "AND action_logs.module = 'acqui.simple' AND action_logs.object=biblio.biblionumber ";# if ($modulename eq "acqui.simple");
$strsth .=" WHERE borrowers.borrowernumber=action_logs.user";
$strsth .=" AND action_logs.module = 'acqui.simple' AND action_logs.object=biblio.biblionumber ";# if ($modulename eq "acqui.simple");
if (@filters){
foreach my $filter (@filters){
if ($filter->{name} =~ /user/){
@ -118,19 +118,67 @@ sub displaylog{
}
}
} elsif ($modulename eq "acqui") {
} elsif ($modulename eq "circ") {
$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 borrowers,action_logs ";
$strsth .= ",biblio " ;#if ($modulename eq "acqui.simple");
$strsth .=" WHERE borrowers.borrowernumber=action_logs.user";
$strsth .= "AND action_logs.module = 'acqui.simple' AND action_logs.object=biblio.biblionumber ";# 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="select action_logs.timestamp, action_logs.action, action_logs.info, borrowers.cardnumber, borrowers.surname, borrowers.firstname, borrowers.userid,";
$strsth .= "bor2.cardnumber, bor2.surname, bor2.firstname, bor2.userid,";
$strsth .= "FROM borrowers,action_logs,borrowers as bor2 ";
$strsth .=" WHERE borrowers.borrowernumber=action_logs.user";
$strsth .= "AND action_logs.module = 'members' AND action_logs.object=bor2.borrowernumber ";# 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};
}
}
}
}
warn "displaylog :".$strsth;
my $sth=$dbh->prepare($strsth);
$sth->execute;
my @results;
my $count;
while (my $data = $sth->fetchrow_hashref){
push @results, $data;
$count++;
}
return ($count, \@results);
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);
push @results, $data;
$count++;
$hilighted = -$hilighted;
}
return ($count, \@results);
} else {return 0;}
}
END { } # module clean-up code here (global destructor)

149
admin/viewlog.pl Executable file
View file

@ -0,0 +1,149 @@
#!/usr/bin/perl
# $Id$
# Copyright 2000-2002 Katipo Communications
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# 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
use strict;
use C4::Auth;
use CGI;
use C4::Context;
use HTML::Template;
use C4::Koha;
use C4::Interface::CGI::Output;
use C4::Log;
use Date::Manip;
=head1 NAME
plugin that shows a stats on borrowers
=head1 DESCRIPTION
=over2
=cut
my $input = new CGI;
my $do_it=$input->param('do_it');
my $fullreportname = "parameters/viewlog.tmpl";
my $modulename = $input->param("module");
my $userfilter = $input->param("user");
my $actionfilter = $input->param("action");
my $fromfilter = $input->param("from");
my $tofilter = $input->param("to");
my $basename = $input->param("basename");
my $mime = $input->param("MIME");
my $del = $input->param("sep");
my $output = $input->param("output");
#warn "module : ".$modulename;
my ($template, $borrowernumber, $cookie)
= get_template_and_user({template_name => $fullreportname,
query => $input,
type => "intranet",
authnotrequired => 0,
flagsrequired => {editcatalogue => 1},
debug => 1,
});
$template->param(do_it => $do_it);
if ($do_it) {
# Displaying results
#building filters
my @filters;
push @filters, {name=> 'user', value=> $userfilter} if ($userfilter);
push @filters, {name=> 'action', value=> $actionfilter} if ($actionfilter);
push @filters, {name=> 'from', value=> $fromfilter} if ($fromfilter);
push @filters, {name=> 'to', value=> $tofilter} if ($tofilter);
if ($modulename eq "catalogue"){
my $titlefilter = $input->param("title");
my $authorfilter = $input->param("author");
my $publisherfilter = $input->param("publisher");
my $callnumberfilter = $input->param("itemcallnumber");
push @filters, {name=> 'title', value=> $titlefilter} if ($titlefilter);
push @filters, {name=> 'author', value=> $authorfilter} if ($authorfilter);
push @filters, {name=> 'publisher', value=> $publisherfilter} if ($publisherfilter);
push @filters, {name=> 'callnumber', value=> $callnumberfilter} if ($callnumberfilter);
}
my ($count, $results) = displaylog( $modulename, @filters);
if ($output eq "screen"){
# Printing results to screen
$template->param(modulename =>$modulename, $modulename => 1, looprow => $results);
output_html_with_http_headers $input, $cookie, $template->output;
exit(1);
} else {
# Printing to a csv file
print $input->header(-type => 'application/vnd.sun.xml.calc',
-attachment=>"$basename.csv",
-filename=>"$basename.csv" );
my $sep;
$sep =C4::Context->preference("delimiter");
# header top-right
# Other header
# Table
foreach my $line ( @$results ) {
if ($modulename eq "catalogue"){
print $line->{timestamp}.$sep;
print $line->{firstname}.$sep;
print $line->{surname}.$sep;
print $line->{action}.$sep;
print $line->{info}.$sep;
print $line->{title}.$sep;
print $line->{author}.$sep;
}
print "\n";
}
# footer
exit(1);
}
} else {
my $dbh = C4::Context->dbh;
my @values;
my %labels;
my %select;
my $req;
my @mime = ( C4::Context->preference("MIME") );
# foreach my $mime (@mime){
# warn "".$mime;
# }
my $CGIextChoice=CGI::scrolling_list(
-name => 'MIME',
-id => 'MIME',
-values => \@mime,
-size => 1,
-multiple => 0 );
my @dels = ( C4::Context->preference("delimiter") );
my $CGIsepChoice=CGI::scrolling_list(
-name => 'sep',
-id => 'sep',
-values => \@dels,
-size => 1,
-multiple => 0 );
$template->param(
CGIextChoice => $CGIextChoice,
CGIsepChoice => $CGIsepChoice
);
output_html_with_http_headers $input, $cookie, $template->output;
}

View file

@ -0,0 +1,238 @@
<!-- TMPL_INCLUDE NAME="reportswcal-top.inc" -->
<div id="mainbloc" >
<!-- TMPL_IF NAME="do_it" -->
<script language="JavaScript" type="text/javascript">
function Dopop(link) {
newin=window.open(link,'width=500,height=400,toolbar=false,scrollbars=yes');
}
</script>
<h1 class="parameters">Koha : LogView for <!-- TMPL_VAR NAME="modulename"--> </h1>
<!-- TMPL_IF NAME="loopfilter"-->
<p>Filtered on</p>
<!-- TMPL_LOOP NAME="loopfilter" -->
<p><!-- TMPL_IF NAME="err" --> <font color="red"> <b><!--/TMPL_IF --><label class="label100"> <!-- TMPL_VAR NAME="name"--> =</label><!-- TMPL_VAR NAME="value"--><!-- TMPL_IF NAME="err" --> </font> </b><!--/TMPL_IF --></p>
<!-- /TMPL_LOOP -->
<!-- /TMPL_IF NAME="loopfilter"-->
<br>
<table border="1">
<!-- TMPL_IF NAME="catalogue" -->
<tr >
<th class="parameters">Timestamp
</th>
<th class="parameters">Firstname
</th>
<th class="parameters">Surname
</th>
<th class="parameters">Action
</th>
<th class="parameters">Info
</th>
<th class="parameters">Title
</th>
<th class="parameters">Author
</th>
</tr>
<!-- TMPL_LOOP NAME="looprow" -->
<!-- TMPL_IF NAME="hilighted" --><tr class="higlighted"><!-- TMPL_ELSE --><tr><!-- /TMPL_IF -->
<td><!-- TMPL_IF NAME="timestamp" --><!-- TMPL_VAR NAME="timestamp" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="firstname" --><!-- TMPL_VAR NAME="firstname" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="surname" --><!-- TMPL_VAR NAME="surname" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="action" --><!-- TMPL_VAR NAME="action" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="info" --><!-- TMPL_VAR NAME="info" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="title" --><!-- TMPL_VAR NAME="title" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="author" --><!-- TMPL_VAR NAME="author" --><!-- /TMPL_IF -->
</td>
</tr>
<!-- /TMPL_LOOP -->
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="acqui" -->
<tr >
<th class="parameters">Timestamp
</th>
<th class="parameters">Firstname
</th>
<th class="parameters">Surname
</th>
<th class="parameters">Action
</th>
<th class="parameters">Info
</th>
<th class="parameters">Title
</th>
<th class="parameters">Author
</th>
</tr>
<!-- TMPL_LOOP NAME="looprow" -->
<!-- TMPL_IF NAME="hilighted" --><tr class="higlighted"><!-- TMPL_ELSE --><tr><!-- /TMPL_IF -->
<!-- TMPL_IF NAME="hilighted" --><td class="hilighted"><!-- TMPL_ELSE --><td><!-- /TMPL_IF -->
<!-- TMPL_VAR NAME="rowtitle" --></td>
<!-- TMPL_LOOP NAME="loopcell" -->
<!-- TMPL_IF NAME="hilighted" --><td class="hilighted"><!-- TMPL_ELSE --><td ><!-- /TMPL_IF -->
<!-- TMPL_IF NAME="reference" --><a href="javascript:Dopop('../members/moremember.pl?bornum=<!-- TMPL_VAR NAME="reference" -->')" ><!-- /TMPL_IF -->
<!-- TMPL_IF NAME="value" --><!-- TMPL_VAR NAME="value" --><!-- /TMPL_IF -->
<!-- TMPL_IF NAME="reference" --></a><!-- /TMPL_IF -->
</td>
<!-- TMPL_IF NAME="hilighted" --><td class="hilighted"><!-- TMPL_ELSE --><td ><!-- /TMPL_IF -->
<!-- TMPL_IF NAME="count" --><!-- TMPL_VAR NAME="count" --><!-- /TMPL_IF -->
</td>
<!-- /TMPL_LOOP -->
</tr>
<!-- /TMPL_LOOP NAME="looprow" -->
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="members" -->
<tr >
<th class="parameters">Timestamp
</th>
<th class="parameters">Firstname
</th>
<th class="parameters">Surname
</th>
<th class="parameters">Action
</th>
<th class="parameters">Info
</th>
<th class="parameters">Title
</th>
<th class="parameters">Author
</th>
</tr>
<!-- TMPL_LOOP NAME="looprow" -->
<!-- TMPL_IF NAME="hilighted" --><tr class="higlighted"><!-- TMPL_ELSE --><tr><!-- /TMPL_IF -->
<td><!-- TMPL_IF NAME="timestamp" --><!-- TMPL_VAR NAME="timestamp" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="value" --><!-- TMPL_VAR NAME="value" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="value" --><!-- TMPL_VAR NAME="value" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="value" --><!-- TMPL_VAR NAME="value" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="value" --><!-- TMPL_VAR NAME="value" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="value" --><!-- TMPL_VAR NAME="value" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="value" --><!-- TMPL_VAR NAME="value" --><!-- /TMPL_IF -->
</td>
<td><!-- TMPL_IF NAME="value" --><!-- TMPL_VAR NAME="value" --><!-- /TMPL_IF -->
</td>
</tr>
<!-- /TMPL_LOOP NAME="looprow" -->
<!-- /TMPL_IF -->
</table>
<!-- TMPL_ELSE -->
<h1 class = "parameters">Koha : Display Logs </h1>
<form method="post">
<table>
<thead>
<tr>
<th class="parameters">On Module</th>
<th class="parameters">User/Action Filters</th>
<th class="parameters">Object Filter</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<select name="module">
<option value ="catalogue" checked>Catalogue</option>
<option value ="members">Borrowers</option>
<option value ="acqui">Acquisitions</option>
</select>
</td>
<td>
<p>
Koha User : <input type="text" name="user" value="">
</p>
<p> Action type : <select name="action">
<option value ="">All</option>
<option value ="add">Add</option>
<option value ="del">Delete</option>
<option value ="mod">Modify</option>
</select>
</p>
<p> From <input type="text" readonly="readonly" size="10" id="from" name="from" >
<img src="<!-- TMPL_VAR Name="themelang" -->/includes/calendar/cal.gif" border="0" hspace="0" vspace="0" id="openCalendarFrom" style="cursor: pointer;" valign="top">
<script language="JavaScript" type="text/javascript">
function validate1(date) {
var day = date.getDate();
var month = date.getMonth() + 1;
var year = date.getFullYear();
var weekDay = date.getDay();
var dayMonth = month + '-' + day;
var dateString = year + '-' + month + '-' + day;
var dateTo = document.getElementById('to').value.split("-");
var limitDate = new Date(dateTo[0], (dateTo[1] - 1), dateTo[2]);
if (date > limitDate) {
return true;
} else {
return false;
}
}
Calendar.setup(
{
inputField : "from",
ifFormat : "%Y-%m-%d",
button : "openCalendarFrom",
disableFunc : validate1,
dateStatusFunc : validate1
}
);
</script>
To <input readonly="readonly" size="10" id="to" name="Filter" value="" type="to">
<img src="<!-- TMPL_VAR Name="themelang" -->/includes/calendar/cal.gif" id="openCalendarTo" style="cursor: pointer;" valign="top" border="0" hspace="0" vspace="0">
<script type="text/javascript">
function validate2(date) {
var day = date.getDate();
var month = date.getMonth() + 1;
var year = date.getFullYear();
var weekDay = date.getDay();
var dayMonth = month + '-' + day;
var dateString = year + '-' + month + '-' + day;
var dateFrom = document.getElementById('from').value.split("-");
var limitDate = new Date(dateFrom[0], (dateFrom[1] - 1), dateFrom[2]);
if (limitDate > date) {
return true;
} else {
return false;
}
}
Calendar.setup(
{
inputField : "to",
ifFormat : "%Y-%m-%d",
button : "openCalendarTo",
disableFunc : validate2,
dateStatusFunc : validate2
}
);
</script>
</td>
</tr>
</table>
<div id="bloc25">
<h3 class="parameters"> Output </h3>
<input type="radio" checked name="output" value="screen" > To screen into the browser
<br>
<input type="radio" name="output" value="file"> To file <input type="text" name="basename" value="Export"> into an application
<!-- TMPL_VAR NAME="CGIextChoice" -->
<!-- TMPL_VAR NAME="CGIsepChoice" -->
</p>
</div>
<p>
<input TYPE="submit" value="OK" class="button parameters">
<input type="hidden" name="report_name" value="<!--TMPL_VAR NAME="report_name" -->">
<input type="hidden" name="do_it" value="1">
</form>
<!-- /TMPL_IF -->
</div>
<!-- TMPL_INCLUDE NAME="parameters-bottom.inc" -->