X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=opac%2Fopac-suggestions.pl;h=19493aae99d328218f9e326f2d02cfb954a9b756;hb=1b13c453e20e47c5e25bd946b50dd3838e29c3ce;hp=15eebf914459790806b37634a3f6c0603c4178e7;hpb=ef8171ba425f766b67d9e139194b6a8d570e301e;p=koha.git diff --git a/opac/opac-suggestions.pl b/opac/opac-suggestions.pl index 15eebf9144..19493aae99 100755 --- a/opac/opac-suggestions.pl +++ b/opac/opac-suggestions.pl @@ -2,113 +2,183 @@ # 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 2 of the License, or (at your option) any later -# version. +# 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. +# 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, write to the Free Software Foundation, Inc., 59 Temple Place, -# Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . use strict; use warnings; -use CGI; +use CGI qw ( -utf8 ); +use Encode qw( encode ); use C4::Auth; # get_template_and_user use C4::Members; -use C4::Branch; use C4::Koha; use C4::Output; use C4::Suggestions; use C4::Koha; -use C4::Dates; +use C4::Scrubber; + +use Koha::AuthorisedValues; +use Koha::Libraries; +use Koha::Patrons; + +use Koha::DateUtils qw( dt_from_string ); my $input = new CGI; -my $allsuggestions = $input->param('showall'); my $op = $input->param('op'); my $suggestion = $input->Vars; -delete $$suggestion{$_} foreach qw; +my $negcaptcha = $input->param('negcap'); +my $suggested_by_anyone = $input->param('suggested_by_anyone') || 0; + +# 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; +} else { + # don't pass 'negcap' column to DB, else DBI::Class will error + # DBIx::Class::Row::store_column(): No such column 'negcap' on Koha::Schema::Result::Suggestion at Koha/C4/Suggestions.pm + delete $suggestion->{negcap}; +} + +#If suggestions are turned off we redirect to 404 error. This will also redirect guest suggestions +if ( ! C4::Context->preference('suggestion') ) { + print $input->redirect("/cgi-bin/koha/errors/404.pl"); + exit; +} + +delete $suggestion->{$_} foreach qw; $op = 'else' unless $op; -my ( $template, $borrowernumber, $cookie ); +my ( $template, $borrowernumber, $cookie, @messages ); my $deleted = $input->param('deleted'); my $submitted = $input->param('submitted'); -if ( C4::Context->preference("AnonSuggestions") ) { +if ( C4::Context->preference("AnonSuggestions") or ( C4::Context->preference("OPACViewOthersSuggestions") and $op eq 'else' ) ) { ( $template, $borrowernumber, $cookie ) = get_template_and_user( { - template_name => "opac-suggestions.tmpl", + template_name => "opac-suggestions.tt", query => $input, type => "opac", authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ), } ); - if ( !$$suggestion{suggestedby} ) { - $$suggestion{suggestedby} = C4::Context->preference("AnonymousPatron"); - } } else { ( $template, $borrowernumber, $cookie ) = get_template_and_user( { - template_name => "opac-suggestions.tmpl", + template_name => "opac-suggestions.tt", query => $input, type => "opac", authnotrequired => 0, } ); } -if ($allsuggestions){ - delete $$suggestion{suggestedby}; + +if ( $op eq 'else' ) { + if ( C4::Context->preference("OPACViewOthersSuggestions") ) { + if ( $borrowernumber ) { + # A logged in user is able to see suggestions from others + $suggestion->{suggestedby} = $suggested_by_anyone + ? undef + : $borrowernumber; + } + else { + # Non logged in user is able to see all suggestions + $suggestion->{suggestedby} = undef; + } + } + else { + if ( $borrowernumber ) { + $suggestion->{suggestedby} = $borrowernumber; + } + else { + $suggestion->{suggestedby} = -1; + } + } +} else { + if ( $borrowernumber ) { + $suggestion->{suggestedby} = $borrowernumber; + } + else { + $suggestion->{suggestedby} = C4::Context->preference("AnonymousPatron"); + } } -else { - $$suggestion{suggestedby} ||= $borrowernumber unless ($allsuggestions); + +my $patrons_pending_suggestions_count = 0; +if ( $borrowernumber && C4::Context->preference("MaxOpenSuggestions") ne '' ) { + $patrons_pending_suggestions_count = scalar @{ SearchSuggestion( { suggestedby => $borrowernumber, STATUS => 'ASKED' } ) } ; } -# warn "bornum:",$borrowernumber; -my $suggestions_loop = - &SearchSuggestion( $suggestion); +my $suggestions_loop = &SearchSuggestion($suggestion); if ( $op eq "add_confirm" ) { - if (@$suggestions_loop>=1){ - #some suggestion are answering the request Donot Add - } - else { - $$suggestion{'suggesteddate'}=C4::Dates->today; - $$suggestion{'branchcode'}= $input->param('branch') || C4::Context->userenv->{"branch"}; - &NewSuggestion($suggestion); - # empty fields, to avoid filter in "SearchSuggestion" - $$suggestion{$_}='' foreach qw; - $suggestions_loop = - &SearchSuggestion( $suggestion ); - } - $op = 'else'; - print $input->redirect("/cgi-bin/koha/opac-suggestions.pl?op=else&submitted=1"); - exit; + if ( 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_loop >= 1 ) { + + #some suggestion are answering the request Donot Add + for my $suggestion (@$suggestions_loop) { + push @messages, + { + type => 'error', + code => 'already_exists', + id => $suggestion->{suggestionid} + }; + last; + } + } + else { + 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"}; + + &NewSuggestion($suggestion); + $patrons_pending_suggestions_count++; + + # delete empty fields, to avoid filter in "SearchSuggestion" + foreach my $field ( qw( title author publishercode copyrightdate place collectiontitle isbn STATUS ) ) { + delete $suggestion->{$field}; #clear search filters (except borrower related) to show all suggestions after placing a new one + } + $suggestions_loop = &SearchSuggestion($suggestion); + + push @messages, { type => 'info', code => 'success_on_inserted' }; + + } + $op = 'else'; } if ( $op eq "delete_confirm" ) { - my @delete_field = $input->param("delete_field"); + 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&deleted=1"); + print $input->redirect("/cgi-bin/koha/opac-suggestions.pl?op=else"); exit; } -map{ $_->{'branchcodesuggestedby'}=GetBranchInfo($_->{'branchcodesuggestedby'})->[0]->{'branchname'}} @$suggestions_loop; -my $supportlist=GetSupportList(); -foreach my $support(@$supportlist){ - if ($$support{'imageurl'}){ - $$support{'imageurl'}= getitemtypeimagelocation( 'opac', $$support{'imageurl'} ); - } - else { - delete $$support{'imageurl'} - } -} + +map{ + my $s = $_; + my $library = Koha::Libraries->find($s->{branchcodesuggestedby}); + $library ? $s->{branchcodesuggestedby} = $library->branchname : () +} @$suggestions_loop; foreach my $suggestion(@$suggestions_loop) { if($suggestion->{'suggestedby'} == $borrowernumber) { @@ -117,7 +187,8 @@ foreach my $suggestion(@$suggestions_loop) { $suggestion->{'showcheckbox'} = 0; } if($suggestion->{'patronreason'}){ - $suggestion->{'patronreason'} = GetKohaAuthorisedValueLib("OPAC_SUG",$suggestion->{'patronreason'},1); + my $av = Koha::AuthorisedValues->search({ category => 'OPAC_SUG', authorised_value => $suggestion->{patronreason} }); + $suggestion->{'patronreason'} = $av->count ? $av->next->opac_description : ''; } } @@ -125,24 +196,36 @@ my $patron_reason_loop = GetAuthorisedValues("OPAC_SUG"); # Is the person allowed to choose their branch if ( C4::Context->preference("AllowPurchaseSuggestionBranchChoice") ) { - my ( $borr ) = GetMemberDetails( $borrowernumber ); + my $branchcode = $input->param('branchcode') || q{}; + + if ( !$branchcode + && C4::Context->userenv + && C4::Context->userenv->{branch} ) + { + $branchcode = C4::Context->userenv->{branch}; + } -# pass the pickup branch along.... - my $branch = $input->param('branch') || $borr->{'branchcode'} || C4::Context->userenv->{branch} || '' ; + $template->param( branchcode => $branchcode ); +} -# make branch selection options... - my $CGIbranchloop = GetBranchesLoop($branch); - $template->param( branch_loop => $CGIbranchloop ); +my $mandatoryfields = ''; +{ + last unless ($op eq 'add'); + my $fldsreq_sp = C4::Context->preference("OPACSuggestionMandatoryFields") || 'title'; + $mandatoryfields = join(', ', (map { '"'.$_.'"'; } sort split(/\s*\,\s*/, $fldsreq_sp))); } $template->param( - %$suggestion, - itemtypeloop=> $supportlist, - suggestions_loop => $suggestions_loop, - patron_reason_loop => $patron_reason_loop, - showall => $allsuggestions, - "op_$op" => 1, - suggestionsview => 1, + %$suggestion, + suggestions_loop => $suggestions_loop, + patron_reason_loop => $patron_reason_loop, + "op_$op" => 1, + $op => 1, + messages => \@messages, + suggestionsview => 1, + suggested_by_anyone => $suggested_by_anyone, + mandatoryfields => $mandatoryfields, + patrons_pending_suggestions_count => $patrons_pending_suggestions_count, ); output_html_with_http_headers $input, $cookie, $template->output;