Bug 29897: Display author's identifiers
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Mon, 17 Jan 2022 16:59:21 +0000 (17:59 +0100)
committerTomas Cohen Arazi <tomascohen@theke.io>
Tue, 9 Aug 2022 13:58:44 +0000 (10:58 -0300)
This new enhancement add the capability to list the different
identifiers of authors. It is helpful for research publications for
instance.

This patch will add a new "Author identifiers" tab on the detail page
(OPAC) of a bibliographic record, with the list of the authors and their
identifiers.
On the detail page of the authority record, the same identifier list
will be displayed.

Test plan:
Create some authority with
024
  $a source
  $2 number
  $6 link to the source
With the pref turned ON you will be able to see the new information.

Sponsored-by: Orex Digital
Signed-off-by: Orex Digital <info@orex.es>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Koha/Authority.pm
koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-auth-detail.tt
koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt
opac/opac-authoritiesdetail.pl
opac/opac-detail.pl
t/db_dependent/Koha/Authorities.t

index cec6c66..0a6d30c 100644 (file)
@@ -114,6 +114,36 @@ sub controlled_indicators {
     });
 }
 
+=head3 get_identifiers
+
+    my $identifiers = $author->get_identifiers;
+
+Return a list of identifiers of the authors which are in 024$2$a
+
+=cut
+
+sub get_identifiers {
+    my ( $self, $params ) = @_;
+
+    my $flavour =
+      C4::Context->preference('marcflavour') eq 'UNIMARC'
+      ? 'UNIMARCAUTH'
+      : 'MARC21';
+    my $record =
+      MARC::Record->new_from_xml( $self->marcxml, 'UTF-8', $flavour );
+
+    my @identifiers;
+    for my $field ( $record->field('024') ) {
+        my $sf_2 = $field->subfield('2');
+        my $sf_a = $field->subfield('a');
+        my $sf_6 = $field->subfield('6');
+        next unless $sf_2 && $sf_a;
+        push @identifiers, {source => $sf_2, number => $sf_a, linkage => $sf_6};
+    }
+
+    return \@identifiers;
+}
+
 =head2 Class Methods
 
 =head3 type
index c32e588..aeef047 100644 (file)
                             [% INCLUDE 'navigation.inc' %]
                         </div>
                     </div>
-                    <div class="col-lg-10 order-first order-md-first order-lg-2">
+                    [% IF Koha.Preference( 'OPACAuthorIdentifiers' ) && author_identifiers.size %]
+                        <div class="col-lg-5 order-first order-md-first order-lg-2">
+                    [% ELSE %]
+                        <div class="col-lg-10 order-first order-md-first order-lg-2">
+                    [% END %]
+                [% ELSIF Koha.Preference( 'OPACAuthorIdentifiers' ) && author_identifiers.size %]
+                    <div class="col-lg-6 order-first order-md-first order-lg-2">
                 [% ELSE %]
                     <div class="col order-first order-md-first order-lg-2">
                 [% END %]
                         </div>
                     </div> <!-- / .#userauthdetails -->
                 </div> <!-- / .col-lg-10/12 -->
+                [% IF Koha.Preference( 'OPACAuthorIdentifiers' ) && author_identifiers.size %]
+                    [% IF ( OpacNav || OpacNavBottom ) %]
+                        <div class="col-lg-5 order-lg-3">
+                    [% ELSE %]
+                        <div class="col-lg-6 order-lg-3">
+                    [% END %]
+                        <div class="author_identifier">
+                            <span>Identifiers</span>
+                            <ul>
+                            [% FOR identifier IN author_identifiers %]
+                                <li>
+                                [% SWITCH identifier.source.lower %]
+                                [% CASE 'orcid' %]ORCID: <a href="https://orcid.org/[% identifier.number | url %]">[% identifier.number | html %]</a>
+                                [% CASE %][% identifier.source | html %]: [% identifier.number | html %]
+                                [% END %]
+                                </li>
+                            [% END %]
+                            </ul>
+                        </div>
+                    </div>
+                [% END %]
             </div> <!-- / .row -->
         </div> <!-- / .container-fluid -->
     </div> <!-- / .main -->
index 7c30daf..8fc72e2 100644 (file)
                                 </a>
                             </li>
                         [% END %]
+
+                        [% IF Koha.Preference( 'OPACAuthorIdentifiers' ) && author_identifiers.size %]
+                            <li id="tab_author_identifiers"><a href="#author_identifiers">Author identifiers</a></li>
+                        [% END %]
+
                     </ul>
 
                     <div class="tab-content">
                                 </div><!-- / #images -->
                             [% END # / IF OPACLocalCoverImages && localimages.size %]
 
+                            [% IF Koha.Preference( 'OPACAuthorIdentifiers' ) && author_identifiers.size %]
+                                <div id="author_identifiers" class="tab-pane" role="tabpanel" aria-labelledby="tab_author_identifiers-tab">
+                                    [% FOR author IN author_identifiers %]
+                                        <div class="author_identifier">
+                                            <span class="author_name"><a href="/cgi-bin/koha/opac-authoritiesdetail.pl?authid=[% author.authid | uri %]">[% author.name | html %]</a></span>
+                                            <ul>
+                                            [% FOR identifier IN author.identifiers %]
+                                                <li>
+                                                [% SWITCH identifier.source.lower %]
+                                                [% CASE 'orcid' %]ORCID:
+                                                [% CASE 'scopus' %]ScopusID:
+                                                [% CASE 'loop' %]loop:
+                                                [% CASE 'rid' %]Publons:
+                                                [% CASE %][% identifier.source | html %]:
+                                                [% END %]
+                                                [% IF identifier.linkage %]
+                                                    <a href="[% identifier.linkage | uri %]">[% identifier.number | html %]</a>
+                                                [% ELSE %]
+                                                    [% identifier.number | html %]
+                                                [% END %]
+                                                </li>
+                                            [% END %]
+                                            </ul>
+                                        </div>
+                                    [% END %]
+                                </div>
+                            [% END %]
+
                     </div> <!-- / #bibliodescriptions -->
 
                     [% IF ( NovelistSelectProfile && NovelistSelectView == 'below' && ( normalized_isbn || normalized_upc ) ) %]
index ed0a1c7..e6d41f7 100755 (executable)
@@ -168,6 +168,12 @@ if ($show_marc) {
 } else {
     my $summary = BuildSummary($record, $authid, $authtypecode);
     $template->{VARS}->{'summary'} = $summary;
+
+    if ( C4::Context->preference('OPACAuthorIdentifiers') ) {
+        my $authority = Koha::Authorities->find($authid);
+        my $identifiers = $authority->get_identifiers;
+        $template->param( author_identifiers => $identifiers );
+    }
 }
 
 output_html_with_http_headers $query, $cookie, $template->output;
index 1d1cdad..06d7044 100755 (executable)
@@ -1255,4 +1255,22 @@ $template->param(
     'OpacLocationBranchToDisplay' => C4::Context->preference('OpacLocationBranchToDisplay'),
 );
 
+if ( C4::Context->preference('OPACAuthorIdentifiers') ) {
+    my @author_identifiers;
+    for my $author ( @{ $biblio->get_marc_authors } ) {
+        my $authid    = $author->{authoritylink};
+        my $authority = Koha::Authorities->find($authid);
+        next unless $authority;
+        my $identifiers = $authority->get_identifiers;
+        next unless $identifiers && @$identifiers;
+        my ($name) =
+          map  { $_->{value} }
+          grep { $_->{code} eq 'a' ? $_ : () }
+          @{ $author->{MARCAUTHOR_SUBFIELDS_LOOP} };
+        push @author_identifiers,
+          { authid => $authid, name => $name, identifiers => $identifiers };
+    }
+    $template->param( author_identifiers => \@author_identifiers );
+}
+
 output_html_with_http_headers $query, $cookie, $template->output;
index 04ad663..a9c507d 100755 (executable)
@@ -19,7 +19,7 @@
 
 use Modern::Perl;
 
-use Test::More tests => 7;
+use Test::More tests => 8;
 use MARC::Field;
 use MARC::File::XML;
 use MARC::Record;
@@ -242,4 +242,49 @@ sub few_marc_records {
     return [ $marc ];
 }
 
+subtest 'get_identifiers' => sub {
+    plan tests => 1;
+
+    t::lib::Mocks::mock_preference( 'marcflavour', 'MARC21' );
+    my $record = MARC::Record->new();
+    $record->add_fields(
+        [
+            '100', ' ', ' ',
+            a => 'Lastname, Firstname',
+            b => 'b',
+            c => 'c',
+            i => 'i'
+        ],
+        [
+            '024', '', '',
+            a => '0000-0002-1234-5678',
+            2 => 'orcid',
+            6 => 'https://orcid.org/0000-0002-1234-5678'
+        ],
+        [
+            '024', '', '',
+            a => '01234567890',
+            2 => 'scopus',
+            6 => 'https://www.scopus.com/authid/detail.uri?authorId=01234567890'
+        ],
+    );
+    my $authid = C4::AuthoritiesMarc::AddAuthority($record, undef, 'PERSO_NAME');
+    my $authority = Koha::Authorities->find($authid);
+    is_deeply(
+        $authority->get_identifiers,
+        [
+            {
+                source  => 'orcid',
+                number  => '0000-0002-1234-5678',
+                linkage => 'https://orcid.org/0000-0002-1234-5678'
+            },
+            {
+                source => 'scopus',
+                number => '01234567890',
+                linkage => 'https://www.scopus.com/authid/detail.uri?authorId=01234567890'
+            }
+        ]
+    );
+};
+
 $schema->storage->txn_rollback;