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

(-)a/C4/Biblio.pm (-4 / +16 lines)
Lines 115-120 use Koha::SearchEngine::Indexer; Link Here
115
use Koha::SimpleMARC;
115
use Koha::SimpleMARC;
116
use Koha::Libraries;
116
use Koha::Libraries;
117
use Koha::Util::MARC;
117
use Koha::Util::MARC;
118
use C4::Linker::Default;
118
119
119
=head1 NAME
120
=head1 NAME
120
121
Lines 641-647 sub BiblioAutoLink { Link Here
641
642
642
=head2 LinkBibHeadingsToAuthorities
643
=head2 LinkBibHeadingsToAuthorities
643
644
644
  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $tagtolink,  $verbose]);
645
  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $tagtolink, $dont_auto_create, $verbose]);
645
646
646
Links bib headings to authority records by checking
647
Links bib headings to authority records by checking
647
each authority-controlled field in the C<MARC::Record>
648
each authority-controlled field in the C<MARC::Record>
Lines 665-671 sub LinkBibHeadingsToAuthorities { Link Here
665
    my $allowrelink = shift;
666
    my $allowrelink = shift;
666
    my $tagtolink     = shift;
667
    my $tagtolink     = shift;
667
    my $verbose = shift;
668
    my $verbose = shift;
669
    my $dont_auto_create = shift;
668
    my %results;
670
    my %results;
671
    my $linker_default = C4::Linker::Default->new();
669
    my $memory_cache = Koha::Cache::Memory::Lite->get_instance();
672
    my $memory_cache = Koha::Cache::Memory::Lite->get_instance();
670
    if (!$bib) {
673
    if (!$bib) {
671
        carp 'LinkBibHeadingsToAuthorities called on undefined bib record';
674
        carp 'LinkBibHeadingsToAuthorities called on undefined bib record';
Lines 693-699 sub LinkBibHeadingsToAuthorities { Link Here
693
            next;
696
            next;
694
        }
697
        }
695
698
696
        my ( $authid, $fuzzy, $match_count ) = $linker->get_link($heading);
699
        my ( $authid, $fuzzy, $match_count, $status ) = $linker->get_link($heading);
700
        if ( defined $status ) {
701
            if ($status eq 'NO_CONNECTION' or $status eq 'SERVER_NOT_FOUND') {
702
                return 0, { error => $status };
703
            }
704
            elsif ($status eq 'Z3950_SEARCH_EMPTY') {
705
                ( $authid, $fuzzy, $match_count, $status ) = $linker_default->get_link($heading);
706
            }
707
        }
697
        if ($authid) {
708
        if ($authid) {
698
            $results{ $fuzzy ? 'fuzzy' : 'linked' }
709
            $results{ $fuzzy ? 'fuzzy' : 'linked' }
699
              ->{ $heading->display_form() }++;
710
              ->{ $heading->display_form() }++;
Lines 705-711 sub LinkBibHeadingsToAuthorities { Link Here
705
            $field->delete_subfield( code => '9' ) if defined $current_link;
716
            $field->delete_subfield( code => '9' ) if defined $current_link;
706
            $field->add_subfields( '9', $authid );
717
            $field->add_subfields( '9', $authid );
707
            $num_headings_changed++;
718
            $num_headings_changed++;
708
            push(@{$results{'details'}}, { tag => $field->tag(), authid => $authid, status => 'LOCAL_FOUND'}) if $verbose;
719
            push(@{$results{'details'}}, { tag => $field->tag(), authid => $authid, status => $status || 'LOCAL_FOUND'}) if $verbose;
709
        }
720
        }
710
        else {
721
        else {
711
            my $authority_type =
722
            my $authority_type =
Lines 720-728 sub LinkBibHeadingsToAuthorities { Link Here
720
                $results{'fuzzy'}->{ $heading->display_form() }++;
731
                $results{'fuzzy'}->{ $heading->display_form() }++;
721
                push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
732
                push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
722
            }
733
            }
723
            elsif ( C4::Context->preference('AutoCreateAuthorities') ) {
734
            elsif ( !$dont_auto_create && C4::Context->preference('AutoCreateAuthorities') ) {
724
                if ( _check_valid_auth_link( $current_link, $field ) ) {
735
                if ( _check_valid_auth_link( $current_link, $field ) ) {
725
                    $results{'linked'}->{ $heading->display_form() }++;
736
                    $results{'linked'}->{ $heading->display_form() }++;
737
                    push(@{$results{'details'}}, { tag => $field->tag(), authid => $authid, status => 'UNCHANGED'}) if $verbose;
726
                } elsif ( $match_count > 1 ) {
738
                } elsif ( $match_count > 1 ) {
727
                    $results{'unlinked'}->{ $heading->display_form() }++;
739
                    $results{'unlinked'}->{ $heading->display_form() }++;
728
                    push(@{$results{'details'}}, { tag => $field->tag(), authid => undef, status => 'MULTIPLE_MATCH', auth_type => $heading->auth_type(), tag_to_report => $authority_type->auth_tag_to_report}) if $verbose;
740
                    push(@{$results{'details'}}, { tag => $field->tag(), authid => undef, status => 'MULTIPLE_MATCH', auth_type => $heading->auth_type(), tag_to_report => $authority_type->auth_tag_to_report}) if $verbose;
(-)a/C4/Linker/Z3950Server.pm (+313 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 Modern::Perl;
19
use Carp;
20
use MARC::Field;
21
use MARC::Record;
22
use C4::Context;
23
use C4::Heading;
24
use ZOOM; # For Z39.50 Searches
25
use C4::AuthoritiesMarc; # For Authority addition
26
use C4::Log; # logaction
27
use Koha::SearchEngine::Indexer;
28
29
use base qw(C4::Linker);
30
31
32
sub get_link {
33
    my $self        = shift;
34
    my $heading     = shift;
35
    my $behavior    = shift || 'default';
36
    my $search_form = $heading->search_form();
37
    my $authid;
38
    my $fuzzy = 0;
39
    my $match_count = 0;
40
    my $status = '';
41
42
    if ( $self->{'cache'}->{$search_form}->{'cached'} ) {
43
        $authid = $self->{'cache'}->{$search_form}->{'authid'};
44
        $fuzzy  = $self->{'cache'}->{$search_form}->{'fuzzy'};
45
    }else {
46
        # Look for matching authorities on the Z39.50 server
47
        unless($self->{'local_first'}) {
48
            ($authid, undef, $status) = $self->getZ3950Authority($heading);
49
            if($status eq 'Z3950_SEARCH_ERROR' or
50
               $status eq 'Z3950_QUERY_ERROR' or
51
               $status eq 'NO_CONNECTION' or
52
               $status eq 'SERVER_NOT_FOUND') {
53
                return $authid, $fuzzy, 0, $status;
54
            }
55
        }
56
        if(!$authid) {
57
            # look for matching authorities
58
            my $authorities = $heading->authorities(1);    # $skipmetadata = true
59
            $match_count = scalar @$authorities;
60
61
            if ( $behavior eq 'default' && $#{$authorities} >= 0 ) {
62
                $authid = $authorities->[0]->{'authid'};
63
            }elsif ( $behavior eq 'first' && $#{$authorities} >= 0 ) {
64
                $authid = $authorities->[0]->{'authid'};
65
                $fuzzy  = $#{$authorities} > 0;
66
            }
67
            elsif ( $behavior eq 'last' && $#{$authorities} >= 0 ) {
68
                $authid = $authorities->[ $#{$authorities} ]->{'authid'};
69
                $fuzzy  = $#{$authorities} > 0;
70
            }
71
72
            if ( !defined $authid && $self->{'broader_headings'} ) {
73
                my $field     = $heading->field();
74
                my @subfields = $field->subfields();
75
                if ( scalar @subfields > 1 ) {
76
                    pop @subfields;
77
                    $field->replace_with(
78
                        MARC::Field->new(
79
                            $field->tag,
80
                            $field->indicator(1),
81
                            $field->indicator(2),
82
                            map { $_[0] => $_[1] } @subfields
83
                        )
84
                    );
85
                    ( $authid, $fuzzy ) =
86
                      $self->get_link( C4::Heading->new_from_bib_field($field),
87
                        $behavior );
88
                }
89
            }
90
        }
91
        if($self->{'local_first'} && !$authid) {
92
            ($authid, undef, $status) = $self->getZ3950Authority($heading);
93
        }
94
95
        $self->{'cache'}->{$search_form}->{'cached'} = 1;
96
        $self->{'cache'}->{$search_form}->{'authid'} = $authid;
97
        $self->{'cache'}->{$search_form}->{'fuzzy'}  = $fuzzy;
98
    }
99
    return $self->SUPER::_handle_auth_limit($authid), $fuzzy, $match_count, $status;
100
}
101
102
sub update_cache {
103
    my $self        = shift;
104
    my $heading     = shift;
105
    my $authid      = shift;
106
    my $search_form = $heading->search_form();
107
    my $fuzzy = 0;
108
109
    $self->{'cache'}->{$search_form}->{'cached'} = 1;
110
    $self->{'cache'}->{$search_form}->{'authid'} = $authid;
111
    $self->{'cache'}->{$search_form}->{'fuzzy'}  = $fuzzy;
112
}
113
114
sub flip_heading {
115
    my $self    = shift;
116
    my $heading = shift;
117
118
    # TODO: implement
119
}
120
121
122
=head1 getZ3950Authority
123
124
  ($authid, $record, $status) = $self->getZ3950Authority($heading);
125
126
  Do a Z39.50 search for the heading using the $conn ZOOM::Connection object and the $heading Heading.
127
  The column origincode is used to check for duplicates.
128
  FIXME: Use thesaurus in search? As of Koha 3.8, the community stopped using them.
129
130
  RETURNS :
131
  $authid = the ID of the local copy of the authority record that was found. undef if nothing was found.
132
  $record = the MARC record of the found authority.
133
  $status = A string with additional informations on the search status (Z3950_CREATED, Z3950_UPDATED, Z3950_QUERY_ERROR, Z3950_SEARCH_ERROR)
134
135
=cut
136
137
sub getZ3950Authority {
138
    my $self = shift;
139
    my $heading = shift;
140
141
    # Try to find a match on the Z39.50 server if LinkerZ3950Server is set
142
    if(C4::Context->preference('LinkerZ3950Server')) {
143
        unless($self->{'conn'}) {
144
            my $sth = C4::Context->dbh->prepare("select * from z3950servers where servername=?");
145
            $sth->execute(C4::Context->preference('LinkerZ3950Server'));
146
            my $server = $sth->fetchrow_hashref or undef;
147
            $sth->finish;
148
149
            if($server) {
150
                my $options = ZOOM::Options->new();
151
                $options->option('cclfile' => C4::Context->new()->{"config"}->{"serverinfo"}->{"authorityserver"}->{"ccl2rpn"});
152
                $options->option('elementSetName', 'F');
153
                $options->option('async', 0);
154
                $options->option('databaseName', $server->{db});
155
                $options->option('user',         $server->{userid}  ) if $server->{userid};
156
                $options->option('password',     $server->{password}) if $server->{password};
157
                $options->option('preferredRecordSyntax', $server->{syntax});
158
                $self->{'conn'} = create ZOOM::Connection($options);
159
                eval{ $self->{'conn'}->connect( $server->{host}, $server->{port} ) };
160
                if($@) {
161
                    return (undef, undef, 'NO_CONNECTION');
162
                }}
163
            else {
164
                return (undef, undef, 'SERVER_NOT_FOUND');
165
            }
166
        }
167
    }
168
    else {
169
        return;
170
    }
171
    my $query =qq(Match-Heading,do-not-truncate,ext="$heading->{'search_form'}");
172
    my $zquery = eval{ ZOOM::Query::CCL2RPN->new($query, $self->{'conn'}) };
173
    if($@) {
174
        warn $query . "\n" . $@;
175
        return (undef, undef, 'Z3950_QUERY_ERROR');
176
    }
177
178
    # Try to send the search query to the server.
179
    my $rs = eval{ $self->{'conn'}->search($zquery) };
180
    if($@){
181
        warn $query . "\n" . $@;
182
        return (undef, undef, 'Z3950_SEARCH_EMPTY');
183
    }
184
185
    # If authorities are found, select the first valid one for addition in the local authority table.
186
    my $record;
187
    if($rs->size() != 0) {
188
        $record = MARC::Record::new_from_usmarc($rs->record(0)->raw());
189
    }else{
190
        return (undef, undef, 'Z3950_SEARCH_ERROR');
191
    }
192
    $rs->destroy();
193
    $zquery->destroy();
194
195
    # If a valid authority was found, add it in the local authority database.
196
    if($record) {
197
        my $dbh=C4::Context->dbh;
198
199
        my $authtypecode = C4::AuthoritiesMarc::GuessAuthTypeCode($record);
200
        my $authId;
201
202
        # Use the control number to prevent the creation of duplicate authorities.
203
        my $controlNumber = $record->field('970')->subfield('0');
204
        my $sthExist=$dbh->prepare("SELECT authid FROM auth_header WHERE origincode =?");
205
        $sthExist->execute($controlNumber) or die $sthExist->errstr;
206
        ($authId) = $sthExist->fetchrow;
207
        $sthExist->finish;
208
209
        #------------------------------------------------------------------------------------------
210
        # Corrections and verifications before insertion
211
        my $format;
212
        my $leader='     nz  a22     o  4500';# Leader for incomplete MARC21 record
213
214
        if (uc(C4::Context->preference('marcflavour')) eq 'UNIMARC') {
215
            $format= 'UNIMARCAUTH';
216
        }
217
        else {
218
            $format= 'MARC21';
219
        }
220
221
        if ($format eq "MARC21") {
222
            if (!$record->leader) {
223
                $record->leader($leader);
224
            }
225
            if (!$record->field('003')) {
226
                $record->insert_fields_ordered(
227
                        MARC::Field->new('003',C4::Context->preference('MARCOrgCode'))
228
                        );
229
            }
230
            my $time=POSIX::strftime("%Y%m%d%H%M%S",localtime);
231
            if (!$record->field('005')) {
232
                $record->insert_fields_ordered(
233
                        MARC::Field->new('005',$time.".0")
234
                        );
235
            }
236
            my $date=POSIX::strftime("%y%m%d",localtime);
237
            if (!$record->field('008')) {
238
                # Get a valid default value for field 008
239
                my $default_008 = C4::Context->preference('MARCAuthorityControlField008');
240
                if(!$default_008 or length($default_008)<34) {
241
                    $default_008 = '|| aca||aabn           | a|a     d';
242
            }
243
            else {
244
                    $default_008 = substr($default_008,0,34);
245
                }
246
                $record->insert_fields_ordered( MARC::Field->new('008',$date.$default_008) );
247
            }
248
            if (!$record->field('040')) {
249
                $record->insert_fields_ordered(
250
                    MARC::Field->new('040','','',
251
                        'a' => C4::Context->preference('MARCOrgCode'),
252
                        'c' => C4::Context->preference('MARCOrgCode')
253
                    )
254
                );
255
            }
256
        }
257
        if ($format eq "UNIMARCAUTH") {
258
            $record->leader("     nx  j22             ") unless ($record->leader());
259
            my $date=POSIX::strftime("%Y%m%d",localtime);
260
            if (my $string=$record->subfield('100',"a")){
261
                $string=~s/fre50/frey50/;
262
                $record->field('100')->update('a'=>$string);
263
            }
264
            elsif ($record->field('100')){
265
                $record->field('100')->update('a'=>$date."afrey50      ba0");
266
            } else {
267
                $record->append_fields(
268
                    MARC::Field->new('100',' ',' '
269
                        ,'a'=>$date."afrey50      ba0")
270
                );
271
            }
272
        }
273
        my ($auth_type_tag, $auth_type_subfield) = C4::AuthoritiesMarc::get_auth_type_location($authtypecode);
274
        if (!$authId and $format eq "MARC21") {
275
        # only need to do this fix when modifying an existing authority
276
            C4::AuthoritiesMarc::MARC21::fix_marc21_auth_type_location($record, $auth_type_tag, $auth_type_subfield);
277
        }
278
        if (my $field=$record->field($auth_type_tag)){
279
            $field->update($auth_type_subfield=>$authtypecode);
280
        }
281
        else {
282
            $record->add_fields($auth_type_tag,'','', $auth_type_subfield=>$authtypecode);
283
        }
284
        #------------------------------------------------------------------------------------------
285
        if ($authId) {
286
            my $sth=$dbh->prepare("UPDATE auth_header SET authtypecode=?,marc=?,marcxml=? WHERE origincode =?");
287
            eval { $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$controlNumber) or die $sth->errstr; };
288
            $sth->finish;
289
            warn "Problem with authority $controlNumber : Cannot update" if $@;
290
            return if $@;
291
292
            my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::AUTHORITIES_INDEX });
293
            $indexer->index_records($authId,'specialUpdate',"authorityserver",$record);
294
            return ($authId, $record, 'Z3950_UPDATED');
295
        }
296
        else {
297
            my $sth=$dbh->prepare("INSERT INTO auth_header (datecreated,authtypecode,marc,marcxml,origincode) VALUES (NOW(),?,?,?,?)");
298
            eval { $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$controlNumber) or die $sth->errstr; };
299
            $sth->finish;
300
            warn "Problem with authority $controlNumber : Cannot insert" if $@;
301
            my $id = $dbh->{'mysql_insertid'};
302
            return if $@;
303
304
            logaction( "AUTHORITIES", "ADD", $id, "authority" ) if C4::Context->preference("AuthoritiesLog");
305
            my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::AUTHORITIES_INDEX });
306
            $indexer->index_records($id,'specialUpdate',"authorityserver",$record);
307
            return ($id, $record, 'Z3950_CREATED');
308
        }
309
    }
310
    return ;
311
}
312
313
1;
(-)a/installer/data/mysql/atomicupdate/bug_11300.pl (+14 lines)
Line 0 Link Here
1
use Modern::Perl;
2
3
return {
4
    bug_number => "11300",
5
    description => "Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module",
6
    up => sub {
7
        my ($args) = @_;
8
        my ($dbh, $out) = @$args{qw(dbh out)};
9
10
        $dbh->do(q{INSERT IGNORE INTO systempreferences (variable, value, options, explanation, type) VALUES ('LinkerZ3950Server', '', NULL, 'Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module', 'free') });
11
12
        say $out "Added system preference 'LinkerZ3950Server'";
13
    },
14
};
(-)a/installer/data/mysql/mandatory/sysprefs.sql (+1 lines)
Lines 374-379 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
374
('LinkerModule','Default','Default|FirstMatch|LastMatch','Chooses which linker module to use (see documentation).','Choice'),
374
('LinkerModule','Default','Default|FirstMatch|LastMatch','Chooses which linker module to use (see documentation).','Choice'),
375
('LinkerOptions','','','A pipe-separated list of options for the linker.','free'),
375
('LinkerOptions','','','A pipe-separated list of options for the linker.','free'),
376
('LinkerRelink','1',NULL,'If ON the authority linker will relink headings that have previously been linked every time it runs.','YesNo'),
376
('LinkerRelink','1',NULL,'If ON the authority linker will relink headings that have previously been linked every time it runs.','YesNo'),
377
('LinkerZ3950Server','',NULL,'Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module',''),
377
('ListOwnerDesignated', NULL, NULL, 'Designated list owner at patron deletion', 'Free'),
378
('ListOwnerDesignated', NULL, NULL, 'Designated list owner at patron deletion', 'Free'),
378
('ListOwnershipUponPatronDeletion', 'delete', 'delete|transfer', 'Defines the action on their public or shared lists when patron is deleted', 'Choice'),
379
('ListOwnershipUponPatronDeletion', 'delete', 'delete|transfer', 'Defines the action on their public or shared lists when patron is deleted', 'Choice'),
379
('LoadCheckoutsTableDelay','0','','Delay before auto-loading checkouts table on checkouts screen','Integer'),
380
('LoadCheckoutsTableDelay','0','','Delay before auto-loading checkouts table on checkouts screen','Integer'),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/authorities.pref (+5 lines)
Lines 105-110 Authorities: Link Here
105
                  Default: default
105
                  Default: default
106
                  FirstMatch: "first match"
106
                  FirstMatch: "first match"
107
                  LastMatch: "last match"
107
                  LastMatch: "last match"
108
                  Z3950Server: "Z39.50 Server"
108
            - linker module for matching headings to authority records.
109
            - linker module for matching headings to authority records.
109
        -
110
        -
110
            - "Set the following options for the authority linker:"
111
            - "Set the following options for the authority linker:"
Lines 139-144 Authorities: Link Here
139
                  1: Do
140
                  1: Do
140
                  0: "Don't"
141
                  0: "Don't"
141
            - 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.
142
            - 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.
143
        -
144
            - pref: LinkerZ3950Server
145
            - class: multi
146
            - Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module :
142
        -
147
        -
143
            - pref: LinkerConsiderThesaurus
148
            - pref: LinkerConsiderThesaurus
144
              default: no
149
              default: no
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt (-2 / +19 lines)
Lines 354-359 function updateHeadingLinks(links) { Link Here
354
        var message = '';
354
        var message = '';
355
        var field_class = 'no_matching_authority_field';
355
        var field_class = 'no_matching_authority_field';
356
        switch(heading.status) {
356
        switch(heading.status) {
357
            case 'Z3950_CREATED':
358
                image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
359
                message = _("A matching authority record was found on the Z39.50 server and was imported locally.");
360
                field_class = 'matching_authority_field';
361
                break;
362
            case 'Z3950_UPDATED':
363
                image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
364
                message = _("A matching authority record was found on the Z39.50 server and a local authority was updated.");
365
                field_class = 'matching_authority_field';
366
                break;
357
            case 'LOCAL_FOUND':
367
            case 'LOCAL_FOUND':
358
                image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
368
                image = '<i class="fa fa-check subfield_status matching_authority"</i> ';
359
                message = _("A matching authority was found in the local database.");
369
                message = _("A matching authority was found in the local database.");
Lines 407-413 function AutomaticLinker() { Link Here
407
    $('#f').find('.tag').each(function() {
417
    $('#f').find('.tag').each(function() {
408
        var empty = true;
418
        var empty = true;
409
        $(this).find('.input_marceditor').each(function() {
419
        $(this).find('.input_marceditor').each(function() {
410
            if($(this).val() != '') {
420
            if(this.value != '') {
411
                empty = false;
421
                empty = false;
412
                return false;
422
                return false;
413
            }
423
            }
Lines 419-426 function AutomaticLinker() { Link Here
419
429
420
    // Get all the form values to post via AJAX
430
    // Get all the form values to post via AJAX
421
    var form_data = {};
431
    var form_data = {};
432
    var i=0;
422
    $('#f').find(':input').each(function(){
433
    $('#f').find(':input').each(function(){
423
        form_data[this.name] = $(this).val();
434
        form_data[this.name] = this.value;
424
    });
435
    });
425
    delete form_data[''];
436
    delete form_data[''];
426
437
Lines 438-443 function AutomaticLinker() { Link Here
438
                case 'UNAUTHORIZED':
449
                case 'UNAUTHORIZED':
439
                    alert(_("Error : You do not have the permissions necessary to use this functionality."));
450
                    alert(_("Error : You do not have the permissions necessary to use this functionality."));
440
                    break;
451
                    break;
452
                case 'SERVER_NOT_FOUND':
453
                    alert(_("Error : The Z39.50 server configured in the 'LinkerZ3950Server' preference was not found in the Z39.50 servers list."));
454
                    break;
455
                case 'NO_CONNECTION':
456
                    alert(_("Error : Could not connect to the Z39.50 server."));
457
                    break;
441
                case 'OK':
458
                case 'OK':
442
                    updateHeadingLinks(json.links);
459
                    updateHeadingLinks(json.links);
443
                    break;
460
                    break;
(-)a/svc/cataloguing/automatic_linker.pl (-7 / +4 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 55-61 my ( $headings_changed, $results ) = BiblioAutoLink ( Link Here
55
    1
51
    1
56
);
52
);
57
53
58
$json->{status} = 'OK';
54
if(!defined $results->{error}) {
55
    $json->{status} = 'OK';
56
}
59
$json->{links} = $results->{details} || '';
57
$json->{links} = $results->{details} || '';
60
58
61
print to_json($json);
59
print to_json($json);
62
- 

Return to bug 11300