View | Details | Raw Unified | Return to bug 11300
Collapse All | Expand All

(-)a/C4/Biblio.pm (-4 / +16 lines)
Lines 114-119 use Koha::SearchEngine; Link Here
114
use Koha::SearchEngine::Indexer;
114
use Koha::SearchEngine::Indexer;
115
use Koha::Libraries;
115
use Koha::Libraries;
116
use Koha::Util::MARC;
116
use Koha::Util::MARC;
117
use C4::Linker::Default;
117
118
118
=head1 NAME
119
=head1 NAME
119
120
Lines 594-600 sub BiblioAutoLink { Link Here
594
595
595
=head2 LinkBibHeadingsToAuthorities
596
=head2 LinkBibHeadingsToAuthorities
596
597
597
  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $tagtolink,  $verbose]);
598
  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $tagtolink, $dont_auto_create, $verbose]);
598
599
599
Links bib headings to authority records by checking
600
Links bib headings to authority records by checking
600
each authority-controlled field in the C<MARC::Record>
601
each authority-controlled field in the C<MARC::Record>
Lines 618-624 sub LinkBibHeadingsToAuthorities { Link Here
618
    my $allowrelink = shift;
619
    my $allowrelink = shift;
619
    my $tagtolink     = shift;
620
    my $tagtolink     = shift;
620
    my $verbose = shift;
621
    my $verbose = shift;
622
    my $dont_auto_create = shift;
621
    my %results;
623
    my %results;
624
    my $linker_default = C4::Linker::Default->new();
622
    if (!$bib) {
625
    if (!$bib) {
623
        carp 'LinkBibHeadingsToAuthorities called on undefined bib record';
626
        carp 'LinkBibHeadingsToAuthorities called on undefined bib record';
624
        return ( 0, {});
627
        return ( 0, {});
Lines 645-651 sub LinkBibHeadingsToAuthorities { Link Here
645
            next;
648
            next;
646
        }
649
        }
647
650
648
        my ( $authid, $fuzzy, $match_count ) = $linker->get_link($heading);
651
        my ( $authid, $fuzzy, $match_count, $status ) = $linker->get_link($heading);
652
        if ( defined $status ) {
653
            if ($status eq 'NO_CONNECTION' or $status eq 'SERVER_NOT_FOUND') {
654
                return 0, { error => $status };
655
            }
656
            elsif ($status eq 'Z3950_SEARCH_EMPTY') {
657
                ( $authid, $fuzzy, $match_count, $status ) = $linker_default->get_link($heading);
658
            }
659
        }
649
        if ($authid) {
660
        if ($authid) {
650
            $results{ $fuzzy ? 'fuzzy' : 'linked' }
661
            $results{ $fuzzy ? 'fuzzy' : 'linked' }
651
              ->{ $heading->display_form() }++;
662
              ->{ $heading->display_form() }++;
Lines 657-663 sub LinkBibHeadingsToAuthorities { Link Here
657
            $field->delete_subfield( code => '9' ) if defined $current_link;
668
            $field->delete_subfield( code => '9' ) if defined $current_link;
658
            $field->add_subfields( '9', $authid );
669
            $field->add_subfields( '9', $authid );
659
            $num_headings_changed++;
670
            $num_headings_changed++;
660
            push(@{$results{'details'}}, { tag => $field->tag(), authid => $authid, status => 'LOCAL_FOUND'}) if $verbose;
671
            push(@{$results{'details'}}, { tag => $field->tag(), authid => $authid, status => $status || 'LOCAL_FOUND'}) if $verbose;
661
        }
672
        }
662
        else {
673
        else {
663
            my $authority_type = Koha::Authority::Types->find( $heading->auth_type() );
674
            my $authority_type = Koha::Authority::Types->find( $heading->auth_type() );
Lines 667-675 sub LinkBibHeadingsToAuthorities { Link Here
667
                $results{'fuzzy'}->{ $heading->display_form() }++;
678
                $results{'fuzzy'}->{ $heading->display_form() }++;
668
                push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
679
                push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
669
            }
680
            }
670
            elsif ( C4::Context->preference('AutoCreateAuthorities') ) {
681
            elsif ( !$dont_auto_create && C4::Context->preference('AutoCreateAuthorities') ) {
671
                if ( _check_valid_auth_link( $current_link, $field ) ) {
682
                if ( _check_valid_auth_link( $current_link, $field ) ) {
672
                    $results{'linked'}->{ $heading->display_form() }++;
683
                    $results{'linked'}->{ $heading->display_form() }++;
684
                    push(@{$results{'details'}}, { tag => $field->tag(), authid => $authid, status => 'UNCHANGED'}) if $verbose;
673
                }
685
                }
674
                elsif ( !$match_count ) {
686
                elsif ( !$match_count ) {
675
                    my $authority_type = Koha::Authority::Types->find( $heading->auth_type() );
687
                    my $authority_type = Koha::Authority::Types->find( $heading->auth_type() );
(-)a/C4/Biblio.pm.rej (+20 lines)
Line 0 Link Here
1
diff a/C4/Biblio.pm b/C4/Biblio.pm	(rejected hunks)
2
@@ -461,7 +462,7 @@ sub BiblioAutoLink {
3
4
 =head2 LinkBibHeadingsToAuthorities
5
6
-  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $verbose]);
7
+  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $verbose, $dont_auto_create]);
8
9
 Links bib headings to authority records by checking
10
 each authority-controlled field in the C<MARC::Record>
11
@@ -484,7 +485,9 @@ sub LinkBibHeadingsToAuthorities {
12
     my $frameworkcode = shift;
13
     my $allowrelink = shift;
14
     my $verbose = shift;
15
+    my $dont_auto_create = shift;
16
     my %results;
17
+    my $linker_default=C4::Linker::Default->new();
18
     if (!$bib) {
19
         carp 'LinkBibHeadingsToAuthorities called on undefined bib record';
20
         return ( 0, {});
(-)a/C4/Linker/Z3950Server.pm (+316 lines)
Line 0 Link Here
1
package C4::Linker::Z3950Server;
2
3
# Copyright 2012 Frédérick Capovilla - Libéo
4
#
5
# Koha is free software; you can redistribute it and/or modify it
6
# under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 3 of the License, or
8
# (at your option) any later version.
9
#
10
# Koha is distributed in the hope that it will be useful, but
11
# WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
14
#
15
# You should have received a copy of the GNU General Public License
16
# along with Koha; if not, see <http://www.gnu.org/licenses>.
17
18
use strict;
19
use warnings;
20
use Carp;
21
use MARC::Field;
22
use MARC::Record;
23
use C4::Context;
24
use C4::Heading;
25
use ZOOM; # For Z39.50 Searches
26
use C4::AuthoritiesMarc; # For Authority addition
27
use C4::Log; # logaction
28
use Koha::SearchEngine::Indexer;
29
30
use base qw(C4::Linker);
31
32
33
sub get_link {
34
    my $self        = shift;
35
    my $heading     = shift;
36
    my $behavior    = shift || 'default';
37
    my $search_form = $heading->search_form();
38
    my $authid;
39
    my $fuzzy = 0;
40
    my $match_count = 0;
41
    my $status = '';
42
43
    if ( $self->{'cache'}->{$search_form}->{'cached'} ) {
44
        $authid = $self->{'cache'}->{$search_form}->{'authid'};
45
        $fuzzy  = $self->{'cache'}->{$search_form}->{'fuzzy'};
46
    }else {
47
        # Look for matching authorities on the Z39.50 server
48
        unless($self->{'local_first'}) {
49
            ($authid, undef, $status) = $self->getZ3950Authority($heading);
50
            if($status eq 'Z3950_SEARCH_ERROR' or
51
               $status eq 'Z3950_QUERY_ERROR' or
52
               $status eq 'NO_CONNECTION' or
53
               $status eq 'SERVER_NOT_FOUND') {
54
                return $authid, $fuzzy, 0, $status;
55
            }
56
        }
57
        if(!$authid) {
58
            # look for matching authorities
59
            my $authorities = $heading->authorities(1);    # $skipmetadata = true
60
            $match_count = scalar @$authorities;
61
62
            if ( $behavior eq 'default' && $#{$authorities} >= 0 ) {
63
                $authid = $authorities->[0]->{'authid'};
64
            }elsif ( $behavior eq 'first' && $#{$authorities} >= 0 ) {
65
                $authid = $authorities->[0]->{'authid'};
66
                $fuzzy  = $#{$authorities} > 0;
67
            }
68
            elsif ( $behavior eq 'last' && $#{$authorities} >= 0 ) {
69
                $authid = $authorities->[ $#{$authorities} ]->{'authid'};
70
                $fuzzy  = $#{$authorities} > 0;
71
            }
72
73
            if ( !defined $authid && $self->{'broader_headings'} ) {
74
                my $field     = $heading->field();
75
                my @subfields = $field->subfields();
76
                if ( scalar @subfields > 1 ) {
77
                    pop @subfields;
78
                    $field->replace_with(
79
                        MARC::Field->new(
80
                            $field->tag,
81
                            $field->indicator(1),
82
                            $field->indicator(2),
83
                            map { $_[0] => $_[1] } @subfields
84
                        )
85
                    );
86
                    ( $authid, $fuzzy ) =
87
                      $self->get_link( C4::Heading->new_from_bib_field($field),
88
                        $behavior );
89
                }
90
            }
91
        }
92
        if($self->{'local_first'} && !$authid) {
93
            ($authid, undef, $status) = $self->getZ3950Authority($heading);
94
        }
95
96
        $self->{'cache'}->{$search_form}->{'cached'} = 1;
97
        $self->{'cache'}->{$search_form}->{'authid'} = $authid;
98
        $self->{'cache'}->{$search_form}->{'fuzzy'}  = $fuzzy;
99
    }
100
    return $self->SUPER::_handle_auth_limit($authid), $fuzzy, $match_count, $status;
101
}
102
103
sub update_cache {
104
    my $self        = shift;
105
    my $heading     = shift;
106
    my $authid      = shift;
107
    my $search_form = $heading->search_form();
108
    my $fuzzy = 0;
109
110
    $self->{'cache'}->{$search_form}->{'cached'} = 1;
111
    $self->{'cache'}->{$search_form}->{'authid'} = $authid;
112
    $self->{'cache'}->{$search_form}->{'fuzzy'}  = $fuzzy;
113
}
114
115
sub flip_heading {
116
    my $self    = shift;
117
    my $heading = shift;
118
119
    # TODO: implement
120
}
121
122
123
=head1 getZ3950Authority
124
125
  ($authid, $record, $status) = $self->getZ3950Authority($heading);
126
127
  Do a Z39.50 search for the heading using the $conn ZOOM::Connection object and the $heading Heading.
128
  The column origincode is used to check for duplicates.
129
  FIXME: Use thesaurus in search? As of Koha 3.8, the community stopped using them.
130
131
  RETURNS :
132
  $authid = the ID of the local copy of the authority record that was found. undef if nothing was found.
133
  $record = the MARC record of the found authority.
134
  $status = A string with additional informations on the search status (Z3950_CREATED, Z3950_UPDATED, Z3950_QUERY_ERROR, Z3950_SEARCH_ERROR)
135
136
=cut
137
138
sub getZ3950Authority {
139
    my $self = shift;
140
    my $heading = shift;
141
142
    # Try to find a match on the Z39.50 server if LinkerZ3950Server is set
143
    if(C4::Context->preference('LinkerZ3950Server')) {
144
        unless($self->{'conn'}) {
145
            my $sth = C4::Context->dbh->prepare("select * from z3950servers where servername=?");
146
            $sth->execute(C4::Context->preference('LinkerZ3950Server'));
147
            my $server = $sth->fetchrow_hashref or undef;
148
            $sth->finish;
149
150
            if($server) {
151
                my $options = ZOOM::Options->new();
152
                $options->option('cclfile' => C4::Context->new()->{"serverinfo"}->{"authorityserver"}->{"ccl2rpn"});
153
                $options->option('elementSetName', 'F');
154
                $options->option('async', 0);
155
                $options->option('databaseName', $server->{db});
156
                $options->option('user',         $server->{userid}  ) if $server->{userid};
157
                $options->option('password',     $server->{password}) if $server->{password};
158
                $options->option('preferredRecordSyntax', $server->{syntax});
159
                $self->{'conn'} = create ZOOM::Connection($options);
160
                eval{ $self->{'conn'}->connect( $server->{host}, $server->{port} ) };
161
                if($@) {
162
                    return (undef, undef, 'NO_CONNECTION');
163
                }}
164
            else {
165
                return (undef, undef, 'SERVER_NOT_FOUND');
166
            }
167
        }
168
    }
169
    else {
170
        return;
171
    }
172
    my $query =qq(Match-Heading,do-not-truncate,ext="$heading->{'search_form'}");
173
    my $zquery = eval{ ZOOM::Query::CCL2RPN->new($query, $self->{'conn'}) };
174
    if($@) {
175
        warn $query . "\n" . $@;
176
        return (undef, undef, 'Z3950_QUERY_ERROR');
177
    }
178
179
    # Try to send the search query to the server.
180
    my $rs = eval{ $self->{'conn'}->search($zquery) };
181
    if($@){
182
        warn $query . "\n" . $@;
183
        return (undef, undef, 'Z3950_SEARCH_EMPTY');
184
    }
185
186
    # If authorities are found, select the first valid one for addition in the local authority table.
187
    my $record;
188
    if($rs->size() != 0) {
189
        $record = MARC::Record::new_from_usmarc($rs->record(0)->raw());
190
    }else{
191
        return (undef, undef, 'Z3950_SEARCH_ERROR');
192
    }
193
    $rs->destroy();
194
    $zquery->destroy();
195
196
    # If a valid authority was found, add it in the local authority database.
197
    if($record) {
198
        my $dbh=C4::Context->dbh;
199
200
        my $authtypecode = C4::AuthoritiesMarc::GuessAuthTypeCode($record);
201
        my $authId;
202
203
        # Use the control number to prevent the creation of duplicate authorities.
204
        my $controlNumber = $record->field('970')->subfield('0');
205
        my $sthExist=$dbh->prepare("SELECT authid FROM auth_header WHERE origincode =?");
206
        $sthExist->execute($controlNumber) or die $sthExist->errstr;
207
        ($authId) = $sthExist->fetchrow;
208
        $sthExist->finish;
209
210
        #------------------------------------------------------------------------------------------
211
        # Corrections and verifications before insertion
212
        my $format;
213
        my $leader='     nz  a22     o  4500';# Leader for incomplete MARC21 record
214
215
        if (uc(C4::Context->preference('marcflavour')) eq 'UNIMARC') {
216
            $format= 'UNIMARCAUTH';
217
        }
218
        else {
219
            $format= 'MARC21';
220
        }
221
222
        if ($format eq "MARC21") {
223
            if (!$record->leader) {
224
                $record->leader($leader);
225
            }
226
            if (!$record->field('003')) {
227
                $record->insert_fields_ordered(
228
                        MARC::Field->new('003',C4::Context->preference('MARCOrgCode'))
229
                        );
230
            }
231
            my $time=POSIX::strftime("%Y%m%d%H%M%S",localtime);
232
            if (!$record->field('005')) {
233
                $record->insert_fields_ordered(
234
                        MARC::Field->new('005',$time.".0")
235
                        );
236
            }
237
            my $date=POSIX::strftime("%y%m%d",localtime);
238
            if (!$record->field('008')) {
239
                # Get a valid default value for field 008
240
                my $default_008 = C4::Context->preference('MARCAuthorityControlField008');
241
                if(!$default_008 or length($default_008)<34) {
242
                    $default_008 = '|| aca||aabn           | a|a     d';
243
            }
244
            else {
245
                    $default_008 = substr($default_008,0,34);
246
                }
247
                $record->insert_fields_ordered( MARC::Field->new('008',$date.$default_008) );
248
            }
249
            if (!$record->field('040')) {
250
                $record->insert_fields_ordered(
251
                    MARC::Field->new('040','','',
252
                        'a' => C4::Context->preference('MARCOrgCode'),
253
                        'c' => C4::Context->preference('MARCOrgCode')
254
                    )
255
                );
256
            }
257
        }
258
        if ($format eq "UNIMARCAUTH") {
259
            $record->leader("     nx  j22             ") unless ($record->leader());
260
            my $date=POSIX::strftime("%Y%m%d",localtime);
261
            if (my $string=$record->subfield('100',"a")){
262
                $string=~s/fre50/frey50/;
263
                $record->field('100')->update('a'=>$string);
264
            }
265
            elsif ($record->field('100')){
266
                $record->field('100')->update('a'=>$date."afrey50      ba0");
267
            } else {
268
                $record->append_fields(
269
                    MARC::Field->new('100',' ',' '
270
                        ,'a'=>$date."afrey50      ba0")
271
                );
272
            }
273
        }
274
        my ($auth_type_tag, $auth_type_subfield) = C4::AuthoritiesMarc::get_auth_type_location($authtypecode);
275
        if (!$authId and $format eq "MARC21") {
276
        # only need to do this fix when modifying an existing authority
277
            C4::AuthoritiesMarc::MARC21::fix_marc21_auth_type_location($record, $auth_type_tag, $auth_type_subfield);
278
        }
279
        if (my $field=$record->field($auth_type_tag)){
280
            $field->update($auth_type_subfield=>$authtypecode);
281
        }
282
        else {
283
            $record->add_fields($auth_type_tag,'','', $auth_type_subfield=>$authtypecode);
284
        }
285
        #------------------------------------------------------------------------------------------
286
        if ($authId) {
287
            my $sth=$dbh->prepare("UPDATE auth_header SET authtypecode=?,marc=?,marcxml=? WHERE origincode =?");
288
            eval { $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$controlNumber) or die $sth->errstr; };
289
            $sth->finish;
290
            warn "Problem with authority $controlNumber : Cannot update" if $@;
291
            $dbh->commit unless $dbh->{AutoCommit};
292
            return if $@;
293
294
            my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::AUTHORITIES_INDEX });
295
            $indexer->index_records($authId,'specialUpdate',"authorityserver",$record);
296
            return ($authId, $record, 'Z3950_UPDATED');
297
        }
298
        else {
299
            my $sth=$dbh->prepare("INSERT INTO auth_header (datecreated,authtypecode,marc,marcxml,origincode) VALUES (NOW(),?,?,?,?)");
300
            eval { $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$controlNumber) or die $sth->errstr; };
301
            $sth->finish;
302
            warn "Problem with authority $controlNumber : Cannot insert" if $@;
303
            my $id = $dbh->{'mysql_insertid'};
304
            $dbh->commit unless $dbh->{AutoCommit};
305
            return if $@;
306
307
            logaction( "AUTHORITIES", "ADD", $id, "authority" ) if C4::Context->preference("AuthoritiesLog");
308
            my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::AUTHORITIES_INDEX });
309
            $indexer->index_records($id,'specialUpdate',"authorityserver",$record);
310
            return ($id, $record, 'Z3950_CREATED');
311
        }
312
    }
313
    return ;
314
}
315
316
1;
(-)a/installer/data/mysql/atomicupdate/Bug11300_LinkerZ3950Server_syspef.sql (+9 lines)
Line 0 Link Here
1
$DBversion = 'XXX';
2
if ( CheckVersion( $DBversion ) ) {
3
    $dbh->do(q{
4
        INSERT IGNORE INTO systempreferences (`variable`, `value`, `options`, `explanation`, `type`)
5
        VALUES ('LinkerZ3950Server', '', NULL, 'Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module', 'free')
6
    ­});
7
8
    NewVersion( $DBversion, 12446, "Add new system preference LinkerZ3950Server");
9
}
(-)a/installer/data/mysql/mandatory/sysprefs.sql (+1 lines)
Lines 347-352 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
347
('LinkerModule','Default','Default|FirstMatch|LastMatch','Chooses which linker module to use (see documentation).','Choice'),
347
('LinkerModule','Default','Default|FirstMatch|LastMatch','Chooses which linker module to use (see documentation).','Choice'),
348
('LinkerOptions','','','A pipe-separated list of options for the linker.','free'),
348
('LinkerOptions','','','A pipe-separated list of options for the linker.','free'),
349
('LinkerRelink','1',NULL,'If ON the authority linker will relink headings that have previously been linked every time it runs.','YesNo'),
349
('LinkerRelink','1',NULL,'If ON the authority linker will relink headings that have previously been linked every time it runs.','YesNo'),
350
('LinkerZ3950Server','',NULL,'Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module',''),
350
('ListOwnerDesignated', NULL, NULL, 'Designated list owner at patron deletion', 'Free'),
351
('ListOwnerDesignated', NULL, NULL, 'Designated list owner at patron deletion', 'Free'),
351
('ListOwnershipUponPatronDeletion', 'delete', 'delete|transfer', 'Defines the action on their public or shared lists when patron is deleted', 'Choice'),
352
('ListOwnershipUponPatronDeletion', 'delete', 'delete|transfer', 'Defines the action on their public or shared lists when patron is deleted', 'Choice'),
352
('LoadSearchHistoryToTheFirstLoggedUser', '1', NULL, 'If ON, the next user will automatically get the last searches in their history', 'YesNo'),
353
('LoadSearchHistoryToTheFirstLoggedUser', '1', NULL, 'If ON, the next user will automatically get the last searches in their history', 'YesNo'),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/authorities.pref (+5 lines)
Lines 85-90 Authorities: Link Here
85
                  Default: default
85
                  Default: default
86
                  FirstMatch: "first match"
86
                  FirstMatch: "first match"
87
                  LastMatch: "last match"
87
                  LastMatch: "last match"
88
                  Z3950Server: "Z39.50 Server"
88
            - linker module for matching headings to authority records.
89
            - linker module for matching headings to authority records.
89
        -
90
        -
90
            - "Set the following options for the authority linker:"
91
            - "Set the following options for the authority linker:"
Lines 119-121 Authorities: Link Here
119
                  1: Do
120
                  1: Do
120
                  0: "Don't"
121
                  0: "Don't"
121
            - attempt to automatically link headings when saving records in the cataloging module, obeys <a href='/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=LinkerRelink'>LinkerRelink</a> and <a href='/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=CatalogModuleRelink'>CatalogModuleRelink</a> for record edits.
122
            - attempt to automatically link headings when saving records in the cataloging module, obeys <a href='/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=LinkerRelink'>LinkerRelink</a> and <a href='/cgi-bin/koha/admin/preferences.pl?op=search&searchfield=CatalogModuleRelink'>CatalogModuleRelink</a> for record edits.
123
        -
124
            - pref: LinkerZ3950Server
125
            - class: multi
126
            - Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module :
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt (-2 / +19 lines)
Lines 331-336 function updateHeadingLinks(links) { Link Here
331
        var message = '';
331
        var message = '';
332
        var field_class = 'no_matching_authority_field';
332
        var field_class = 'no_matching_authority_field';
333
        switch(heading.status) {
333
        switch(heading.status) {
334
            case 'Z3950_CREATED':
335
                image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
336
                message = _("A matching authority record was found on the Z39.50 server and was imported locally.");
337
                field_class = 'matching_authority_field';
338
                break;
339
            case 'Z3950_UPDATED':
340
                image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
341
                message = _("A matching authority record was found on the Z39.50 server and a local authority was updated.");
342
                field_class = 'matching_authority_field';
343
                break;
334
            case 'LOCAL_FOUND':
344
            case 'LOCAL_FOUND':
335
                image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
345
                image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
336
                message = _("A matching authority was found in the local database.");
346
                message = _("A matching authority was found in the local database.");
Lines 384-390 function AutomaticLinker() { Link Here
384
    $('#f').find('.tag').each(function() {
394
    $('#f').find('.tag').each(function() {
385
        var empty = true;
395
        var empty = true;
386
        $(this).find('.input_marceditor').each(function() {
396
        $(this).find('.input_marceditor').each(function() {
387
            if($(this).val() != '') {
397
            if(this.value != '') {
388
                empty = false;
398
                empty = false;
389
                return false;
399
                return false;
390
            }
400
            }
Lines 396-403 function AutomaticLinker() { Link Here
396
406
397
    // Get all the form values to post via AJAX
407
    // Get all the form values to post via AJAX
398
    var form_data = {};
408
    var form_data = {};
409
    var i=0;
399
    $('#f').find(':input').each(function(){
410
    $('#f').find(':input').each(function(){
400
        form_data[this.name] = $(this).val();
411
       form_data[this.name] = this.value;
401
    });
412
    });
402
    delete form_data[''];
413
    delete form_data[''];
403
414
Lines 415-420 function AutomaticLinker() { Link Here
415
                case 'UNAUTHORIZED':
426
                case 'UNAUTHORIZED':
416
                    alert(_("Error : You do not have the permissions necessary to use this functionality."));
427
                    alert(_("Error : You do not have the permissions necessary to use this functionality."));
417
                    break;
428
                    break;
429
                case 'SERVER_NOT_FOUND':
430
                    alert(_("Error : The Z39.50 server configured in the 'LinkerZ3950Server' preference was not found in the Z39.50 servers list."));
431
                    break;
432
                case 'NO_CONNECTION':
433
                    alert(_("Error : Could not connect to the Z39.50 server."));
434
                    break;
418
                case 'OK':
435
                case 'OK':
419
                    updateHeadingLinks(json.links);
436
                    updateHeadingLinks(json.links);
420
                    break;
437
                    break;
(-)a/svc/cataloguing/automatic_linker.pl (-9 / +9 lines)
Lines 33-49 my ( $auth_status ) = Link Here
33
    editauthorities => 1,
33
    editauthorities => 1,
34
    editcatalogue => 'edit_catalogue'
34
    editcatalogue => 'edit_catalogue'
35
  });
35
  });
36
if ( $auth_status ne "ok" ) {
37
    print to_json( { status => 'UNAUTHORIZED' } );
38
    exit 0;
39
}
40
36
41
# Link the biblio headings to authorities and return a json containing the status of all the links.
37
# Link the biblio headings to authorities and return a json containing the status of all the links.
42
# Example : {"status":"OK","links":[{"authid":"123","status":"LINK_CHANGED","tag":"650"}]}
38
# Example : {"status":"OK","links":[{"authid":"123","status":"LINK_CHANGED","tag":"650"}]}
43
#
39
#
44
# tag = the tag number of the field
40
# tag = the tag number of the field
45
# authid = the value of the $9 subfield for this tag
41
# authid = the value of the $9 subfield for this tag
46
# status = The status of the link (LOCAL_FOUND, NONE_FOUND, MULTIPLE_MATCH, UNCHANGED, CREATED)
42
# status = The status of the link (LOCAL_FOUND, NONE_FOUND, MULTIPLE_MATCH, UNCHANGED, CREATED, 3950_CREATED, Z3950_UPDATED)
47
43
48
my $json;
44
my $json;
49
45
Lines 54-61 my ( $headings_changed, $results ) = BiblioAutoLink ( Link Here
54
    scalar $input->param('frameworkcode'),
50
    scalar $input->param('frameworkcode'),
55
    1
51
    1
56
);
52
);
57
53
if(defined $results->{error}) {
58
$json->{status} = 'OK';
54
    $json->{links} = $results->{details} || '';
59
$json->{links} = $results->{details} || '';
55
    $json->{links} = $results->{details} || '';
56
}
57
else{
58
    $json->{status} = 'OK';
59
    $json->{links} = $results->{details} || '';
60
}
60
61
61
print to_json($json);
62
print to_json($json);
62
- 

Return to bug 11300