Browse Source

Bug 27266: Move GetMarcAuthors to Koha namespace

This patch moves C4::Biblio::GetMarcAuthors to
Koha::Biblio->get_authors_from_MARC. This is so the method can be
used in templates and notices.

To test:
1. Find a record that has an author in the added entry field (700-720).
2. Add the record to the cart and a list.
3. View your cart and click 'more details'. Confirm authors show as
normal.
4. Click 'send' and confirm the email sent shows the authors as normal.
5. Go to the list you added the record to and click 'send list'. Confirm
the email sent shows the authors as normal.
xslt)
6. Log in to the OPAC. Find the record and add it to the cart and a list
7. View the cart and click 'more details'. Confirm authors show as
normal.
8. Click 'send' and confirm the email sent shows the authors as normal.
9. Go to the list you added the record to and click 'send list'.
Confirm the email sent shows the authors as normal.
10. Confirm tests pass:
- t/Biblio.t
- t/db_dependent/Koha/Biblio.t

Sponsored-by: Bibliotheksservice-Zentrum Baden-Württemberg (BSZ)
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

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

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
22.05.x
Aleisha Amohia 4 years ago
committed by Fridolin Somers
parent
commit
d5621ce951
  1. 100
      C4/Biblio.pm
  2. 97
      Koha/Biblio.pm
  3. 2
      basket/basket.pl
  4. 3
      basket/sendbasket.pl
  5. 2
      opac/opac-basket.pl
  6. 2
      opac/opac-detail.pl
  7. 3
      opac/opac-sendbasket.pl
  8. 3
      opac/opac-sendshelf.pl
  9. 8
      t/Biblio.t
  10. 30
      t/db_dependent/Koha/Biblio.t
  11. 3
      virtualshelves/sendshelf.pl

100
C4/Biblio.pm

@ -35,7 +35,6 @@ BEGIN {
GetMarcISBN
GetMarcISSN
GetMarcSubjects
GetMarcAuthors
GetMarcSeries
GetMarcUrls
GetUsedMarcStructure
@ -1658,105 +1657,6 @@ sub GetMarcSubjects {
return \@marcsubjects;
} #end getMARCsubjects
=head2 GetMarcAuthors
authors = GetMarcAuthors($record,$marcflavour);
Get all authors from the MARC record and returns them in an array.
The authors are stored in different fields depending on MARC flavour
=cut
sub GetMarcAuthors {
my ( $record, $marcflavour ) = @_;
if (!$record) {
carp 'GetMarcAuthors called on undefined record';
return;
}
my ( $mintag, $maxtag, $fields_filter );
# tagslib useful only for UNIMARC author responsibilities
my $tagslib;
if ( $marcflavour eq "UNIMARC" ) {
# FIXME : we don't have the framework available, we take the default framework. May be buggy on some setups, will be usually correct.
$tagslib = GetMarcStructure( 1, '', { unsafe => 1 });
$mintag = "700";
$maxtag = "712";
$fields_filter = '7..';
} else { # marc21
$mintag = "700";
$maxtag = "720";
$fields_filter = '7..';
}
my @marcauthors;
my $AuthoritySeparator = C4::Context->preference('AuthoritySeparator');
foreach my $field ( $record->field($fields_filter) ) {
next unless $field->tag() >= $mintag && $field->tag() <= $maxtag;
my @subfields_loop;
my @link_loop;
my @subfields = $field->subfields();
my $count_auth = 0;
# if there is an authority link, build the link with Koha-Auth-Number: subfield9
my $subfield9 = $field->subfield('9');
if ($subfield9) {
my $linkvalue = $subfield9;
$linkvalue =~ s/(\(|\))//g;
@link_loop = ( { 'limit' => 'an', 'link' => $linkvalue } );
}
# other subfields
my $unimarc3;
for my $authors_subfield (@subfields) {
next if ( $authors_subfield->[0] eq '9' );
# unimarc3 contains the $3 of the author for UNIMARC.
# For french academic libraries, it's the "ppn", and it's required for idref webservice
$unimarc3 = $authors_subfield->[1] if $marcflavour eq 'UNIMARC' and $authors_subfield->[0] =~ /3/;
# don't load unimarc subfields 3, 5
next if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /3|5/ ) );
my $code = $authors_subfield->[0];
my $value = $authors_subfield->[1];
my $linkvalue = $value;
$linkvalue =~ s/(\(|\))//g;
# UNIMARC author responsibility
if ( $marcflavour eq 'UNIMARC' and $code eq '4' ) {
$value = GetAuthorisedValueDesc( $field->tag(), $code, $value, '', $tagslib );
$linkvalue = "($value)";
}
# if no authority link, build a search query
unless ($subfield9) {
push @link_loop, {
limit => 'au',
'link' => $linkvalue,
operator => (scalar @link_loop) ? ' and ' : undef
};
}
my @this_link_loop = @link_loop;
# do not display $0
unless ( $code eq '0') {
push @subfields_loop, {
tag => $field->tag(),
code => $code,
value => $value,
link_loop => \@this_link_loop,
separator => (scalar @subfields_loop) ? $AuthoritySeparator : ''
};
}
}
push @marcauthors, {
MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop,
authoritylink => $subfield9,
unimarc3 => $unimarc3
};
}
return \@marcauthors;
}
=head2 GetMarcUrls
$marcurls = GetMarcUrls($record,$marcflavour);

97
Koha/Biblio.pm

@ -966,6 +966,103 @@ sub get_marc_notes {
return \@marcnotes;
}
=head3 get_authors_from_MARC
my $authors = $biblio->get_authors_from_MARC;
Get all authors from the MARC record and returns them in an array.
The authors are stored in different fields depending on MARC flavour
=cut
sub get_authors_from_MARC {
my ( $self, $params ) = @_;
my ( $mintag, $maxtag, $fields_filter );
my $marcflavour = C4::Context->preference('marcflavour');
# tagslib useful only for UNIMARC author responsibilities
my $tagslib;
if ( $marcflavour eq "UNIMARC" ) {
# FIXME : we don't have the framework available, we take the default framework. May be buggy on some setups, will be usually correct.
$tagslib = C4::Biblio::GetMarcStructure( 1, '', { unsafe => 1 });
$mintag = "700";
$maxtag = "712";
$fields_filter = '7..';
} else { # marc21/normarc
$mintag = "700";
$maxtag = "720";
$fields_filter = '7..';
}
my @marcauthors;
my $AuthoritySeparator = C4::Context->preference('AuthoritySeparator');
foreach my $field ( $self->metadata->record->field($fields_filter) ) {
next unless $field->tag() >= $mintag && $field->tag() <= $maxtag;
my @subfields_loop;
my @link_loop;
my @subfields = $field->subfields();
my $count_auth = 0;
# if there is an authority link, build the link with Koha-Auth-Number: subfield9
my $subfield9 = $field->subfield('9');
if ($subfield9) {
my $linkvalue = $subfield9;
$linkvalue =~ s/(\(|\))//g;
@link_loop = ( { 'limit' => 'an', 'link' => $linkvalue } );
}
# other subfields
my $unimarc3;
for my $authors_subfield (@subfields) {
next if ( $authors_subfield->[0] eq '9' );
# unimarc3 contains the $3 of the author for UNIMARC.
# For french academic libraries, it's the "ppn", and it's required for idref webservice
$unimarc3 = $authors_subfield->[1] if $marcflavour eq 'UNIMARC' and $authors_subfield->[0] =~ /3/;
# don't load unimarc subfields 3, 5
next if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /3|5/ ) );
my $code = $authors_subfield->[0];
my $value = $authors_subfield->[1];
my $linkvalue = $value;
$linkvalue =~ s/(\(|\))//g;
# UNIMARC author responsibility
if ( $marcflavour eq 'UNIMARC' and $code eq '4' ) {
$value = C4::Biblio::GetAuthorisedValueDesc( $field->tag(), $code, $value, '', $tagslib );
$linkvalue = "($value)";
}
# if no authority link, build a search query
unless ($subfield9) {
push @link_loop, {
limit => 'au',
'link' => $linkvalue,
operator => (scalar @link_loop) ? ' and ' : undef
};
}
my @this_link_loop = @link_loop;
# do not display $0
unless ( $code eq '0') {
push @subfields_loop, {
tag => $field->tag(),
code => $code,
value => $value,
link_loop => \@this_link_loop,
separator => (scalar @subfields_loop) ? $AuthoritySeparator : ''
};
}
}
push @marcauthors, {
MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop,
authoritylink => $subfield9,
unimarc3 => $unimarc3
};
}
return \@marcauthors;
}
=head3 to_api
my $json = $biblio->to_api;

2
basket/basket.pl

@ -72,7 +72,7 @@ foreach my $biblionumber ( @bibs ) {
my $biblio = Koha::Biblios->find( $biblionumber );
my $record = &GetMarcBiblio({ biblionumber => $biblionumber });
my $marcnotesarray = $biblio->get_marc_notes({ marcflavour => $marcflavour });
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my $marcseriesarray = GetMarcSeries ($record,$marcflavour);
my $marcurlsarray = GetMarcUrls ($record,$marcflavour);

3
basket/sendbasket.pl

@ -74,10 +74,11 @@ if ( $email_add ) {
my $dat = GetBiblioData($biblionumber);
next unless $dat;
my $biblio = Koha::Biblios->find( $biblionumber );
my $record = GetMarcBiblio({
biblionumber => $biblionumber,
embed_items => 1 });
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my @items = GetItemsInfo( $biblionumber );

2
opac/opac-basket.pl

@ -94,7 +94,7 @@ foreach my $biblionumber ( @bibs ) {
$record_processor->process($record);
next unless $record;
my $marcnotesarray = $biblio->get_marc_notes({ marcflavour => $marcflavour, opac => 1 });
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my $marcseriesarray = GetMarcSeries ($record,$marcflavour);
my $marcurlsarray = GetMarcUrls ($record,$marcflavour);

2
opac/opac-detail.pl

@ -784,6 +784,7 @@ if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) {
}
my $marcnotesarray = $biblio->get_marc_notes({ marcflavour => $marcflavour, opac => 1 });
my $marcauthorsarray = $biblio->get_authors_from_MARC;
if( C4::Context->preference('ArticleRequests') ) {
my $patron = $borrowernumber ? Koha::Patrons->find($borrowernumber) : undef;
@ -799,6 +800,7 @@ if( C4::Context->preference('ArticleRequests') ) {
my $norequests = ! $biblio->items->filter_by_for_hold->count;
$template->param(
MARCNOTES => $marcnotesarray,
MARCAUTHORS => $marcauthorsarray,
norequests => $norequests,
itemdata_ccode => $itemfields{ccode},
itemdata_materials => $itemfields{materials},

3
opac/opac-sendbasket.pl

@ -81,12 +81,13 @@ if ( $email_add ) {
my $dat = GetBiblioData($biblionumber);
next unless $dat;
my $biblio = Koha::Biblios->find( $biblionumber );
my $record = GetMarcBiblio({
biblionumber => $biblionumber,
embed_items => 1,
opac => 1,
borcat => $borcat });
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my @items = GetItemsInfo( $biblionumber );

3
opac/opac-sendshelf.pl

@ -92,10 +92,11 @@ if ( $email ) {
opac => 1,
borcat => $borcat });
next unless $record;
my $biblio = Koha::Biblios->find( $biblionumber );
my $fw = GetFrameworkCode($biblionumber);
my $dat = GetBiblioData($biblionumber);
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my @items = GetItemsInfo( $biblionumber );

8
t/Biblio.t

@ -21,7 +21,7 @@ use Test::More;
use Test::MockModule;
use Test::Warn;
plan tests => 39;
plan tests => 37;
use_ok('C4::Biblio', qw( AddBiblio ModBiblio BiblioAutoLink LinkBibHeadingsToAuthorities GetMarcPrice GetMarcQuantity GetMarcControlnumber GetMarcISBN GetMarcISSN GetMarcSubjects GetMarcAuthors GetMarcUrls GetMarcSeries TransformMarcToKoha ModBiblioMarc RemoveAllNsb GetMarcBiblio UpdateTotalIssues ));
@ -94,12 +94,6 @@ warning_is { $ret = GetMarcSubjects() }
ok( !defined $ret, 'GetMarcSubjects returns undef if not passed rec');
warning_is { $ret = GetMarcAuthors() }
{ carped => 'GetMarcAuthors called on undefined record'},
"GetMarcAuthors returns carped warning on undef record";
ok( !defined $ret, 'GetMarcAuthors returns undef if not passed rec');
warning_is { $ret = GetMarcUrls() }
{ carped => 'GetMarcUrls called on undefined record'},
"GetMarcUrls returns carped warning on undef record";

30
t/db_dependent/Koha/Biblio.t

@ -17,7 +17,7 @@
use Modern::Perl;
use Test::More tests => 19;
use Test::More tests => 20;
use Test::Warn;
use C4::Biblio qw( AddBiblio ModBiblio ModBiblioMarc );
@ -859,6 +859,34 @@ subtest 'current_checkouts() and old_checkouts() tests' => sub {
$schema->storage->txn_rollback;
};
subtest 'get_authors_from_MARC() tests' => sub {
plan tests => 1;
$schema->storage->txn_begin;
my $biblio = $builder->build_sample_biblio;
my $record = $biblio->metadata->record;
# add author information
my $field = MARC::Field->new('700','1','','a' => 'Jefferson, Thomas');
$record->append_fields($field);
$field = MARC::Field->new('700','1','','d' => '1743-1826');
$record->append_fields($field);
$field = MARC::Field->new('700','1','','e' => 'former owner.');
$record->append_fields($field);
$field = MARC::Field->new('700','1','','5' => 'MH');
$record->append_fields($field);
# get record
C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
$biblio = Koha::Biblios->find( $biblio->biblionumber );
is( 4, @{$biblio->get_authors_from_MARC}, 'get_authors_from_MARC retrieves correct number of author subfields' );
$schema->storage->txn_rollback;
};
sub component_record1 {
my $marc = MARC::Record->new;
$marc->append_fields(

3
virtualshelves/sendshelf.pl

@ -73,11 +73,12 @@ if ($to_address) {
while ( my $content = $contents->next ) {
my $biblionumber = $content->biblionumber;
my $biblio = Koha::Biblios->find( $biblionumber );
my $dat = GetBiblioData($biblionumber);
my $record = GetMarcBiblio({
biblionumber => $biblionumber,
embed_items => 1 });
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my @items = GetItemsInfo($biblionumber);

Loading…
Cancel
Save