From 92ad1a6148a95e9b11e35da8c8e94c08f1f6aade Mon Sep 17 00:00:00 2001 From: Aleisha Amohia Date: Fri, 18 Dec 2020 13:51:26 +1300 Subject: [PATCH] Bug 27266: Move GetMarcAuthors to Koha namespace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. 6. Set the OPACXSLTDetailsDisplay system preference to empty (for no xslt) 7. Log in to the OPAC. Find the record and add it to the cart and a list 8. View the cart and click 'more details'. Confirm authors show as normal. 9. Click 'send' and confirm the email sent shows the authors as normal. 10. Go to the list you added the record to and click 'send list'. Confirm the email sent shows the authors as normal. 11. View the record detail page and confirm the authors show as normal. 12. 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 Signed-off-by: Martin Renvoize --- C4/Biblio.pm | 100 ----------------------------------- Koha/Biblio.pm | 97 +++++++++++++++++++++++++++++++++ basket/basket.pl | 2 +- basket/sendbasket.pl | 3 +- opac/opac-basket.pl | 2 +- opac/opac-detail.pl | 2 +- opac/opac-sendbasket.pl | 3 +- opac/opac-sendshelf.pl | 3 +- t/Biblio.t | 6 --- t/db_dependent/Koha/Biblio.t | 30 ++++++++++- virtualshelves/sendshelf.pl | 3 +- 11 files changed, 137 insertions(+), 114 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index b482a99814..3f8404c10e 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -35,7 +35,6 @@ BEGIN { GetMarcISBN GetMarcISSN GetMarcSubjects - GetMarcAuthors GetMarcSeries GetMarcUrls GetUsedMarcStructure @@ -1616,105 +1615,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/normarc - $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); diff --git a/Koha/Biblio.pm b/Koha/Biblio.pm index fc1affe233..af688ce71c 100644 --- a/Koha/Biblio.pm +++ b/Koha/Biblio.pm @@ -850,6 +850,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; diff --git a/basket/basket.pl b/basket/basket.pl index 44727d2364..b572b96f59 100755 --- a/basket/basket.pl +++ b/basket/basket.pl @@ -65,7 +65,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); diff --git a/basket/sendbasket.pl b/basket/sendbasket.pl index 9e273b1f45..b0497ae51a 100755 --- a/basket/sendbasket.pl +++ b/basket/sendbasket.pl @@ -69,10 +69,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 ); diff --git a/opac/opac-basket.pl b/opac/opac-basket.pl index b746abde67..34a8d904a9 100755 --- a/opac/opac-basket.pl +++ b/opac/opac-basket.pl @@ -84,7 +84,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); diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index e4e4a8341d..c948a451e7 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -802,7 +802,7 @@ if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) { ## get notes and subjects from MARC record if (!C4::Context->preference("OPACXSLTDetailsDisplay") ) { my $marcisbnsarray = GetMarcISBN ($record,$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); diff --git a/opac/opac-sendbasket.pl b/opac/opac-sendbasket.pl index eee5e2c29b..0278c683f8 100755 --- a/opac/opac-sendbasket.pl +++ b/opac/opac-sendbasket.pl @@ -77,12 +77,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 ); diff --git a/opac/opac-sendshelf.pl b/opac/opac-sendshelf.pl index c97aa450dc..cf3dbc886f 100755 --- a/opac/opac-sendshelf.pl +++ b/opac/opac-sendshelf.pl @@ -86,10 +86,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 ); diff --git a/t/Biblio.t b/t/Biblio.t index f6259e905f..f0c2948722 100755 --- a/t/Biblio.t +++ b/t/Biblio.t @@ -93,12 +93,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"; diff --git a/t/db_dependent/Koha/Biblio.t b/t/db_dependent/Koha/Biblio.t index c96f5c2d41..0bf19fbc72 100755 --- a/t/db_dependent/Koha/Biblio.t +++ b/t/db_dependent/Koha/Biblio.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 14; +use Test::More tests => 15; use C4::Biblio; use Koha::Database; @@ -610,3 +610,31 @@ subtest 'get_marc_notes() UNIMARC 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; +}; diff --git a/virtualshelves/sendshelf.pl b/virtualshelves/sendshelf.pl index f15e2c9f64..09e2a4e43f 100755 --- a/virtualshelves/sendshelf.pl +++ b/virtualshelves/sendshelf.pl @@ -67,11 +67,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); -- 2.20.1