Bug 27266: Move GetMarcAuthors to Koha namespace
authorAleisha Amohia <aleishaamohia@hotmail.com>
Fri, 18 Dec 2020 00:51:26 +0000 (13:51 +1300)
committerFridolin Somers <fridolin.somers@biblibre.com>
Wed, 15 Dec 2021 22:15:03 +0000 (12:15 -1000)
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>
C4/Biblio.pm
Koha/Biblio.pm
basket/basket.pl
basket/sendbasket.pl
opac/opac-basket.pl
opac/opac-detail.pl
opac/opac-sendbasket.pl
opac/opac-sendshelf.pl
t/Biblio.t
t/db_dependent/Koha/Biblio.t
virtualshelves/sendshelf.pl

index 69e488a..ce2b949 100644 (file)
@@ -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);
index c4c1212..df74150 100644 (file)
@@ -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;
index 30f73b8..a516953 100755 (executable)
@@ -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);
index 1ea56fc..6110a60 100755 (executable)
@@ -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 );
index ef4a257..a379713 100755 (executable)
@@ -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);
index 3b47a19..098ece2 100755 (executable)
@@ -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},
index fdf8671..cb43af3 100755 (executable)
@@ -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 );
index 825de81..c8f9ed4 100755 (executable)
@@ -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 );
index 91080bd..1b84ba8 100755 (executable)
@@ -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";
index 73dcb2a..a666be2 100755 (executable)
@@ -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(
index bc47249..58b4d14 100755 (executable)
@@ -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);