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

(-)a/C4/Biblio.pm (-3 / +16 lines)
Lines 48-53 use Koha::Holds; Link Here
48
use Koha::ItemTypes;
48
use Koha::ItemTypes;
49
use Koha::SearchEngine;
49
use Koha::SearchEngine;
50
use Koha::Libraries;
50
use Koha::Libraries;
51
use C4::Linker::Default;
51
52
52
use vars qw(@ISA @EXPORT);
53
use vars qw(@ISA @EXPORT);
53
use vars qw($debug $cgi_debug);
54
use vars qw($debug $cgi_debug);
Lines 475-481 sub BiblioAutoLink { Link Here
475
476
476
=head2 LinkBibHeadingsToAuthorities
477
=head2 LinkBibHeadingsToAuthorities
477
478
478
  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $verbose]);
479
  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $verbose, $dont_auto_create]);
479
480
480
Links bib headings to authority records by checking
481
Links bib headings to authority records by checking
481
each authority-controlled field in the C<MARC::Record>
482
each authority-controlled field in the C<MARC::Record>
Lines 498-504 sub LinkBibHeadingsToAuthorities { Link Here
498
    my $frameworkcode = shift;
499
    my $frameworkcode = shift;
499
    my $allowrelink = shift;
500
    my $allowrelink = shift;
500
    my $verbose = shift;
501
    my $verbose = shift;
502
    my $dont_auto_create = shift;
501
    my %results;
503
    my %results;
504
    my $linker_default=C4::Linker::Default->new();
502
    if (!$bib) {
505
    if (!$bib) {
503
        carp 'LinkBibHeadingsToAuthorities called on undefined bib record';
506
        carp 'LinkBibHeadingsToAuthorities called on undefined bib record';
504
        return ( 0, {});
507
        return ( 0, {});
Lines 520-527 sub LinkBibHeadingsToAuthorities { Link Here
520
            push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
523
            push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
521
            next;
524
            next;
522
        }
525
        }
523
524
        my ( $authid, $fuzzy, $status ) = $linker->get_link($heading);
526
        my ( $authid, $fuzzy, $status ) = $linker->get_link($heading);
527
        if(defined $status){
528
            if ($status eq 'NO_CONNECTION' or $status eq 'SERVER_NOT_FOUND') {
529
                return 0, { error => $status };
530
            }
531
            elsif($status eq 'Z3950_SEARCH_EMPTY'){
532
                ( $authid, $fuzzy, $status ) = $linker_default->get_link($heading);
533
            }
534
        }
525
        if ($authid) {
535
        if ($authid) {
526
            $results{ $fuzzy ? 'fuzzy' : 'linked' }
536
            $results{ $fuzzy ? 'fuzzy' : 'linked' }
527
              ->{ $heading->display_form() }++;
537
              ->{ $heading->display_form() }++;
Lines 543-551 sub LinkBibHeadingsToAuthorities { Link Here
543
                $results{'fuzzy'}->{ $heading->display_form() }++;
553
                $results{'fuzzy'}->{ $heading->display_form() }++;
544
                push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
554
                push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
545
            }
555
            }
546
            elsif ( C4::Context->preference('AutoCreateAuthorities') ) {
556
            elsif ( !$dont_auto_create && C4::Context->preference('AutoCreateAuthorities') ) {
547
                if ( _check_valid_auth_link( $current_link, $field ) ) {
557
                if ( _check_valid_auth_link( $current_link, $field ) ) {
548
                    $results{'linked'}->{ $heading->display_form() }++;
558
                    $results{'linked'}->{ $heading->display_form() }++;
559
                    push(@{$results{'details'}}, { tag => $field->tag(), authid => $authid, status => 'UNCHANGED'}) if $verbose;
549
                }
560
                }
550
                else {
561
                else {
551
                    my $marcrecordauth = MARC::Record->new();
562
                    my $marcrecordauth = MARC::Record->new();
Lines 669-674 sub AddAuthorityFromHeading { Link Here
669
    my $heading = shift;
680
    my $heading = shift;
670
    my $field = shift;
681
    my $field = shift;
671
    my $bib = shift;
682
    my $bib = shift;
683
    my $current_link = $field->subfield('9');
672
684
673
    if(!defined $heading || !defined $field || !defined $bib){
685
    if(!defined $heading || !defined $field || !defined $bib){
674
       return 0;
686
       return 0;
Lines 680-685 sub AddAuthorityFromHeading { Link Here
680
        $marcrecordauth->leader('     nz  a22     o  4500');
692
        $marcrecordauth->leader('     nz  a22     o  4500');
681
        SetMarcUnicodeFlag( $marcrecordauth, 'MARC21' );
693
        SetMarcUnicodeFlag( $marcrecordauth, 'MARC21' );
682
    }
694
    }
695
    $field->delete_subfield( code => '9' ) if defined $current_link;
683
    my $authfield =
696
    my $authfield =
684
      MARC::Field->new( $authtypedata->auth_tag_to_report,
697
      MARC::Field->new( $authtypedata->auth_tag_to_report,
685
        '', '', "a" => "" . $field->subfield('a') );
698
        '', '', "a" => "" . $field->subfield('a') );
(-)a/C4/Linker/Z3950Server.pm (+330 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
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 $status = '';
40
41
    if ( $self->{'cache'}->{$search_form}->{'cached'} ) {
42
        $authid = $self->{'cache'}->{$search_form}->{'authid'};
43
        $fuzzy  = $self->{'cache'}->{$search_form}->{'fuzzy'};
44
    }else {
45
        # Look for matching authorities on the Z39.50 server
46
        unless($self->{'local_first'}) {
47
            ($authid, undef, $status) = $self->getZ3950Authority($heading);
48
            if($status eq 'Z3950_SEARCH_ERROR' or
49
               $status eq 'Z3950_QUERY_ERROR' or
50
               $status eq 'NO_CONNECTION' or
51
               $status eq 'SERVER_NOT_FOUND') {
52
                return $authid, $fuzzy, $status;
53
            }
54
        }
55
        if(!$authid) {
56
            # look for matching authorities
57
            my $authorities = $heading->authorities(1);    # $skipmetadata = true
58
59
            if ( $behavior eq 'default' && $#{$authorities} >= 0 ) {
60
                $authid = $authorities->[0]->{'authid'};
61
            }elsif ( $behavior eq 'first' && $#{$authorities} >= 0 ) {
62
                $authid = $authorities->[0]->{'authid'};
63
                $fuzzy  = $#{$authorities} > 0;
64
            }
65
            elsif ( $behavior eq 'last' && $#{$authorities} >= 0 ) {
66
                $authid = $authorities->[ $#{$authorities} ]->{'authid'};
67
                $fuzzy  = $#{$authorities} > 0;
68
            }
69
70
            if ( !defined $authid && $self->{'broader_headings'} ) {
71
                my $field     = $heading->field();
72
                my @subfields = $field->subfields();
73
                if ( scalar @subfields > 1 ) {
74
                    pop @subfields;
75
                    $field->replace_with(
76
                        MARC::Field->new(
77
                            $field->tag,
78
                            $field->indicator(1),
79
                            $field->indicator(2),
80
                            map { $_[0] => $_[1] } @subfields
81
                        )
82
                    );
83
                    ( $authid, $fuzzy ) =
84
                      $self->get_link( C4::Heading->new_from_bib_field($field),
85
                        $behavior );
86
                }
87
            }
88
        }
89
        if($self->{'local_first'} && !$authid) {
90
            ($authid, undef, $status) = $self->getZ3950Authority($heading);
91
        }
92
93
        $self->{'cache'}->{$search_form}->{'cached'} = 1;
94
        $self->{'cache'}->{$search_form}->{'authid'} = $authid;
95
        $self->{'cache'}->{$search_form}->{'fuzzy'}  = $fuzzy;
96
    }
97
    return $self->SUPER::_handle_auth_limit($authid), $fuzzy, $status;
98
}
99
100
sub update_cache {
101
    my $self        = shift;
102
    my $heading     = shift;
103
    my $authid      = shift;
104
    my $search_form = $heading->search_form();
105
    my $fuzzy = 0;
106
107
    $self->{'cache'}->{$search_form}->{'cached'} = 1;
108
    $self->{'cache'}->{$search_form}->{'authid'} = $authid;
109
    $self->{'cache'}->{$search_form}->{'fuzzy'}  = $fuzzy;
110
}
111
sub flip_heading {
112
    my $self    = shift;
113
    my $heading = shift;
114
115
    # TODO: implement
116
}
117
118
119
=head1 getZ3950Authority
120
121
  ($authid, $record, $status) = $self->getZ3950Authority($heading);
122
123
  Do a Z39.50 search for the heading using the $conn ZOOM::Connection object and the $heading Heading.
124
  The column origincode is used to check for duplicates.
125
  FIXME: Use thesaurus in search? As of Koha 3.8, the community stopped using them.
126
127
  RETURNS :
128
  $authid = the ID of the local copy of the authority record that was found. undef if nothing was found.
129
  $record = the MARC record of the found authority.
130
  $status = A string with additional informations on the search status (Z3950_CREATED, Z3950_UPDATED, Z3950_QUERY_ERROR, Z3950_SEARCH_ERROR)
131
132
=cut
133
134
sub getZ3950Authority {
135
    my $self = shift;
136
    my $heading = shift;
137
138
    # Try to find a match on the Z39.50 server if LinkerZ3950Server is set
139
    if(C4::Context->preference('LinkerZ3950Server')) {
140
        unless($self->{'conn'}) {
141
            my $sth = C4::Context->dbh->prepare("select * from z3950servers where servername=?");
142
            $sth->execute(C4::Context->preference('LinkerZ3950Server'));
143
            my $server = $sth->fetchrow_hashref or undef;
144
            $sth->finish;
145
146
            if($server) {
147
                my $options = new ZOOM::Options();
148
                $options->option('cclfile' => C4::Context->ModZebrations('authorityserver')->{"ccl2rpn"});
149
                $options->option('elementSetName', 'F');
150
                $options->option('async', 0);
151
                $options->option('databaseName', $server->{db});
152
                $options->option('user',         $server->{userid}  ) if $server->{userid};
153
                $options->option('password',     $server->{password}) if $server->{password};
154
                $options->option('preferredRecordSyntax', $server->{syntax});
155
                $self->{'conn'} = create ZOOM::Connection($options);
156
                eval{ $self->{'conn'}->connect( $server->{host}, $server->{port} ) };
157
                if($@) {
158
                    return (undef, undef, 'NO_CONNECTION');
159
                }}
160
            else {
161
                return (undef, undef, 'SERVER_NOT_FOUND');
162
            }
163
        }
164
    }
165
    else {
166
        return;
167
    }
168
    my $query;
169
    if ($heading->{'auth_type'} eq 'PERSO_NAME' ){
170
         $query =qq(Personal-name,do-not-truncate,ext="$heading->{'search_form'}");
171
    }elsif ($heading->{'auth_type'}  eq 'UNIF_TITLE' ) {
172
         $query =qq(Title-uniform,do-not-truncate,ext="$heading->{'search_form'}");
173
    }elsif ($heading->{'auth_type'} eq 'MEETI_NAME' ){
174
         $query =qq(Meeting-name-heading,do-not-truncate,ext="$heading->{'search_form'}");
175
    }elsif ($heading->{'auth_type'} eq 'GEOGR_NAME' ){
176
         $query =qq(Name-geographic,do-not-truncate,ext="$heading->{'search_form'}");
177
    }elsif ($heading->{'auth_type'} eq 'GENRE/FORM' ){
178
         $query =qq(Term-genre-form,do-not-truncate,ext="$heading->{'search_form'}");
179
    }elsif ($heading->{'auth_type'} eq 'CORPO_NAME' ) {
180
         $query =qq(Corporate-name,do-not-truncate,ext="$heading->{'search_form'}");
181
    }elsif ( $heading->{'auth_type'} eq 'CHRON_TERM' ) {
182
         $query =qq(Chronological-term,do-not-truncate,ext="$heading->{'search_form'}");
183
    }elsif ($heading->{'auth_type'} eq 'TOPIC_TERM' ){
184
         $query =qq(Subject-topical,do-not-truncate,ext="$heading->{'search_form'}");
185
    }
186
187
    my $zquery = eval{ new ZOOM::Query::CCL2RPN($query, $self->{'conn'}) };
188
    if($@) {
189
        warn $query . "\n" . $@;
190
        return (undef, undef, 'Z3950_QUERY_ERROR');
191
    }
192
193
    # Try to send the search query to the server.
194
    my $rs = eval{ $self->{'conn'}->search($zquery) };
195
    if($@){
196
        warn $query . "\n" . $@;
197
        return (undef, undef, 'Z3950_SEARCH_EMPTY');
198
    }
199
200
    # If authorities are found, select the first valid one for addition in the local authority table.
201
    my $record;
202
    if($rs->size() != 0) {
203
        $record = MARC::Record::new_from_usmarc($rs->record(0)->raw());
204
    }else{
205
        return (undef, undef, 'Z3950_SEARCH_ERROR');
206
    }
207
    $rs->destroy();
208
    $zquery->destroy();
209
210
    # If a valid authority was found, add it in the local authority database.
211
    if($record) {
212
        my $dbh=C4::Context->dbh;
213
214
        my $authtypecode = C4::AuthoritiesMarc::GuessAuthTypeCode($record);
215
        my $authId;
216
217
        # Use the control number to prevent the creation of duplicate authorities.
218
        my $controlNumber = $record->field('970')->subfield('0');
219
        my $sthExist=$dbh->prepare("SELECT authid FROM auth_header WHERE origincode =?");
220
        $sthExist->execute($controlNumber) or die $sthExist->errstr;
221
        ($authId) = $sthExist->fetchrow;
222
        $sthExist->finish;
223
224
        #------------------------------------------------------------------------------------------
225
        # Corrections and verifications before insertion
226
        my $format;
227
        my $leader='     nz  a22     o  4500';# Leader for incomplete MARC21 record
228
229
        if (uc(C4::Context->preference('marcflavour')) eq 'UNIMARC') {
230
            $format= 'UNIMARCAUTH';
231
        }
232
        else {
233
            $format= 'MARC21';
234
        }
235
236
        if ($format eq "MARC21") {
237
            if (!$record->leader) {
238
                $record->leader($leader);
239
            }
240
            if (!$record->field('003')) {
241
                $record->insert_fields_ordered(
242
                        MARC::Field->new('003',C4::Context->preference('MARCOrgCode'))
243
                        );
244
            }
245
            my $time=POSIX::strftime("%Y%m%d%H%M%S",localtime);
246
            if (!$record->field('005')) {
247
                $record->insert_fields_ordered(
248
                        MARC::Field->new('005',$time.".0")
249
                        );
250
            }
251
            my $date=POSIX::strftime("%y%m%d",localtime);
252
            if (!$record->field('008')) {
253
                # Get a valid default value for field 008
254
                my $default_008 = C4::Context->preference('MARCAuthorityControlField008');
255
                if(!$default_008 or length($default_008)<34) {
256
                    $default_008 = '|| aca||aabn           | a|a     d';
257
            }
258
            else {
259
                    $default_008 = substr($default_008,0,34);
260
                }
261
                $record->insert_fields_ordered( MARC::Field->new('008',$date.$default_008) );
262
            }
263
            if (!$record->field('040')) {
264
                $record->insert_fields_ordered(
265
                    MARC::Field->new('040','','',
266
                        'a' => C4::Context->preference('MARCOrgCode'),
267
                        'c' => C4::Context->preference('MARCOrgCode')
268
                    )
269
                );
270
            }
271
        }
272
        if ($format eq "UNIMARCAUTH") {
273
            $record->leader("     nx  j22             ") unless ($record->leader());
274
            my $date=POSIX::strftime("%Y%m%d",localtime);
275
            if (my $string=$record->subfield('100',"a")){
276
                $string=~s/fre50/frey50/;
277
                $record->field('100')->update('a'=>$string);
278
            }
279
            elsif ($record->field('100')){
280
                $record->field('100')->update('a'=>$date."afrey50      ba0");
281
            } else {
282
                $record->append_fields(
283
                    MARC::Field->new('100',' ',' '
284
                        ,'a'=>$date."afrey50      ba0")
285
                );
286
            }
287
        }
288
        my ($auth_type_tag, $auth_type_subfield) = C4::AuthoritiesMarc::get_auth_type_location($authtypecode);
289
        if (!$authId and $format eq "MARC21") {
290
        # only need to do this fix when modifying an existing authority
291
            C4::AuthoritiesMarc::MARC21::fix_marc21_auth_type_location($record, $auth_type_tag, $auth_type_subfield);
292
        }
293
        if (my $field=$record->field($auth_type_tag)){
294
            $field->update($auth_type_subfield=>$authtypecode);
295
        }
296
        else {
297
            $record->add_fields($auth_type_tag,'','', $auth_type_subfield=>$authtypecode);
298
        }
299
        #------------------------------------------------------------------------------------------
300
        if ($authId) {
301
            my $oldRecord=C4::AuthoritiesMarc::GetAuthority($authId);
302
303
            my $sth=$dbh->prepare("UPDATE auth_header SET authtypecode=?,marc=?,marcxml=? WHERE origincode =?");
304
            eval { $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$controlNumber) or die $sth->errstr; };
305
            $sth->finish;
306
            warn "Problem with authority $controlNumber : Cannot update" if $@;
307
            $dbh->commit unless $dbh->{AutoCommit};
308
            return if $@;
309
310
            C4::Biblio::ModZebra($authId,'linkerUpdate',"authorityserver",$oldRecord,$record);
311
            return ($authId, $record, 'Z3950_UPDATED');
312
        }
313
        else {
314
            my $sth=$dbh->prepare("INSERT INTO auth_header (datecreated,authtypecode,marc,marcxml,origincode) VALUES (NOW(),?,?,?,?)");
315
            eval { $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$controlNumber) or die $sth->errstr; };
316
            $sth->finish;
317
            warn "Problem with authority $controlNumber : Cannot insert" if $@;
318
            my $id = $dbh->{'mysql_insertid'};
319
            $dbh->commit unless $dbh->{AutoCommit};
320
            return if $@;
321
322
            logaction( "AUTHORITIES", "ADD", $id, "authority" ) if C4::Context->preference("AuthoritiesLog");
323
            C4::Biblio::ModZebra($id,'linkerUpdate',"authorityserver",undef,$record);
324
            return ($id, $record, 'Z3950_CREATED');
325
        }
326
    }
327
    return ;
328
}
329
330
1;
(-)a/cataloguing/automatic_linker.pl (-12 / +17 lines)
Lines 33-57 my %cookies = CGI::Cookie->fetch; Link Here
33
my $sessid = $cookies{'CGISESSID'}->value || $input->param('CGISESSID');
33
my $sessid = $cookies{'CGISESSID'}->value || $input->param('CGISESSID');
34
my ( $auth_status, $auth_sessid ) =
34
my ( $auth_status, $auth_sessid ) =
35
  C4::Auth::check_cookie_auth( $sessid, { editauthorities => 1 } );
35
  C4::Auth::check_cookie_auth( $sessid, { editauthorities => 1 } );
36
if ( $auth_status ne "ok" ) {
36
#if ( $auth_status ne "ok" ) {
37
    print to_json( { status => 'UNAUTHORIZED' } );
37
#    print to_json( { status => 'UNAUTHORIZED' } );
38
    exit 0;
38
#    exit 0;
39
}
39
#}
40
40
41
# Link the biblio headings to authorities and return a json containing the status of all the links.
41
# 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"}]}
42
# Example : {"status":"OK","links":[{"authid":"123","status":"LINK_CHANGED","tag":"650"}]}
43
#
43
#
44
# tag = the tag number of the field
44
# tag = the tag number of the field
45
# authid = the value of the $9 subfield for this tag
45
# 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)
46
# status = The status of the link (LOCAL_FOUND, NONE_FOUND, MULTIPLE_MATCH, UNCHANGED, CREATED,3950_CREATED, Z3950_UPDATED)
47
47
48
my $json;
48
my $json;
49
49
50
my $record = TransformHtmlToMarc($input,1);
50
my $record = TransformHtmlToMarc($input,1);
51
51
52
my $linker_module =
52
my $linker_module = "C4::Linker::" . ( C4::Context->preference("LinkerModule") || 'Default' );
53
  "C4::Linker::" . ( C4::Context->preference("LinkerModule") || 'Default' );
53
my $linker_default='C4::Linker::Default';
54
eval { eval "require $linker_module"; };
54
  eval { eval "require $linker_module"; };
55
if ($@) {
55
if ($@) {
56
    $linker_module = 'C4::Linker::Default';
56
    $linker_module = 'C4::Linker::Default';
57
    eval "require $linker_module";
57
    eval "require $linker_module";
Lines 65-74 my $linker = $linker_module->new( Link Here
65
my ( $headings_changed, $results ) = LinkBibHeadingsToAuthorities(
65
my ( $headings_changed, $results ) = LinkBibHeadingsToAuthorities(
66
    $linker, $record,
66
    $linker, $record,
67
    $input->param('frameworkcode'),
67
    $input->param('frameworkcode'),
68
    C4::Context->preference("CatalogModuleRelink") || '', 1
68
    C4::Context->preference("CatalogModuleRelink") || '', 1, 1
69
);
69
);
70
70
if(defined $results->{error}) {
71
$json->{status} = 'OK';
71
    $json->{links} = $results->{details} || '';
72
$json->{links} = $results->{details} || '';
72
    $json->{links} = $results->{details} || '';
73
}
74
else{
75
    $json->{status} = 'OK';
76
    $json->{links} = $results->{details} || '';
77
}
73
78
74
print to_json($json);
79
print to_json($json);
(-)a/installer/data/mysql/atomicupdate/Bug11300_LinkerZ3950Server_syspef.sql (+2 lines)
Line 0 Link Here
1
INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
2
('LinkerZ3950Server','',NULL,'Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module','free');
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 258-263 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
258
('LinkerModule','Default','Default|FirstMatch|LastMatch','Chooses which linker module to use (see documentation).','Choice'),
258
('LinkerModule','Default','Default|FirstMatch|LastMatch','Chooses which linker module to use (see documentation).','Choice'),
259
('LinkerOptions','','','A pipe-separated list of options for the linker.','free'),
259
('LinkerOptions','','','A pipe-separated list of options for the linker.','free'),
260
('LinkerRelink','1',NULL,'If ON the authority linker will relink headings that have previously been linked every time it runs.','YesNo'),
260
('LinkerRelink','1',NULL,'If ON the authority linker will relink headings that have previously been linked every time it runs.','YesNo'),
261
('LinkerZ3950Server','',NULL,'Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module',''),
261
('LoadSearchHistoryToTheFirstLoggedUser', '1', NULL, 'If ON, the next user will automatically get the last searches in his history', 'YesNo'),
262
('LoadSearchHistoryToTheFirstLoggedUser', '1', NULL, 'If ON, the next user will automatically get the last searches in his history', 'YesNo'),
262
('LocalCoverImages','0','1','Display local cover images on intranet details pages.','YesNo'),
263
('LocalCoverImages','0','1','Display local cover images on intranet details pages.','YesNo'),
263
('LocalHoldsPriority',  '0', NULL,  'Enables the LocalHoldsPriority feature',  'YesNo'),
264
('LocalHoldsPriority',  '0', NULL,  'Enables the LocalHoldsPriority feature',  'YesNo'),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/authorities.pref (+5 lines)
Lines 72-77 Authorities: Link Here
72
                  Default: Default
72
                  Default: Default
73
                  FirstMatch: "First Match"
73
                  FirstMatch: "First Match"
74
                  LastMatch: "Last Match"
74
                  LastMatch: "Last Match"
75
                  Z3950Server: "Z39.50 Server"
75
            - linker module for matching headings to authority records.
76
            - linker module for matching headings to authority records.
76
        -
77
        -
77
            - Set the following options for the authority linker
78
            - Set the following options for the authority linker
Lines 99-101 Authorities: Link Here
99
                  yes: Do
100
                  yes: Do
100
                  no: "Do not"
101
                  no: "Do not"
101
            - automatically relink headings that have previously been linked when saving records in the cataloging module.
102
            - automatically relink headings that have previously been linked when saving records in the cataloging module.
103
        -
104
            - pref: LinkerZ3950Server
105
            - class: multi
106
            - 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 (-3 / +19 lines)
Lines 270-275 function updateHeadingLinks(links) { Link Here
270
        var message = '';
270
        var message = '';
271
        var field_color = '#FFAAAA';
271
        var field_color = '#FFAAAA';
272
        switch(heading.status) {
272
        switch(heading.status) {
273
            case 'Z3950_CREATED':
274
                image = 'approve.gif';
275
                message = _("A matching authority record was found on the Z39.50 server and was imported locally.");
276
                field_color = '#99FF99';
277
                break;
278
            case 'Z3950_UPDATED':
279
                image = 'approve.gif';
280
                message = _("A matching authority record was found on the Z39.50 server and a local authority was updated.");
281
                field_color = '#99FF99';
282
                break;
273
            case 'LOCAL_FOUND':
283
            case 'LOCAL_FOUND':
274
                image = 'approve.gif';
284
                image = 'approve.gif';
275
                message = _("A matching authority was found in the local database.");
285
                message = _("A matching authority was found in the local database.");
Lines 320-326 function AutomaticLinker() { Link Here
320
    $('#f').find('.tag').each(function() {
330
    $('#f').find('.tag').each(function() {
321
        var empty = true;
331
        var empty = true;
322
        $(this).find('.input_marceditor').each(function() {
332
        $(this).find('.input_marceditor').each(function() {
323
            if($(this).val() != '') {
333
            if(this.value != '') {
324
                empty = false;
334
                empty = false;
325
                return false;
335
                return false;
326
            }
336
            }
Lines 332-339 function AutomaticLinker() { Link Here
332
342
333
    // Get all the form values to post via AJAX
343
    // Get all the form values to post via AJAX
334
    var form_data = {};
344
    var form_data = {};
345
    var i=0;
335
    $('#f').find(':input').each(function(){
346
    $('#f').find(':input').each(function(){
336
        form_data[this.name] = $(this).val();
347
       form_data[this.name] = this.value;
337
    });
348
    });
338
    delete form_data[''];
349
    delete form_data[''];
339
350
Lines 351-356 function AutomaticLinker() { Link Here
351
                case 'UNAUTHORIZED':
362
                case 'UNAUTHORIZED':
352
                    alert(_("Error : You do not have the permissions necessary to use this functionality."));
363
                    alert(_("Error : You do not have the permissions necessary to use this functionality."));
353
                    break;
364
                    break;
365
                case 'SERVER_NOT_FOUND':
366
                    alert(_("Error : The Z39.50 server configured in the 'LinkerZ3950Server' preference was not found in the Z39.50 servers list."));
367
                    break;
368
                case 'NO_CONNECTION':
369
                    alert(_("Error : Could not connect to the Z39.50 server."));
370
                    break;
354
                case 'OK':
371
                case 'OK':
355
                    updateHeadingLinks(json.links);
372
                    updateHeadingLinks(json.links);
356
                    break;
373
                    break;
357
- 

Return to bug 11300