Bug 21957: Add a flag to ModBiblio to avoid linking auths if called from linker
authorNick Clemens <nick@bywatersolutions.com>
Wed, 5 Dec 2018 21:05:32 +0000 (21:05 +0000)
committerNick Clemens <nick@bywatersolutions.com>
Thu, 18 Apr 2019 10:02:03 +0000 (10:02 +0000)
To test:
1 - prove -v t/db_dependent/Biblio.t
2 - Set BiblioAddsAuthoorities and AutoCreateAuthorities
3 - Modify a biblio to add a heading with no existing auth record
4 - Ensure the record was created on saving
5 - Ensure that editing works as normal otherwise
6 - Run link_bibs_to_authorities
7 - Ensure results are as expected

Signed-off-by: Michal Denar <black23@gmail.com>

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

C4/Biblio.pm
misc/link_bibs_to_authorities.pl
t/db_dependent/Biblio.t

index 13926ef..d7c7491 100644 (file)
@@ -240,7 +240,7 @@ sub AddBiblio {
 
 =head2 ModBiblio
 
-  ModBiblio( $record,$biblionumber,$frameworkcode);
+  ModBiblio( $record,$biblionumber,$frameworkcode, $disable_autolink);
 
 Replace an existing bib record identified by C<$biblionumber>
 with one supplied by the MARC::Record object C<$record>.  The embedded
@@ -256,12 +256,16 @@ in the C<biblio> and C<biblioitems> tables, as well as
 which fields are used to store embedded item, biblioitem,
 and biblionumber data for indexing.
 
+Unless C<$disable_autolink> is passed ModBiblio will relink record headings
+to authorities based on settings in the system preferences. This flag allows
+us to not relink records when the authority linker is saving modifications.
+
 Returns 1 on success 0 on failure
 
 =cut
 
 sub ModBiblio {
-    my ( $record, $biblionumber, $frameworkcode ) = @_;
+    my ( $record, $biblionumber, $frameworkcode, $disable_autolink ) = @_;
     if (!$record) {
         carp 'No record passed to ModBiblio';
         return 0;
@@ -272,7 +276,7 @@ sub ModBiblio {
         logaction( "CATALOGUING", "MODIFY", $biblionumber, "biblio BEFORE=>" . $newrecord->as_formatted );
     }
 
-    if (C4::Context->preference('BiblioAddsAuthorities')) {
+    if ( !$disable_autolink && C4::Context->preference('BiblioAddsAuthorities') ) {
         BiblioAutoLink( $record, $frameworkcode );
     }
 
@@ -624,12 +628,10 @@ safest place.
 
 sub _check_valid_auth_link {
     my ( $authid, $field ) = @_;
-
     require C4::AuthoritiesMarc;
 
     my $authorized_heading =
       C4::AuthoritiesMarc::GetAuthorizedHeading( { 'authid' => $authid } ) || '';
-
    return ($field->as_string('abcdefghijklmnopqrstuvwxyz') eq $authorized_heading);
 }
 
index 699451a..1fd75a5 100755 (executable)
@@ -221,7 +221,8 @@ sub process_bib {
             );
         }
         if ( not $test_only ) {
-            ModBiblio( $bib, $biblionumber, $frameworkcode );
+            ModBiblio( $bib, $biblionumber, $frameworkcode, 1 );
+            #Last param is to note ModBiblio was called from linking script and bib should not be linked again
             $num_bibs_modified++;
         }
     }
index 60ccde3..dd96e54 100755 (executable)
@@ -17,7 +17,7 @@
 
 use Modern::Perl;
 
-use Test::More tests => 11;
+use Test::More tests => 12;
 use Test::MockModule;
 use List::MoreUtils qw( uniq );
 use MARC::Record;
@@ -570,6 +570,23 @@ subtest 'MarcFieldForCreatorAndModifier' => sub {
     is($record->subfield('998', 'd'), 'Jane Doe', '998$d = Jane Doe');
 };
 
+subtest 'ModBiblio called from linker test' => sub {
+    plan tests => 2;
+    my $called = 0;
+    t::lib::Mocks::mock_preference('BiblioAddsAuthorities', 1);
+    my $biblio_mod = Test::MockModule->new( 'C4::Biblio' );
+    $biblio_mod->mock( 'LinkBibHeadingsToAuthorities', sub {
+        $called = 1;
+    });
+    my $record = MARC::Record->new();
+    my ($biblionumber) = C4::Biblio::AddBiblio($record,'');
+    C4::Biblio::ModBiblio($record,$biblionumber,'');
+    is($called,1,"We called to link bibs because not from linker");
+    $called = 0;
+    C4::Biblio::ModBiblio($record,$biblionumber,'',1);
+    is($called,0,"We didn't call to link bibs because from linker");
+};
+
 # Cleanup
 Koha::Caches->get_instance->clear_from_cache( "MarcSubfieldStructure-" );
 $schema->storage->txn_rollback;