Koha/C4/SocialData.pm
2012-03-26 17:53:28 +02:00

148 lines
4.3 KiB
Perl

package C4::SocialData;
# 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 Modern::Perl;
use C4::Context;
use Business::ISBN;
use C4::Koha;
=head1 NAME
C4::SocialData - Koha functions for dealing with social datas
For now used by babeltheque, a french company providing, for books, comments, upload of videos, scoring (star)...
the social_data table could be used and improved by other provides.
=head1 SYNOPSIS
use C4::SocialData;
=head1 DESCRIPTION
The functions in this module deal with social datas
=head1 FUNCTIONS
=head2 get_data
Get social data from a biblio
params:
$isbn = isbn of the biblio (it must be the same in your database, isbn given to babelio)
returns:
this function returns an hashref with keys
isbn = isbn
num_critics = number of critics
num_critics_pro = number of profesionnal critics
num_quotations = number of quotations
num_videos = number of videos
score_avg = average score
num_scores = number of score
=cut
sub get_data {
my ( $isbn ) = @_;
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare( qq{SELECT * FROM social_data WHERE isbn = ? LIMIT 1} );
$sth->execute( $isbn );
my $results = $sth->fetchrow_hashref;
return $results;
}
=head2 update_data
Update Social data
params:
$url = url containing csv file with data
data separator : ; (semicolon)
data order : isbn ; active ; critics number , critics pro number ; quotations number ; videos number ; average score ; scores number
=cut
sub update_data {
my ( $output_filepath ) = @_;
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare( qq{INSERT INTO social_data (
`isbn`, `num_critics`, `num_critics_pro`, `num_quotations`, `num_videos`, `score_avg`, `num_scores`
) VALUES ( ?, ?, ?, ?, ?, ?, ? )
ON DUPLICATE KEY UPDATE `num_critics`=?, `num_critics_pro`=?, `num_quotations`=?, `num_videos`=?, `score_avg`=?, `num_scores`=?
} );
open my $file, '<', $output_filepath or die "File $output_filepath can not be read";
my $sep = qq{;};
my $i = 0;
my $unknown = 0;
while ( my $line = <$file> ) {
my ( $isbn, $active, $num_critics, $num_critics_pro, $num_quotations, $num_videos, $score_avg, $num_scores ) = split $sep, $line;
next if not $active;
eval {
$sth->execute( $isbn, $num_critics, $num_critics_pro, $num_quotations, $num_videos, $score_avg, $num_scores,
$num_critics, $num_critics_pro, $num_quotations, $num_videos, $score_avg, $num_scores
);
};
if ( $@ ) {
warn "Can't insert $isbn ($@)";
} else {
$i++;
}
}
say "$i data insered or updated";
}
=head2 get_report
Get social data report
=cut
sub get_report {
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare( qq{
SELECT biblionumber, isbn FROM biblioitems
} );
$sth->execute;
my %results;
while ( my ( $biblionumber, $isbn ) = $sth->fetchrow() ) {
push @{ $results{no_isbn} }, { biblionumber => $biblionumber } and next if not $isbn;
my $original_isbn = $isbn;
$isbn =~ s/^\s*(\S*)\s*$/$1/;
$isbn = GetNormalizedISBN( $isbn, undef, undef );
$isbn = Business::ISBN->new( $isbn );
next if not $isbn;
eval{
$isbn = $isbn->as_isbn13->as_string;
};
next if $@;
$isbn =~ s/-//g;
my $social_datas = C4::SocialData::get_data( $isbn );
if ( $social_datas ) {
push @{ $results{with} }, { biblionumber => $biblionumber, isbn => $isbn, original => $original_isbn };
} else {
push @{ $results{without} }, { biblionumber => $biblionumber, isbn => $isbn, original => $original_isbn };
}
}
return \%results;
}
1;