Lines 9-14
use Unicode::Normalize;
Link Here
|
9 |
use CGI::Session; |
9 |
use CGI::Session; |
10 |
use Koha::SearchEngine::Elasticsearch::Browse; |
10 |
use Koha::SearchEngine::Elasticsearch::Browse; |
11 |
|
11 |
|
|
|
12 |
use Koha::Items; |
13 |
use C4::Context; |
14 |
use C4::Biblio qw ( GetMarcBiblio ); |
15 |
|
12 |
my $browser = Koha::SearchEngine::Elasticsearch::Browse->new( { index => 'biblios' } ); |
16 |
my $browser = Koha::SearchEngine::Elasticsearch::Browse->new( { index => 'biblios' } ); |
13 |
my $cgi = CGI->new; |
17 |
my $cgi = CGI->new; |
14 |
my $session = CGI::Session->load() or die CGI::Session->errstr(); |
18 |
my $session = CGI::Session->load() or die CGI::Session->errstr(); |
Lines 33-44
if ($session->param("key") eq "autocomplete") {
Link Here
|
33 |
#search by many prefix fields |
37 |
#search by many prefix fields |
34 |
if ($length > 1){ |
38 |
if ($length > 1){ |
35 |
my $res = $browser->autocomplete_idx($ses, \@prefix, $session->param("analyzer"), $session->param("token_counter")); |
39 |
my $res = $browser->autocomplete_idx($ses, \@prefix, $session->param("analyzer"), $session->param("token_counter")); |
|
|
40 |
|
41 |
if (C4::Context->preference('OpacSuppression') || C4::Context->yaml_preference('OpacHiddenItems')) { |
42 |
my @prefix = $res->{ "prefix" }; |
43 |
@prefix = split(',', $prefix[0]); |
44 |
|
45 |
for (my $i = 0; $i < scalar @prefix; $i++) { |
46 |
filterAutocomplete($res->{ $i }->{ 'hits' }); |
47 |
} |
48 |
} |
49 |
|
36 |
print $cgi->header("application/json"); |
50 |
print $cgi->header("application/json"); |
37 |
print to_json($res); |
51 |
print to_json($res); |
38 |
} |
52 |
} |
39 |
#search by one prefix field |
53 |
#search by one prefix field |
40 |
elsif ($length == 1) { |
54 |
elsif ($length == 1) { |
41 |
my $res = $browser->autocomplete_one_idx($ses, $prefix[0], $session->param("analyzer"), $session->param("token_counter")); |
55 |
my $res = $browser->autocomplete_one_idx($ses, $prefix[0], $session->param("analyzer"), $session->param("token_counter")); |
|
|
56 |
|
57 |
if (C4::Context->preference('OpacSuppression') || C4::Context->yaml_preference('OpacHiddenItems')) { |
58 |
filterAutocomplete($res->{ 'hits' }); |
59 |
} |
60 |
|
42 |
print $cgi->header("application/json"); |
61 |
print $cgi->header("application/json"); |
43 |
print to_json($res); |
62 |
print to_json($res); |
44 |
} |
63 |
} |
Lines 52-57
if ($iskey == 0) {
Link Here
|
52 |
response404JSON(); |
71 |
response404JSON(); |
53 |
} |
72 |
} |
54 |
|
73 |
|
|
|
74 |
sub filterAutocomplete { |
75 |
my $hits = $_[0]; |
76 |
my $hitlist = $hits->{ "hits" }; |
77 |
if (@{$hitlist}) { |
78 |
# Remove item inside hits in elasticsearch response if the item has |
79 |
# marc field 942$n set to true and OpacSuppression preference on |
80 |
if (C4::Context->preference('OpacSuppression')) { |
81 |
for ( my $i = 0; $i < scalar @{$hitlist}; $i++ ) { |
82 |
my $record = GetMarcBiblio({ |
83 |
biblionumber => $hitlist->[$i]->{ "_id" }, |
84 |
opac => 1 |
85 |
}); |
86 |
my $opacsuppressionfield = '942'; |
87 |
my $opacsuppressionfieldvalue = $record->field($opacsuppressionfield); |
88 |
if ( $opacsuppressionfieldvalue && |
89 |
$opacsuppressionfieldvalue->subfield("n") && |
90 |
$opacsuppressionfieldvalue->subfield("n") == 1) { |
91 |
# if OPAC suppression by IP address |
92 |
if (C4::Context->preference('OpacSuppressionByIPRange')) { |
93 |
my $IPAddress = $ENV{'REMOTE_ADDR'}; |
94 |
my $IPRange = C4::Context->preference('OpacSuppressionByIPRange'); |
95 |
if ($IPAddress !~ /^$IPRange/) { |
96 |
splice(@{$hitlist}, $i, 1); |
97 |
$i--; |
98 |
$hits->{ "total" }--; |
99 |
} |
100 |
} else { |
101 |
splice(@{$hitlist}, $i, 1); |
102 |
$i--; |
103 |
$hits->{ "total" }--; |
104 |
} |
105 |
} |
106 |
} |
107 |
} |
108 |
# Remove item inside hits in elasticsearch response if the item is |
109 |
# declared hidden in OPACHiddenItems preference |
110 |
if (C4::Context->yaml_preference('OpacHiddenItems')) { |
111 |
my @biblionumbers; |
112 |
foreach (@{$hitlist}) { |
113 |
push(@biblionumbers, $_->{ "_id" }); |
114 |
} |
115 |
my $autocomplete_items = Koha::Items->search({ |
116 |
biblionumber => { -in => \@biblionumbers } |
117 |
}); |
118 |
my $filtered_items = $autocomplete_items->filter_by_visible_in_opac({ |
119 |
patron => undef |
120 |
}); |
121 |
for ( my $i = 0; $i < scalar @{$hitlist}; $i++ ) { |
122 |
my $item = $filtered_items->find({ |
123 |
biblionumber => $hitlist->[$i]->{ "_id" } |
124 |
}); |
125 |
if (!$item) { |
126 |
splice(@{$hitlist}, $i, 1); |
127 |
$i--; |
128 |
$hits->{ "total" }--; |
129 |
} |
130 |
} |
131 |
} |
132 |
# Adjust the max_score inside hits in elasticsearch response |
133 |
my $maxscore = 0; |
134 |
foreach ( @{$hitlist} ) { |
135 |
my $score = $_->{"_score"}; |
136 |
$maxscore = $score if ($maxscore < $score); |
137 |
} |
138 |
if ($maxscore == 0) { |
139 |
$hits->{ "max_score" } = undef; |
140 |
} else { |
141 |
$hits->{ "max_score" } = $maxscore; |
142 |
} |
143 |
} |
144 |
} |
145 |
|
55 |
sub response404JSON { |
146 |
sub response404JSON { |
56 |
my $res = CGI->new; |
147 |
my $res = CGI->new; |
57 |
my $json = JSON->new->utf8; |
148 |
my $json = JSON->new->utf8; |
58 |
- |
|
|