Marcel de Rooy
a6c67ada11
Just comments, no test plan. Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> Signed-off-by: Owen Leonard <oleonard@myacpl.org> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
148 lines
4.4 KiB
Perl
148 lines
4.4 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 3 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, see <http://www.gnu.org/licenses>.
|
|
|
|
use Modern::Perl;
|
|
|
|
use C4::Context;
|
|
use Business::ISBN;
|
|
use C4::Koha qw( GetNormalizedISBN );
|
|
|
|
=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
|
|
} ); # FIXME We could better join socialdata here than call get_data for each record?
|
|
$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 ); # FIXME Why is data not included in $results ?
|
|
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;
|