ffzg/recall_notices.pl: added --interval and --dedup
[koha.git] / opac / opac-addbybiblionumber.pl
index 610b22e..ddc6778 100755 (executable)
@@ -1,62 +1,55 @@
 #!/usr/bin/perl
 
-#script to provide virtualshelf management
-# WARNING: This file uses 4-character tabs!
-#
-# $Header$
-#
 # Copyright 2000-2002 Katipo Communications
+# Copyright 2016 Koha Development Team
 #
 # 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.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
-use strict;
-use warnings;
+use Modern::Perl;
 
+use CGI qw ( -utf8 );
 use C4::Biblio;
-use CGI;
-use C4::VirtualShelves qw/:DEFAULT GetAllShelves RefreshShelvesSummary/;
-use C4::Auth;
 use C4::Output;
-use C4::Auth qw/get_session/;
-use C4::Debug;
+use C4::Auth;
 
-#splits incoming biblionumber(s) to array and adds each to shelf.
-sub AddBibliosToShelf {
-    my ($shelfnumber,@biblionumber)=@_;
+use Koha::Biblios;
+use Koha::Virtualshelves;
 
-    # multiple bibs might come in as '/' delimited string (from where, i don't see), or as array.
-    if (scalar(@biblionumber) == 1) {
-        @biblionumber = (split /\//,$biblionumber[0]);
-    }
-    for my $bib (@biblionumber){
-        AddToShelf($bib, $shelfnumber);
-    }
+my $query           = new CGI;
+my @biblionumbers   = $query->multi_param('biblionumber');
+my $selectedshelf   = $query->param('selectedshelf');
+my $newshelf        = $query->param('newshelf');
+my $shelfnumber     = $query->param('shelfnumber');
+my $newvirtualshelf = $query->param('newvirtualshelf');
+my $category        = $query->param('category');
+my ( $errcode, $authorized ) = ( 0, 1 );
+my @biblios;
+
+# if virtualshelves is disabled, leave immediately
+if ( !C4::Context->preference('virtualshelves') ) {
+    print $query->redirect("/cgi-bin/koha/errors/404.pl");
+    exit;
 }
 
-my $query              = new CGI;
-my @biblionumber       = $query->param('biblionumber');
-my $selectedshelf      = $query->param('selectedshelf');
-my $newshelf           = $query->param('newshelf');
-my $shelfnumber        = $query->param('shelfnumber');
-my $newvirtualshelf    = $query->param('newvirtualshelf');
-my $category           = $query->param('category');
+if ( scalar(@biblionumbers) == 1 ) {
+    @biblionumbers = ( split /\//, $biblionumbers[0] );
+}
 
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
-    {
-        template_name   => "opac-addbybiblionumber.tmpl",
+    {   template_name   => "opac-addbybiblionumber.tt",
         query           => $query,
         type            => "opac",
         authnotrequired => 0,
@@ -64,71 +57,111 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
 );
 
 if ($newvirtualshelf) {
-       $shelfnumber = AddShelf(  $newvirtualshelf, $loggedinuser, $category );
-       AddBibliosToShelf($shelfnumber, @biblionumber);
-       RefreshShelvesSummary($query->cookie("CGISESSID"),$loggedinuser,($loggedinuser == -1 ? 20 : 10));
-       print $query->header;
-       print "<html><meta http-equiv=\"refresh\" content=\"0;url=opac-shelves.pl?display=privateshelves\" /><body onload=\"window.opener.location.reload(true);self.close();\"></body></html>";
-       exit;
-}
-
-# verify user is authorized to perform the action on the shelf...
-my $authorized = 1;
-if ($selectedshelf) {
-       $authorized = 0 unless ShelfPossibleAction( $loggedinuser, $selectedshelf );
-}
-
-if ($shelfnumber && ($shelfnumber != -1)) {
-       AddBibliosToShelf($shelfnumber,@biblionumber);
-       RefreshShelvesSummary($query->cookie("CGISESSID"),$loggedinuser,($loggedinuser == -1 ? 20 : 10));
-       print $query->header;
-       print "<html><meta http-equiv=\"refresh\" content=\"0;url=opac-shelves.pl?display=privateshelves\" /><body onload=\"self.close();\"></body></html>";
-       exit;
-}
-else {
-       if($selectedshelf){
-       # adding to specific shelf
-       my ( $singleshelf, $singleshelfname, $singlecategory ) = GetShelf( $query->param('selectedshelf') );
-                               $template->param(
-                               singleshelf             => 1,
-                               shelfnumber         => $singleshelf,
-                               shelfname           => $singleshelfname,
-                               "category$singlecategory" => 1
-                       );
-       } else {
+    if ($loggedinuser > 0
+        and (  $category == 1
+            or $category == 2 and $loggedinuser > 0 && C4::Context->preference('OpacAllowPublicListCreation') )
+      ) {
+        my $shelf = eval { Koha::Virtualshelf->new( { shelfname => $newvirtualshelf, category => $category, owner => $loggedinuser, } )->store; };
+        if ( $@ or not $shelf ) {
+            $errcode    = 1;
+            $authorized = 0;
+        } else {
+            for my $biblionumber (@biblionumbers) {
+                $shelf->add_biblio( $biblionumber, $loggedinuser );
+            }
 
-        my $privateshelves = GetAllShelves(1,$loggedinuser);
-        if(@{$privateshelves}){
-                       $template->param (
-                               privatevirtualshelves          => $privateshelves,
-                               existingshelves => 1
-                       );
-               }
-        my $publicshelves = GetAllShelves(2,$loggedinuser);
-        if(@{$publicshelves}){
-                       $template->param (
-                               publicvirtualshelves          => $publicshelves,
-                               existingshelves => 1
-                       );
+            #Reload the page where you came from
+            print $query->header;
+            print "<html><meta http-equiv=\"refresh\" content=\"0\" /><body onload=\"window.opener.location.reload(true);self.close();\"></body></html>";
+            exit;
+        }
+    }
+} elsif ($shelfnumber) {
+    my $shelfnumber = $query->param('shelfnumber');
+    my $shelf       = Koha::Virtualshelves->find($shelfnumber);
+    if ( $shelf->can_biblios_be_added($loggedinuser) ) {
+        for my $biblionumber (@biblionumbers) {
+            $shelf->add_biblio( $biblionumber, $loggedinuser );
         }
 
+        #Close this page and return
+        print $query->header;
+        print "<html><meta http-equiv=\"refresh\" content=\"0\" /><body onload=\"self.close();\"></body></html>";
+        exit;
+    } else {
+        $authorized = 0;
+    }
+} elsif ($selectedshelf) {
+    my $shelfnumber = $query->param('selectedshelf');
+    my $shelf       = Koha::Virtualshelves->find($shelfnumber);
+    if ( $shelf->can_biblios_be_added($loggedinuser) ) {
+        $template->param(
+            singleshelf => 1,
+            shelfnumber => $shelf->shelfnumber,
+            shelfname   => $shelf->shelfname,
+        );
+    } else {
+        $authorized = 0;
+    }
+} else {
+    if ( $loggedinuser > 0 ) {
+        my $private_shelves = Koha::Virtualshelves->search(
+            {   category => 1,
+                owner    => $loggedinuser,
+                allow_change_from_owner => 1,
+            },
+            { order_by => 'shelfname' }
+        );
+        my $shelves_shared_with_me = Koha::Virtualshelves->search(
+            {   category                            => 1,
+                'virtualshelfshares.borrowernumber' => $loggedinuser,
+                allow_change_from_others            => 1,
+            },
+            { join => 'virtualshelfshares', }
+        );
+        my $public_shelves = Koha::Virtualshelves->search(
+            {   category => 2,
+                -or      => [
+                    -and => {
+                        allow_change_from_owner => 1,
+                        owner     => $loggedinuser,
+                    },
+                    allow_change_from_others => 1,
+                ],
+            },
+            { order_by => 'shelfname' }
+        );
+        $template->param(
+            private_shelves                => $private_shelves,
+            private_shelves_shared_with_me => $shelves_shared_with_me,
+            public_shelves                 => $public_shelves,
+        );
+    } else {
+        $authorized = 0;
+    }
 }
-       my @biblios;
-       for my $bib (@biblionumber) {
-               my $data = GetBiblioData( $bib );
-               push(@biblios, 
-                       { biblionumber => $bib,
-                         title        => $data->{'title'},
-                         author       => $data->{'author'},
-                       } );
-       }
-       $template->param (
-               newshelf => $newshelf,
-               multiple => (scalar(@biblios) > 1),
-               total    => scalar @biblios,
-               biblios  => \@biblios,
-               authorized      => $authorized,
-       );
 
-       output_html_with_http_headers $query, $cookie, $template->output;
+if ($authorized) {
+    for my $biblionumber (@biblionumbers) {
+        my $biblio = Koha::Biblios->find( $biblionumber );
+        push(
+            @biblios,
+            {   biblionumber => $biblionumber,
+                title        => $biblio->title,
+                author       => $biblio->author,
+            }
+        );
+    }
+    $template->param(
+        multiple => ( scalar(@biblios) > 1 ),
+        total    => scalar @biblios,
+        biblios  => \@biblios,
+    );
+
+    $template->param(
+        newshelf => $newshelf || 0,
+        OpacAllowPublicListCreation => C4::Context->preference('OpacAllowPublicListCreation'),
+    );
 }
+$template->param( authorized => $authorized, errcode => $errcode, );
+output_html_with_http_headers $query, $cookie, $template->output;