Koha/opac/opac-readingrecord.pl
Jonathan Druart c6e488f4af Bug 17196: Move marcxml out of the biblioitems table
Two discussions on koha-devel lead to the same conclusion:
biblioitems.marcxml should be moved out this table
- biblio and biblioitems
http://lists.koha-community.org/pipermail/koha-devel/2013-April/039239.html
- biblioitems.marcxml & biblioitems.marc / HUGE performance issue !
http://lists.koha-community.org/pipermail/koha-devel/2016-July/042821.html

There are several goals to do it:
- Performance
As Paul Poulain wrote, a simple query like
  SELECT publicationyear, count(publicationyear) FROM biblioitems GROUP BY publicationyear;
takes more than 10min on a DB with more than 1M bibliographic records
but only 3sec (!) on the same DB without the biblioitems.marcxml field
Note that priori to this patch set, the biblioitems.marcxml was not
retrieved systematically, but was, at least, in
C4::Acquisition::GetOrdersByBiblionumber and C4::Acquisition::GetOrders
- Flexibility
Storing the marcxml in a specific table would allow use to store several
kind of metadata (USMARC, MARCXML, MIJ, etc.) and different formats (marcflavour)
- Clean code
It would be a first step toward Koha::MetadataRecord for bibliographic
records (not done in this patch set).

Test plan:
- Update the DBIC Schema
- Add / Edit / Delete / Import / Export bibliographic records
- Add items
- Reindex records using ES
- Confirm that the following scripts still work:
    * misc/cronjobs/delete_records_via_leader.pl
    * misc/migration_tools/build_oai_sets.pl
- Look at the reading history at the OPAC (opac-readingrecord.pl)
- At the OPAC, click on a tag, you must see the result

Note: Changes in Koha/OAI/Server/ListRecords.pm is planned on bug 15108.

Signed-off-by: Mason James <mtj@kohaaloha.com>

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Zeno Tajoli <z.tajoli@cineca.it>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
2017-01-13 13:49:26 +00:00

155 lines
4.7 KiB
Perl
Executable file

#!/usr/bin/perl
# 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 strict;
use warnings;
use CGI qw ( -utf8 );
use C4::Auth;
use C4::Koha;
use C4::Biblio;
use C4::Circulation;
use C4::Members;
use Koha::DateUtils;
use MARC::Record;
use C4::Output;
use C4::Charset qw(StripNonXmlChars);
my $query = new CGI;
# if opacreadinghistory is disabled, leave immediately
if ( ! C4::Context->preference('opacreadinghistory') ) {
print $query->redirect("/cgi-bin/koha/errors/404.pl");
exit;
}
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
{
template_name => "opac-readingrecord.tt",
query => $query,
type => "opac",
authnotrequired => 0,
debug => 1,
}
);
# get borrower information ....
my ( $borr ) = GetMember( borrowernumber => $borrowernumber );
$template->param(%{$borr});
my $itemtypes = GetItemTypes();
# get the record
my $order = $query->param('order') || '';
if ( $order eq 'title' ) {
$template->param( orderbytitle => 1 );
}
elsif ( $order eq 'author' ) {
$template->param( orderbyauthor => 1 );
}
else {
$order = "date_due desc";
$template->param( orderbydate => 1 );
}
my $limit = $query->param('limit');
$limit //= '';
$limit = ( $limit eq 'full' ) ? 0 : 50;
my $issues = GetAllIssues( $borrowernumber, $order, $limit );
my $itype_attribute =
( C4::Context->preference('item-level_itypes') ) ? 'itype' : 'itemtype';
my $opac_summary_html = C4::Context->preference('OPACMySummaryHTML');
foreach my $issue ( @{$issues} ) {
$issue->{normalized_isbn} = GetNormalizedISBN( $issue->{isbn} );
if ( $issue->{$itype_attribute} ) {
$issue->{translated_description} =
$itemtypes->{ $issue->{$itype_attribute} }->{translated_description};
$issue->{imageurl} =
getitemtypeimagelocation( 'opac',
$itemtypes->{ $issue->{$itype_attribute} }->{imageurl} );
}
my $marcxml = C4::Biblio::GetXmlBiblio( $issue->{biblionumber} );
if ( $marcxml ) {
$marcxml = StripNonXmlChars( $marcxml );
my $marc_rec =
MARC::Record::new_from_xml( $marcxml, 'utf8',
C4::Context->preference('marcflavour') );
$issue->{subtitle} =
GetRecordValue( 'subtitle', $marc_rec, $issue->{frameworkcode} );
$issue->{normalized_upc} = GetNormalizedUPC( $marc_rec, C4::Context->preference('marcflavour') );
}
# My Summary HTML
if ($opac_summary_html) {
my $my_summary_html = $opac_summary_html;
$issue->{author}
? $my_summary_html =~ s/{AUTHOR}/$issue->{author}/g
: $my_summary_html =~ s/{AUTHOR}//g;
my $title = $issue->{title};
$title =~ s/\/+$//; # remove trailing slash
$title =~ s/\s+$//; # remove trailing space
$title
? $my_summary_html =~ s/{TITLE}/$title/g
: $my_summary_html =~ s/{TITLE}//g;
$issue->{normalized_isbn}
? $my_summary_html =~ s/{ISBN}/$issue->{normalized_isbn}/g
: $my_summary_html =~ s/{ISBN}//g;
$issue->{biblionumber}
? $my_summary_html =~ s/{BIBLIONUMBER}/$issue->{biblionumber}/g
: $my_summary_html =~ s/{BIBLIONUMBER}//g;
$issue->{MySummaryHTML} = $my_summary_html;
}
}
if (C4::Context->preference('BakerTaylorEnabled')) {
$template->param(
JacketImages=>1,
BakerTaylorEnabled => 1,
BakerTaylorImageURL => &image_url(),
BakerTaylorLinkURL => &link_url(),
BakerTaylorBookstoreURL => C4::Context->preference('BakerTaylorBookstoreURL'),
);
}
BEGIN {
if (C4::Context->preference('BakerTaylorEnabled')) {
require C4::External::BakerTaylor;
import C4::External::BakerTaylor qw(&image_url &link_url);
}
}
for(qw(AmazonCoverImages GoogleJackets)) { # BakerTaylorEnabled handled above
C4::Context->preference($_) or next;
$template->param($_=>1);
$template->param(JacketImages=>1);
}
$template->param(
READING_RECORD => $issues,
limit => $limit,
readingrecview => 1,
OPACMySummaryHTML => $opac_summary_html ? 1 : 0,
);
output_html_with_http_headers $query, $cookie, $template->output, undef, { force_no_caching => 1 };