-
Notifications
You must be signed in to change notification settings - Fork 257
/
SocialData.pm
148 lines (117 loc) · 4.43 KB
/
SocialData.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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;