Koha/opac/opac-suggestions.pl
Alex Buckley 9c999293ef
Bug 31333: (follow-up) Handle anonymous patrons making suggestions
Test plan:
1. Enable suggestion & AnonSuggestions sysprefs and set AnonymousPatron = 1
2. Visit the OPAC without logging in
3. Confirm you can successfully create a suggestion from:
- Item detail page
- Search result page
- Masthead under the 'Library catalogue' search box
4. Disable the AnonSuggestions syspref
5. Confirm you cannot see links to make purchase suggestions on the
following pages:
- Item detail page
- Search result page
- Masthead under the 'Library catalogue' search box
6. Confirm if you try visiting /cgi-bin/koha/opac-suggestions.pl page
you are re-directed to a login page
7. Select the category of your user in the suggestionPatronCategoryExceptions syspref
8. Log into the OPAC
9. Confirm you cannot see links to make purchase suggestions on the
following pages:
- Item detail page
- Search result page
- Masthead under the 'Library catalogue' search box
- opac-user.pl ('Your summary') page
10. Confirm if you try visiting /cgi-bin/koha/opac-suggestions.pl page
you are re-directed to a 404 error page
11. Enable AnonSuggestions syspref
12. Confirm you can successfully create a suggestion from:
- Item detail page
- Search result page
- Masthead under the 'Library catalogue' search box
- opac-user.pl ('Your summary') page
13. Disable AnonSuggestions syspref and un-check your category from
suggestionPatronCategoryExeptions syspref
14. Confirm you can create a suggestion from:
- Item detail page
- Search result page
- Masthead under the 'Library catalogue' search box
- opac-user.pl ('Your summary') page

Sponsored-by: Catalyst IT, New Zealand

Signed-off-by: Owen Leonard <oleonard@myacpl.org>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2022-10-04 08:44:26 -03:00

284 lines
10 KiB
Perl
Executable file

#!/usr/bin/perl
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use CGI qw ( -utf8 );
use Encode;
use C4::Auth qw( get_template_and_user );
use C4::Members;
use C4::Koha qw( GetAuthorisedValues );
use C4::Output qw( output_html_with_http_headers );
use C4::Suggestions qw(
DelSuggestion
MarcRecordFromNewSuggestion
NewSuggestion
);
use C4::Koha qw( GetAuthorisedValues );
use C4::Scrubber;
use C4::Search qw( FindDuplicate );
use Koha::AuthorisedValues;
use Koha::Libraries;
use Koha::Patrons;
use Koha::DateUtils qw( dt_from_string );
my $input = CGI->new;
my $op = $input->param('op') || 'else';
my $biblionumber = $input->param('biblionumber');
my $negcaptcha = $input->param('negcap');
my $suggested_by_anyone = $input->param('suggested_by_anyone') || 0;
my $title_filter = $input->param('title_filter');
my $need_confirm = 0;
my $suggestion = {
biblionumber => scalar $input->param('biblionumber'),
title => scalar $input->param('title'),
author => scalar $input->param('author'),
copyrightdate => scalar $input->param('copyrightdate'),
isbn => scalar $input->param('isbn'),
publishercode => scalar $input->param('publishercode'),
collectiontitle => scalar $input->param('collectiontitle'),
place => scalar $input->param('place'),
quantity => scalar $input->param('quantity'),
itemtype => scalar $input->param('itemtype'),
branchcode => scalar $input->param('branchcode'),
patronreason => scalar $input->param('patronreason'),
note => scalar $input->param('note'),
};
# If a spambot accidentally populates the 'negcap' field in the sugesstions form, then silently skip and return.
if ($negcaptcha ) {
print $input->redirect("/cgi-bin/koha/opac-suggestions.pl");
exit;
}
my ( $template, $borrowernumber, $cookie, @messages );
my $deleted = $input->param('deleted');
my $submitted = $input->param('submitted');
if ( ( C4::Context->preference("AnonSuggestions") and Koha::Patrons->find( C4::Context->preference("AnonymousPatron") ) ) or ( C4::Context->preference("OPACViewOthersSuggestions") and $op eq 'else' ) ) {
( $template, $borrowernumber, $cookie ) = get_template_and_user(
{
template_name => "opac-suggestions.tt",
query => $input,
type => "opac",
authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
}
);
}
else {
( $template, $borrowernumber, $cookie ) = get_template_and_user(
{
template_name => "opac-suggestions.tt",
query => $input,
type => "opac",
}
);
}
# If suggestions are turned off, or this patron belongs to a category not allowed to make suggestions (suggestionPatronCategoryExceptions syspref) we redirect to 404 error. This will also redirect guest suggestions
if ( defined $borrowernumber && !C4::Context->preference('AnonSuggestions') ) {
if ( (!Koha::Patrons->find( $borrowernumber )->category->can_make_suggestions) ) {
print $input->redirect("/cgi-bin/koha/errors/404.pl");
exit;
}
}
my $suggested_by;
if ( $op eq 'else' ) {
if ( C4::Context->preference("OPACViewOthersSuggestions") ) {
if ( $borrowernumber ) {
# A logged in user is able to see suggestions from others
$suggested_by = $suggested_by_anyone
? undef
: $borrowernumber;
}
# else: Non logged in user is able to see all suggestions
}
else {
if ( $borrowernumber ) {
$suggested_by = $borrowernumber;
}
else {
$suggested_by = -1;
}
}
} else {
if ( $borrowernumber ) {
$suggested_by = $borrowernumber;
}
else {
$suggested_by = C4::Context->preference("AnonymousPatron");
}
}
$suggestion = {
map {
my $p = $suggestion->{$_};
# Keep parameters that are not an empty string
( defined $p && $p ne '' ? ( $_ => $p ) : () )
} keys %$suggestion
};
$suggestion->{suggestedby} = $borrowernumber;
if ( $op eq "add_validate" && not $biblionumber ) { # If we are creating the suggestion from an existing record we do not want to search for duplicates
$op = 'add_confirm';
my $biblio = MarcRecordFromNewSuggestion($suggestion);
if ( my ($duplicatebiblionumber, $duplicatetitle) = FindDuplicate($biblio) ) {
push @messages, { type => 'error', code => 'biblio_exists', id => $duplicatebiblionumber, title => $duplicatetitle };
$need_confirm = 1;
$op = 'add';
}
}
my $patrons_pending_suggestions_count = 0;
my $patrons_total_suggestions_count = 0;
if ( $borrowernumber ){
if ( C4::Context->preference("MaxTotalSuggestions") ne '' && C4::Context->preference("NumberOfSuggestionDays") ne '' ) {
my $suggesteddate_from = dt_from_string()->subtract(days=>C4::Context->preference("NumberOfSuggestionDays"));
$patrons_total_suggestions_count = Koha::Suggestions->search({ suggestedby => $borrowernumber, suggesteddate => { '>=' => $suggesteddate_from } })->count;
}
if ( C4::Context->preference("MaxOpenSuggestions") ne '' ) {
$patrons_pending_suggestions_count = Koha::Suggestions->search({ suggestedby => $borrowernumber, STATUS => 'ASKED' } )->count ;
}
}
if ( $op eq "add_confirm" ) {
my $suggestions = Koha::Suggestions->search($suggestion);
if ( C4::Context->preference("MaxTotalSuggestions") ne '' && $patrons_total_suggestions_count >= C4::Context->preference("MaxTotalSuggestions") )
{
push @messages, { type => 'error', code => 'total_suggestions' };
}
elsif ( C4::Context->preference("MaxOpenSuggestions") ne '' && $patrons_pending_suggestions_count >= C4::Context->preference("MaxOpenSuggestions") ) #only check limit for signed in borrowers
{
push @messages, { type => 'error', code => 'too_many' };
}
elsif ( $suggestions->count >= 1 ) {
#some suggestion are answering the request Donot Add
while ( my $suggestion = $suggestions->next ) {
push @messages,
{
type => 'error',
code => 'already_exists',
id => $suggestion->suggestionid
};
last;
}
}
else {
for my $f ( split(/\s*\,\s*/, C4::Context->preference("OPACSuggestionUnwantedFields") ) ) {
delete $suggestion->{$f};
}
my $scrubber = C4::Scrubber->new();
foreach my $suggest ( keys %$suggestion ) {
# Don't know why the encode is needed for Perl v5.10 here
$suggestion->{$suggest} = Encode::encode( "utf8",
$scrubber->scrub( $suggestion->{$suggest} ) );
}
$suggestion->{suggesteddate} = dt_from_string;
$suggestion->{branchcode} = $input->param('branchcode') || C4::Context->userenv->{"branch"};
$suggestion->{STATUS} = 'ASKED';
&NewSuggestion($suggestion);
$patrons_pending_suggestions_count++;
$patrons_total_suggestions_count++;
push @messages, { type => 'info', code => 'success_on_inserted' };
}
$op = 'else';
}
my $suggestions = [ Koha::Suggestions->search_limited(
{
$suggestion->{suggestedby}
? ( suggestedby => $suggestion->{suggestedby} )
: (),
$title_filter
? ( title => $title_filter )
: (),
}
)->as_list ];
if ( $op eq "delete_confirm" ) {
my @delete_field = $input->multi_param("delete_field");
foreach my $delete_field (@delete_field) {
&DelSuggestion( $borrowernumber, $delete_field );
}
$op = 'else';
print $input->redirect("/cgi-bin/koha/opac-suggestions.pl?op=else");
exit;
}
my $patron_reason_loop = GetAuthorisedValues("OPAC_SUG", "opac");
my @mandatoryfields;
if ( $op eq 'add' ) {
my $fldsreq_sp = C4::Context->preference("OPACSuggestionMandatoryFields") || 'title';
@mandatoryfields = sort split(/\s*\|\s*/, $fldsreq_sp);
foreach (@mandatoryfields) {
$template->param( $_."_required" => 1);
}
if ( $biblionumber ) {
my $biblio = Koha::Biblios->find($biblionumber);
$suggestion = {
biblionumber => $biblio->biblionumber,
title => $biblio->title,
author => $biblio->author,
copyrightdate => $biblio->copyrightdate,
isbn => $biblio->biblioitem->isbn,
publishercode => $biblio->biblioitem->publishercode,
collectiontitle => $biblio->biblioitem->collectiontitle,
place => $biblio->biblioitem->place,
};
}
}
my @unwantedfields;
{
last unless ($op eq 'add');
my $fldsreq_sp = C4::Context->preference("OPACSuggestionUnwantedFields");
@unwantedfields = sort split(/\s*\|\s*/, $fldsreq_sp);
foreach (@unwantedfields) {
$template->param( $_."_hidden" => 1);
}
}
$template->param(
%$suggestion,
suggestions => $suggestions,
patron_reason_loop => $patron_reason_loop,
"op_$op" => 1,
$op => 1,
messages => \@messages,
suggestionsview => 1,
suggested_by_anyone => $suggested_by_anyone,
title_filter => $title_filter,
patrons_pending_suggestions_count => $patrons_pending_suggestions_count,
need_confirm => $need_confirm,
patrons_total_suggestions_count => $patrons_total_suggestions_count,
);
output_html_with_http_headers $input, $cookie, $template->output, undef, { force_no_caching => 1 };