Bug 30921: Replace C4::XSLT::transformMARCXML4XSLT with RecordProcessor

This patch removes the last remaining uses of transformMARCXML4XSLT and
replaced them with the equivilent RecordProcessor usage.

Signed-off-by: David Nind <david@davidnind.com>

Signed-off-by: Joonas Kylmälä <joonas.kylmala@iki.fi>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Martin Renvoize 2022-06-07 15:24:23 +01:00 committed by Tomas Cohen Arazi
parent c757abd675
commit daf2e4b3c2
Signed by: tomascohen
GPG key ID: 0A272EA1B2F3C15F
3 changed files with 32 additions and 92 deletions

View file

@ -28,22 +28,18 @@ use C4::Koha qw( xml_escape );
use C4::Biblio qw( GetAuthorisedValueDesc GetFrameworkCode GetMarcStructure );
use Koha::AuthorisedValues;
use Koha::ItemTypes;
use Koha::RecordProcessor;
use Koha::XSLT::Base;
use Koha::Libraries;
use Koha::Recalls;
my $engine; #XSLT Handler object
my %authval_per_framework;
# Cache for tagfield-tagsubfield to decode per framework.
# Should be preferably be placed in Koha-core...
our (@ISA, @EXPORT_OK);
BEGIN {
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(
transformMARCXML4XSLT
getAuthorisedValues4MARCSubfields
buildKohaItemsNamespace
XSLTParse4Display
);
@ -56,75 +52,6 @@ C4::XSLT - Functions for displaying XSLT-generated content
=head1 FUNCTIONS
=head2 transformMARCXML4XSLT
Replaces codes with authorized values in a MARC::Record object
=cut
sub transformMARCXML4XSLT {
my ($biblionumber, $record, $opac) = @_;
my $frameworkcode = GetFrameworkCode($biblionumber) || '';
my $tagslib = &GetMarcStructure(1, $frameworkcode, { unsafe => 1 });
my @fields;
# FIXME: wish there was a better way to handle exceptions
eval {
@fields = $record->fields();
};
if ($@) { warn "PROBLEM WITH RECORD"; next; }
my $marcflavour = C4::Context->preference('marcflavour');
my $av = getAuthorisedValues4MARCSubfields($frameworkcode);
foreach my $tag ( keys %$av ) {
foreach my $field ( $record->field( $tag ) ) {
if ( $av->{ $tag } ) {
my @new_subfields = ();
for my $subfield ( $field->subfields() ) {
my ( $letter, $value ) = @$subfield;
# Replace the field value with the authorised value *except* for MARC21 field 942$n (suppression in opac)
if ( !( $tag eq '942' && $subfield->[0] eq 'n' ) || $marcflavour eq 'UNIMARC' ) {
$value = GetAuthorisedValueDesc( $tag, $letter, $value, '', $tagslib, undef, $opac )
if $av->{ $tag }->{ $letter };
}
push( @new_subfields, $letter, $value );
}
$field ->replace_with( MARC::Field->new(
$tag,
$field->indicator(1),
$field->indicator(2),
@new_subfields
) );
}
}
}
return $record;
}
=head2 getAuthorisedValues4MARCSubfields
Returns a ref of hash of ref of hash for tag -> letter controlled by authorised values
Is only used in this module currently.
=cut
sub getAuthorisedValues4MARCSubfields {
my ($frameworkcode) = @_;
unless ( $authval_per_framework{ $frameworkcode } ) {
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare("SELECT DISTINCT tagfield, tagsubfield
FROM marc_subfield_structure
WHERE authorised_value IS NOT NULL
AND authorised_value!=''
AND frameworkcode=?");
$sth->execute( $frameworkcode );
my $av = { };
while ( my ( $tag, $letter ) = $sth->fetchrow() ) {
$av->{ $tag }->{ $letter } = 1;
}
$authval_per_framework{ $frameworkcode } = $av;
}
return $authval_per_framework{ $frameworkcode };
}
=head2 XSLTParse4Display
Returns xml for biblionumber and requested XSLT transformation.
@ -245,8 +172,9 @@ sub XSLTParse4Display {
my ( $params ) = @_;
my $biblionumber = $params->{biblionumber};
my $orig_record = $params->{record};
my $record = $params->{record};
my $xslsyspref = $params->{xsl_syspref};
my $interface = ( $xslsyspref =~ /OPAC/ ) ? 'opac' : 'intranet' ;
my $fixamps = $params->{fix_amps};
my $hidden_items = $params->{hidden_items} || [];
my $variables = $params->{xslt_variables};
@ -257,8 +185,19 @@ sub XSLTParse4Display {
my $xslfilename = get_xsl_filename( $xslsyspref);
my $frameworkcode = GetFrameworkCode($biblionumber) || '';
my $record_processor = Koha::RecordProcessor->new(
{
filters => [ 'ExpandCodedFields' ],
options => {
interface => $interface,
frameworkcode => $frameworkcode
}
}
);
$record_processor->process($record);
# grab the XML, run it through our stylesheet, push it out to the browser
my $record = transformMARCXML4XSLT($biblionumber, $orig_record);
my $itemsxml;
if ( $xslsyspref eq "OPACXSLTDetailsDisplay" || $xslsyspref eq "XSLTDetailsDisplay" || $xslsyspref eq "XSLTResultsDisplay" ) {
$itemsxml = ""; #We don't use XSLT for items display on these pages

View file

@ -25,6 +25,7 @@ use HTTP::OAI::Repository qw( validate_request );
use base ("HTTP::OAI::Repository");
use Koha::RecordProcessor;
use Koha::OAI::Server::Identify;
use Koha::OAI::Server::ListSets;
use Koha::OAI::Server::ListMetadataFormats;
@ -35,7 +36,7 @@ use XML::SAX::Writer;
use YAML::XS;
use CGI qw/:standard -oldstyle_urls/;
use C4::Context;
use C4::XSLT qw( transformMARCXML4XSLT );
use C4::Biblio qw( GetFrameworkCode );
use Koha::XSLT::Base;
use Koha::Biblios;
@ -178,8 +179,19 @@ sub get_biblio_marcxml {
my $biblio = Koha::Biblios->find($biblionumber);
my $record = $biblio->metadata->record({ embed_items => $with_items, opac => 1 });
$record = transformMARCXML4XSLT( $biblionumber, $record )
if $expanded_avs;
if ( $expanded_avs ) {
my $frameworkcode = GetFrameworkCode($biblionumber) || '';
my $record_processor = Koha::RecordProcessor->new(
{
filters => [ 'ExpandCodedFields' ],
options => {
interface => 'opac',
frameworkcode => $frameworkcode
}
}
);
$record_processor->process($record) if $expanded_avs;
}
return $record ? $record->as_xml_record() : undef;
}

View file

@ -18,7 +18,7 @@
use Modern::Perl;
use MARC::Record;
use Test::More tests => 4;
use Test::More tests => 3;
use Test::Warn;
use t::lib::TestBuilder;
use t::lib::Mocks;
@ -28,7 +28,7 @@ use Koha::Libraries;
use Koha::ItemTypes;
BEGIN {
use_ok('C4::XSLT', qw( transformMARCXML4XSLT getAuthorisedValues4MARCSubfields buildKohaItemsNamespace ));
use_ok('C4::XSLT', qw( buildKohaItemsNamespace ));
}
my $schema = Koha::Database->new->schema;
@ -36,17 +36,6 @@ my $builder = t::lib::TestBuilder->new;
$schema->storage->txn_begin;
subtest 'transformMARCXML4XSLT tests' => sub {
plan tests => 1;
my $mock_xslt = Test::MockModule->new("C4::XSLT");
$mock_xslt->mock( getAuthorisedValues4MARCSubfields => sub { return { 942 => { 'n' => 1 } } } );
$mock_xslt->mock( GetAuthorisedValueDesc => sub { warn "called"; });
my $record = MARC::Record->new();
my $suppress_field = MARC::Field->new( 942, ' ', ' ', n => '1' );
$record->append_fields($suppress_field);
warning_is { C4::XSLT::transformMARCXML4XSLT( 3,$record ) } undef, "942n auth value not translated";
};
subtest 'buildKohaItemsNamespace status tests' => sub {
plan tests => 17;