From 1a40a0a90453ea33cc7548510060005a0704653c Mon Sep 17 00:00:00 2001 From: Srdjan <srdjan@catalyst.net.nz> Date: Wed, 11 Jul 2012 14:10:22 +1200 Subject: [PATCH] Bug 8034: Restored network printer maintenance and selection Content-Type: text/plain; charset="UTF-8" This patch is just for restoring printer maintenance and selection, not for priting itself. It is just a preparation step. * Added UsePrintQueues syspref. If set to No, no printer info will be displayed/used * Database changes: - printers table PRIMARY KEY is now printqueue. It is more natural. We should really have a synthetic id, but printqueue is good enough - branches.branchprinter is a FOREIGN KEY to printers.printqueue * Created C4::Auth::get_user_printer() function that will return appropriate printer. In order of preference: - session selected - logged in branch branchprinter * Moved printer functions to C4::Printer * Restored printer maint/selection in admin zone UsePrintQueues permitting * Restored printer selection in circ/selectbranchprinter.pl UsePrintQueues permitting Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com> --- C4/Auth.pm | 49 +++++-- C4/Context.pm | 2 +- C4/Koha.pm | 40 ----- C4/Printer.pm | 152 ++++++++++++++++++++ admin/branches.pl | 30 +++-- admin/printers.pl | 39 ++---- circ/circulation.pl | 12 +-- circ/returns.pl | 8 - circ/selectbranchprinter.pl | 49 ++++--- installer/data/mysql/kohastructure.sql | 16 ++- installer/data/mysql/sysprefs.sql | 1 + installer/data/mysql/updatedatabase.pl | 11 ++ .../intranet-tmpl/prog/en/includes/header.inc | 3 + .../prog/en/modules/admin/admin-home.tt | 4 +- .../prog/en/modules/admin/branches.tt | 20 ++- .../en/modules/admin/preferences/circulation.pref | 6 + .../prog/en/modules/admin/printers.tt | 13 +-- .../prog/en/modules/circ/circulation.tt | 2 - .../prog/en/modules/circ/selectbranchprinter.tt | 5 +- t/db_dependent/lib/KohaTest/Koha.pm | 2 - t/db_dependent/lib/KohaTest/Printer.pm | 26 ++++ 21 files changed, 329 insertions(+), 161 deletions(-) create mode 100644 C4/Printer.pm create mode 100644 t/db_dependent/lib/KohaTest/Printer.pm diff --git a/C4/Auth.pm b/C4/Auth.pm index f9b15ef..48911ca 100644 --- a/C4/Auth.pm +++ b/C4/Auth.pm @@ -28,6 +28,7 @@ require Exporter; use C4::Context; use C4::Templates; # to get the template use C4::Branch; # GetBranches +use C4::Printer qw(GetPrinterDetails); use C4::VirtualShelves; use POSIX qw/strftime/; use List::MoreUtils qw/ any /; @@ -46,7 +47,8 @@ BEGIN { $debug = $ENV{DEBUG}; @ISA = qw(Exporter); @EXPORT = qw(&checkauth &get_template_and_user &haspermission &get_user_subpermissions); - @EXPORT_OK = qw(&check_api_auth &get_session &check_cookie_auth &checkpw &get_all_subpermissions &get_user_subpermissions); + @EXPORT_OK = qw(&check_api_auth &get_session &check_cookie_auth &checkpw + &get_all_subpermissions &get_user_subpermissions &get_user_printer); %EXPORT_TAGS = ( EditPermissions => [qw(get_all_subpermissions get_user_subpermissions)] ); $ldap = C4::Context->config('useldapserver') || 0; $cas = C4::Context->preference('casAuthentication'); @@ -310,6 +312,9 @@ sub get_template_and_user { $template->param(dateformat_iso => 1); } + my $userenv = C4::Context->userenv; + my $userenv_branch = $userenv ? $userenv->{"branch"} : undef; + # these template parameters are set the same regardless of $in->{'type'} $template->param( "BiblioDefaultView".C4::Context->preference("BiblioDefaultView") => 1, @@ -317,9 +322,9 @@ sub get_template_and_user { GoogleJackets => C4::Context->preference("GoogleJackets"), OpenLibraryCovers => C4::Context->preference("OpenLibraryCovers"), KohaAdminEmailAddress => "" . C4::Context->preference("KohaAdminEmailAddress"), - LoginBranchcode => (C4::Context->userenv?C4::Context->userenv->{"branch"}:"insecure"), - LoginFirstname => (C4::Context->userenv?C4::Context->userenv->{"firstname"}:"Bel"), - LoginSurname => C4::Context->userenv?C4::Context->userenv->{"surname"}:"Inconnu", + LoginBranchcode => ($userenv?$userenv_branch:"insecure"), + LoginFirstname => ($userenv?$userenv->{"firstname"}:"Bel"), + LoginSurname => $userenv?$userenv->{"surname"}:"Inconnu", TagsEnabled => C4::Context->preference("TagsEnabled"), hide_marc => C4::Context->preference("hide_marc"), item_level_itypes => C4::Context->preference('item-level_itypes'), @@ -347,7 +352,7 @@ sub get_template_and_user { IntranetNav => C4::Context->preference("IntranetNav"), IntranetmainUserblock => C4::Context->preference("IntranetmainUserblock"), LibraryName => C4::Context->preference("LibraryName"), - LoginBranchname => (C4::Context->userenv?C4::Context->userenv->{"branchname"}:"insecure"), + LoginBranchname => ($userenv?$userenv->{"branchname"}:"insecure"), advancedMARCEditor => C4::Context->preference("advancedMARCEditor"), canreservefromotherbranches => C4::Context->preference('canreservefromotherbranches'), intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"), @@ -367,6 +372,14 @@ sub get_template_and_user { AllowMultipleCovers => C4::Context->preference('AllowMultipleCovers'), EnableBorrowerFiles => C4::Context->preference('EnableBorrowerFiles'), ); + if ( C4::Context->preference('UsePrintQueues') ) { + my $printer = get_user_printer(); + my $printer_rec = $printer ? GetPrinterDetails($printer) : {}; + $template->param( + UsePrintQueues => 1, + PrinterName => $printer_rec->{printername}, + ); + } } else { warn "template type should be OPAC, here it is=[" . $in->{'type'} . "]" unless ( $in->{'type'} eq 'opac' ); @@ -385,8 +398,8 @@ sub get_template_and_user { my $opac_name = ''; if (($opac_search_limit =~ /branch:(\w+)/ && $opac_limit_override) || $in->{'query'}->param('limit') =~ /branch:(\w+)/){ $opac_name = $1; # opac_search_limit is a branch, so we use it. - } elsif (C4::Context->preference("SearchMyLibraryFirst") && C4::Context->userenv && C4::Context->userenv->{'branch'}) { - $opac_name = C4::Context->userenv->{'branch'}; + } elsif (C4::Context->preference("SearchMyLibraryFirst") && $userenv_branch) { + $opac_name = $userenv_branch } $template->param( opaccolorstylesheet => C4::Context->preference("opaccolorstylesheet"), @@ -397,7 +410,7 @@ sub get_template_and_user { CalendarFirstDayOfWeek => (C4::Context->preference("CalendarFirstDayOfWeek") eq "Sunday")?0:1, LibraryName => "" . C4::Context->preference("LibraryName"), LibraryNameTitle => "" . $LibraryNameTitle, - LoginBranchname => C4::Context->userenv?C4::Context->userenv->{"branchname"}:"", + LoginBranchname => $userenv?$userenv->{"branchname"}:"", OPACAmazonEnabled => C4::Context->preference("OPACAmazonEnabled"), OPACAmazonSimilarItems => C4::Context->preference("OPACAmazonSimilarItems"), OPACAmazonCoverImages => C4::Context->preference("OPACAmazonCoverImages"), @@ -431,7 +444,7 @@ sub get_template_and_user { RequestOnOpac => C4::Context->preference("RequestOnOpac"), 'Version' => C4::Context->preference('Version'), hidelostitems => C4::Context->preference("hidelostitems"), - mylibraryfirst => (C4::Context->preference("SearchMyLibraryFirst") && C4::Context->userenv) ? C4::Context->userenv->{'branch'} : '', + mylibraryfirst => (C4::Context->preference("SearchMyLibraryFirst") && $userenv) ? $userenv_branch : '', opaclayoutstylesheet => "" . C4::Context->preference("opaclayoutstylesheet"), opacbookbag => "" . C4::Context->preference("opacbookbag"), opaccredits => "" . C4::Context->preference("opaccredits"), @@ -1651,8 +1664,24 @@ sub getborrowernumber { return 0; } +=head2 get_user_printer + + $printer = get_user_printer(); + + Returns printer queue that is to be used for the logged in user + +=cut + +sub get_user_printer { + my $userenv = C4::Context->userenv or return; + if (my $printer = $userenv->{branchprinter}) { + return $printer; + } + my $branchname = $userenv->{branch} or return; + my $branch = GetBranchDetail($branchname) or return; + return $branch->{branchprinter}; +} -END { } # module clean-up code here (global destructor) 1; __END__ diff --git a/C4/Context.pm b/C4/Context.pm index 9ce6c74..717863f 100644 --- a/C4/Context.pm +++ b/C4/Context.pm @@ -998,7 +998,7 @@ sub userenv { =head2 set_userenv C4::Context->set_userenv($usernum, $userid, $usercnum, $userfirstname, - $usersurname, $userbranch, $userflags, $emailaddress); + $usersurname, $userbranch, $userflags, $emailaddress, $branchprinter); Establish a hash of user environment variables. diff --git a/C4/Koha.pm b/C4/Koha.pm index 4f386e4..0bf4130 100644 --- a/C4/Koha.pm +++ b/C4/Koha.pm @@ -39,7 +39,6 @@ BEGIN { @EXPORT = qw( &slashifyDate &subfield_is_koha_internal_p - &GetPrinters &GetPrinter &GetItemTypes &getitemtypeinfo &GetCcodes &GetSupportName &GetSupportList @@ -600,45 +599,6 @@ sub getImageSets { return \@imagesets; } -=head2 GetPrinters - - $printers = &GetPrinters(); - @queues = keys %$printers; - -Returns information about existing printer queues. - -C<$printers> is a reference-to-hash whose keys are the print queues -defined in the printers table of the Koha database. The values are -references-to-hash, whose keys are the fields in the printers table. - -=cut - -sub GetPrinters { - my %printers; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("select * from printers"); - $sth->execute; - while ( my $printer = $sth->fetchrow_hashref ) { - $printers{ $printer->{'printqueue'} } = $printer; - } - return ( \%printers ); -} - -=head2 GetPrinter - - $printer = GetPrinter( $query, $printers ); - -=cut - -sub GetPrinter ($$) { - my ( $query, $printers ) = @_; # get printer for this query from printers - my $printer = $query->param('printer'); - my %cookie = $query->cookie('userenv'); - ($printer) || ( $printer = $cookie{'printer'} ) || ( $printer = '' ); - ( $printers->{$printer} ) || ( $printer = ( keys %$printers )[0] ); - return $printer; -} - =head2 getnbpages Returns the number of pages to display in a pagination bar, given the number diff --git a/C4/Printer.pm b/C4/Printer.pm new file mode 100644 index 0000000..1dcd3c8 --- /dev/null +++ b/C4/Printer.pm @@ -0,0 +1,152 @@ +#!/usr/bin/perl + +package C4::Printer; + +# Copyright 2012 Catalyst IT +# +# 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 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. + +use strict; +use warnings; + +use C4::Context; + +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); + +BEGIN { + $VERSION = 3.07.00.049; + require Exporter; + @ISA = qw(Exporter); + @EXPORT = qw( + ); + @EXPORT_OK = qw( + &GetPrinters &SearchPrinters &GetPrinterDetails + &AddPrinter &UpdatePrinter &DeletePrinter + ); +} + +=head1 NAME + +C4::Printer - functions that deal with printer selection + +=head1 SYNOPSIS + + use C4::Printer; + +=head1 DESCRIPTION + +This module provides functions to select printer for slips etc. + +TODO: Move SQL from admin/printers.pl to this module + +=head1 FUNCTIONS + +=head2 GetPrinters + + $printers = &GetPrinters(); + @queues = keys %$printers; + +Returns information about existing printer queues. + +C<$printers> is a reference-to-hash whose keys are the print queues +defined in the printers table of the Koha database. The values are +references-to-hash, whose keys are the fields in the printers table. + +=cut + +sub GetPrinters { + my %printers; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("select * from printers"); + $sth->execute; + while ( my $printer = $sth->fetchrow_hashref ) { + $printers{ $printer->{'printqueue'} } = $printer; + } + return ( \%printers ); +} + +=head2 SearchPrinters + + $printers = SearchPrinters( $searchstring ); + +=cut + +sub SearchPrinters { + my ($searchstring)=@_; + $searchstring=~ s/\'/\\\'/g; + my @data=split(' ',$searchstring); + my $sth = C4::Context->dbh->prepare(" + SELECT * FROM printers + WHERE (printername like ?) ORDER BY printername + "); + $sth->execute("$data[0]%"); + return $sth->fetchall_arrayref({}); +} + + +=head2 GetPrinterDetails + + $printer_rec = GetPrinterDetails( $printqueue ); + +=cut + +sub GetPrinterDetails { + my ( $printer ) = @_; + my $dbh = C4::Context->dbh; + my $printername = $dbh->selectrow_hashref('SELECT * FROM printers WHERE printqueue = ?', undef, $printer); + return $printername; +} + +=head2 AddPrinter + + AddPrinter( $data ); + +=cut + +sub AddPrinter { + my ( $data ) = @_; + my $dbh = C4::Context->dbh; + $dbh->do("INSERT INTO printers (printername,printqueue,printtype) VALUES (?,?,?)", undef, + $data->{printername}, $data->{printqueue}, $data->{printtype}); +} + +=head2 UpdatePrinter + + UpdatePrinter( $printqueue, $data ); + +=cut + +sub UpdatePrinter { + my ( $printqueue, $data ) = @_; + my $dbh = C4::Context->dbh; + $dbh->do("UPDATE printers SET printername = ?, printtype = ? WHERE printqueue = ?", undef, + $data->{printername}, $data->{printtype}, $printqueue); +} + +=head2 DeletePrinter + + DeletePrinter( $printqueue ); + +=cut + +sub DeletePrinter { + my ( $printqueue ) = @_; + my $dbh = C4::Context->dbh; + $dbh->do("DELETE FROM printers WHERE printqueue = ?", undef, + $printqueue); +} + +1; diff --git a/admin/branches.pl b/admin/branches.pl index d172ea6..711fa0a 100755 --- a/admin/branches.pl +++ b/admin/branches.pl @@ -45,6 +45,7 @@ use C4::Context; use C4::Output; use C4::Koha; use C4::Branch; +use C4::Printer qw(GetPrinters); # Fixed variables my $script_name = "/cgi-bin/koha/admin/branches.pl"; @@ -226,12 +227,9 @@ sub default { sub editbranchform { my ($branchcode,$innertemplate) = @_; - # initiate the scrolling-list to select the printers - my $printers = GetPrinters(); - my @printerloop; + my $data; my $oldprinter = ""; - if ($branchcode) { $data = GetBranchInfo($branchcode); $data = $data->[0]; @@ -241,15 +239,21 @@ sub editbranchform { _branch_to_template($data, $innertemplate); } - foreach my $thisprinter ( keys %$printers ) { - push @printerloop, { - value => $thisprinter, - selected => ( $oldprinter eq $printers->{$thisprinter} ), - branchprinter => $printers->{$thisprinter}->{'printqueue'}, - }; + if ( C4::Context->preference('UsePrintQueues') ) { + # initiate the scrolling-list to select the printers + my $printers = GetPrinters(); + my @printerloop; + foreach my $thisprinter ( keys %$printers ) { + push @printerloop, { + value => $thisprinter, + selected => ( $oldprinter eq $printers->{$thisprinter} ), + branchprinter => $printers->{$thisprinter}->{'printername'}, + }; + } + + $innertemplate->param( printerloop => \@printerloop ); } - $innertemplate->param( printerloop => \@printerloop ); # make the checkboxes..... # # We export a "categoryloop" array to the template, each element of which @@ -308,6 +312,7 @@ sub branchinfotable { my ($branchcode,$innertemplate) = @_; my $branchinfo = $branchcode ? GetBranchInfo($branchcode) : GetBranchInfo(); + my $printers = GetPrinters(); my @loop_data = (); foreach my $branch (@$branchinfo) { # @@ -367,6 +372,9 @@ sub branchinfotable { $row{'branch_name'} = $branch->{'branchname'}; $row{'branch_code'} = $branch->{'branchcode'}; $row{'value'} = $branch->{'branchcode'}; + if (my $printer = $branch->{'branchprinter'}) { + $row{'branchprintername'} = $printers->{$printer}->{'printername'}; + } push @loop_data, \%row; } diff --git a/admin/printers.pl b/admin/printers.pl index c7e7492..19c2815 100755 --- a/admin/printers.pl +++ b/admin/printers.pl @@ -43,19 +43,7 @@ use CGI; use C4::Context; use C4::Output; use C4::Auth; - -sub StringSearch { - my ($searchstring,$type)=@_; # why bother with $type if we don't use it?! - $searchstring=~ s/\'/\\\'/g; - my @data=split(' ',$searchstring); - my $sth = C4::Context->dbh->prepare(" - SELECT printername,printqueue,printtype from printers - WHERE (printername like ?) order by printername - "); - $sth->execute("$data[0]%"); - my $data=$sth->fetchall_arrayref({}); - return (scalar(@$data),$data); -} +use C4::Printer qw(GetPrinterDetails SearchPrinters AddPrinter UpdatePrinter DeletePrinter); my $input = new CGI; my $searchfield=$input->param('searchfield'); @@ -89,33 +77,31 @@ if ($op eq 'add_form') { #---- if primkey exists, it's a modify action, so read values to modify... my $data; if ($searchfield) { - my $sth=$dbh->prepare("SELECT printername,printqueue,printtype from printers where printername=?"); - $sth->execute($searchfield); - $data=$sth->fetchrow_hashref; + $data=GetPrinterDetails($searchfield); } $template->param(printqueue => $data->{'printqueue'}, + printername => $data->{'printername'}, printtype => $data->{'printtype'}); # END $OP eq ADD_FORM ################## ADD_VALIDATE ################################## # called by add_form, used to insert/modify data in DB } elsif ($op eq 'add_validate') { $template->param(add_validate => 1); + my $params = $input->Vars; if ($input->param('add')){ - my $sth=$dbh->prepare("INSERT INTO printers (printername,printqueue,printtype) VALUES (?,?,?)"); - $sth->execute($input->param('printername'),$input->param('printqueue'),$input->param('printtype')); + AddPrinter($params); } else { - my $sth=$dbh->prepare("UPDATE printers SET printqueue=?,printtype=? WHERE printername=?"); - $sth->execute($input->param('printqueue'),$input->param('printtype'),$input->param('printername')); + UpdatePrinter($params->{printqueue}, $params); } # END $OP eq ADD_VALIDATE ################## DELETE_CONFIRM ################################## # called by default form, used to confirm deletion of data in DB } elsif ($op eq 'delete_confirm') { $template->param(delete_confirm => 1); - my $sth=$dbh->prepare("select printername,printqueue,printtype from printers where printername=?"); + my $sth=$dbh->prepare("select printername,printqueue,printtype from printers where printqueue=?"); $sth->execute($searchfield); - my $data=$sth->fetchrow_hashref; + my $data=GetPrinterDetails($searchfield); $template->param(printqueue => $data->{'printqueue'}, printtype => $data->{'printtype'}); # END $OP eq DELETE_CONFIRM @@ -123,15 +109,16 @@ if ($op eq 'add_form') { # called by delete_confirm, used to effectively confirm deletion of data in DB } elsif ($op eq 'delete_confirmed') { $template->param(delete_confirmed => 1); - my $sth=$dbh->prepare("delete from printers where printername=?"); - $sth->execute($searchfield); + DeletePrinter($searchfield); # END $OP eq DELETE_CONFIRMED ################## DEFAULT ########################################### } else { # DEFAULT $template->param(else => 1); - my ($count,$results)=StringSearch($searchfield,'web'); + $searchfield ||= $input->param('description') || ""; + my $results=SearchPrinters($searchfield); + my $count = $results ? scalar(@$results) : 0; my $max = ($offset+$pagesize < $count) ? $offset+$pagesize : $count; - my @loop = (@$results)[$offset..$max]; + my @loop = (@$results)[$offset..$max-1]; $template->param(loop => \@loop); diff --git a/circ/circulation.pl b/circ/circulation.pl index 551ceba..cfe530d 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -29,7 +29,7 @@ use C4::Print; use C4::Auth qw/:DEFAULT get_session/; use C4::Dates qw/format_date/; use C4::Branch; # GetBranches -use C4::Koha; # GetPrinter +use C4::Koha; use C4::Circulation; use C4::Overdues qw/CheckBorrowerDebarred/; use C4::Members; @@ -67,12 +67,6 @@ if ($branch){ $session->param('branchname', GetBranchName($branch)); } -my $printer = $query->param('printer'); -if ($printer){ - # update our session so the userenv is updated - $session->param('branchprinter', $printer); -} - if (!C4::Context->userenv && !$branch){ if ($session->param('branch') eq 'NO_LIBRARY_SET'){ # no branch set we can't issue @@ -102,8 +96,6 @@ $findborrower =~ s|,| |g; my $borrowernumber = $query->param('borrowernumber'); $branch = C4::Context->userenv->{'branch'}; -$printer = C4::Context->userenv->{'branchprinter'}; - # If AutoLocation is not activated, we show the Circulation Parameters to chage settings of librarian if (C4::Context->preference("AutoLocation") != 1) { @@ -667,8 +659,6 @@ $template->param( borrowernumber => $borrowernumber, branch => $branch, branchname => GetBranchName($borrower->{'branchcode'}), - printer => $printer, - printername => $printer, firstname => $borrower->{'firstname'}, surname => $borrower->{'surname'}, showname => $borrower->{'showname'}, diff --git a/circ/returns.pl b/circ/returns.pl index 743bf18..0efa712 100755 --- a/circ/returns.pl +++ b/circ/returns.pl @@ -36,7 +36,6 @@ use C4::Context; use C4::Auth qw/:DEFAULT get_session/; use C4::Output; use C4::Circulation; -use C4::Print; use C4::Reserves; use C4::Biblio; use C4::Items; @@ -73,15 +72,10 @@ my ( $template, $librarian, $cookie ) = get_template_and_user( ##################### #Global vars my $branches = GetBranches(); -my $printers = GetPrinters(); -my $printer = C4::Context->userenv ? C4::Context->userenv->{'branchprinter'} : ""; my $overduecharges = (C4::Context->preference('finesMode') && C4::Context->preference('finesMode') ne 'off'); my $userenv_branch = C4::Context->userenv->{'branch'} || ''; -# -# Some code to handle the error if there is no branch or printer setting..... -# # Set up the item stack .... my %returneditems; @@ -601,9 +595,7 @@ foreach ( sort { $a <=> $b } keys %returneditems ) { $template->param( riloop => \@riloop, genbrname => $branches->{$userenv_branch}->{'branchname'}, - genprname => $printers->{$printer}->{'printername'}, branchname => $branches->{$userenv_branch}->{'branchname'}, - printer => $printer, errmsgloop => \@errmsgloop, exemptfine => $exemptfine, dropboxmode => $dropboxmode, diff --git a/circ/selectbranchprinter.pl b/circ/selectbranchprinter.pl index b5adcfc..67034b7 100755 --- a/circ/selectbranchprinter.pl +++ b/circ/selectbranchprinter.pl @@ -23,10 +23,10 @@ use CGI; use C4::Context; use C4::Output; -use C4::Auth qw/:DEFAULT get_session/; -use C4::Print; # GetPrinters +use C4::Auth qw/:DEFAULT get_session get_user_printer/; use C4::Koha; use C4::Branch; # GetBranches GetBranchesLoop +use C4::Printer qw(GetPrinters); # this will be the script that chooses branch and printer settings.... @@ -56,9 +56,10 @@ my $userenv_printer = C4::Context->userenv->{'branchprinter'} || ''; my @updated; # $session lddines here are doing the updating -if ($branch and $branches->{$branch}) { +my $branch_rec = $branch ? $branches->{$branch} : undef; +if ($branch_rec) { if (! $userenv_branch or $userenv_branch ne $branch ) { - my $branchname = GetBranchName($branch); + my $branchname = $branch_rec->{branchname}; $template->param(LoginBranchname => $branchname); # update template for new branch $template->param(LoginBranchcode => $branch); # update template for new branch $session->param('branchname', $branchname); # update sesssion in DB @@ -67,6 +68,8 @@ if ($branch and $branches->{$branch}) { updated_branch => 1, old_branch => $userenv_branch, }; + $printer ||= $branch_rec->{branchprinter}; + undef $userenv_printer; } # else branch the same, no update } else { $branch = $userenv_branch; # fallback value @@ -87,7 +90,7 @@ if ($printer) { }; } # else printer is the same, no update } else { - $printer = $userenv_printer; # fallback value + $printer = get_user_printer(); # fallback value } $template->param(updated => \@updated) if (scalar @updated); @@ -96,21 +99,6 @@ unless ($branches->{$branch}) { $branch = (keys %$branches)[0]; # if branch didn't really exist, then replace it w/ one that does } -my @printkeys = sort keys %$printers; -if (scalar(@printkeys) == 1 or not $printers->{$printer}) { - $printer = $printkeys[0]; # if printer didn't really exist, or there is only 1 anyway, then replace it w/ one that does -} - -my @printerloop; -foreach ( @printkeys ) { - next unless ($_); # skip printer if blank. - push @printerloop, { - selected => ( $_ eq $printer ), - name => $printers->{$_}->{'printername'}, - value => $_, - }; -} - my @recycle_loop; foreach ($query->param()) { $_ or next; # disclude blanks @@ -133,9 +121,28 @@ if (scalar @updated and not scalar @recycle_loop) { $template->param( referer => $referer, - printerloop => \@printerloop, branchloop => GetBranchesLoop($branch), recycle_loop=> \@recycle_loop, ); +if ( C4::Context->preference('UsePrintQueues') ) { + my @printkeys = keys %$printers; + if (scalar(@printkeys) == 1 or not $printers->{$printer}) { + $printer = $printkeys[0]; # if printer didn't really exist, or there is only 1 anyway, then replace it w/ one that does + } + + my @printerloop; + foreach ( @printkeys ) { + push @printerloop, { + selected => ( $_ eq $printer ), + name => $printers->{$_}->{'printername'}, + value => $_, + }; + } + + $template->param( + printerloop => \@printerloop, + ); +} + output_html_with_http_headers $query, $cookie, $template->output; diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 69304e1..3e621f7 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -363,10 +363,11 @@ CREATE TABLE `branches` ( -- information about your libraries or branches are st `branchurl` mediumtext, -- the URL for your library or branch's website `issuing` tinyint(4) default NULL, -- unused in Koha `branchip` varchar(15) default NULL, -- the IP address for your library or branch - `branchprinter` varchar(100) default NULL, -- unused in Koha + `branchprinter` varchar(20) default NULL, `branchnotes` mediumtext, -- notes related to your library or branch opac_info text, -- HTML that displays in OPAC PRIMARY KEY (`branchcode`) + FOREIGN KEY (branchprinter) REFERENCES printers (printqueue) ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- @@ -1568,12 +1569,13 @@ CREATE TABLE `pending_offline_operations` ( -- Table structure for table `printers` -- -DROP TABLE IF EXISTS `printers`; -CREATE TABLE `printers` ( - `printername` varchar(40) NOT NULL default '', - `printqueue` varchar(20) default NULL, - `printtype` varchar(20) default NULL, - PRIMARY KEY (`printername`) +DROP TABLE IF EXISTS printers; +CREATE TABLE printers ( + printername varchar(40) NOT NULL default '', + printqueue varchar(20) NOT NULL, + printtype varchar(20) default NULL, + PRIMARY KEY (printqueue), + UNIQUE (printername) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index f5a18b2..fb6d390 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -374,3 +374,4 @@ INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ( INSERT INTO systempreferences (variable,value,explanation,type) VALUES('EnableBorrowerFiles','0','If enabled, allows librarians to upload and attach arbitrary files to a borrower record.','YesNo'); INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UpdateTotalIssuesOnCirc','0','Whether to update the totalissues field in the biblio on each circ.',NULL,'YesNo'); INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('IntranetSlipPrinterJS','','Use this JavaScript for printing slips. Define at least function printThenClose(). For use e.g. with Firefox PlugIn jsPrintSetup, see http://jsprintsetup.mozdev.org/','','Free'); +INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('UsePrintQueues','0',NULL,NULL,'YesNo'); diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index ed0c674..192ec12 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -5635,6 +5635,17 @@ if(C4::Context->preference("Version") < TransformToNum($DBversion) ) { SetVersion($DBversion); } + +$DBversion = "3.09.00.XXX"; +if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { + $dbh->do("ALTER TABLE printers DROP PRIMARY KEY, MODIFY printqueue varchar(20) NOT NULL PRIMARY KEY, ADD UNIQUE (printername)"); + $dbh->do("ALTER TABLE branches MODIFY branchprinter varchar(20) NULL, ADD FOREIGN KEY (branchprinter) REFERENCES printers (printqueue) ON UPDATE CASCADE"); + $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('UsePrintQueues','0',NULL,NULL,'YesNo')"); + + print "Upgrade to $DBversion done (Add borrowers.default_printqueue and 'UsePrintQueues' syspref)\n"; + SetVersion($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc index 3d71d45..86fe8cc 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc @@ -57,6 +57,9 @@ [% LoginBranchname %] [% END %] </strong> + [% IF UsePrintQueues %] + - [% PrinterName %] + [% END %] [% IF ( IndependantBranches ) %] [% IF ( CAN_user_management || CAN_user_editcatalogue_edit_catalogue ) %] ( <a class="toplinks" href="/cgi-bin/koha/circ/selectbranchprinter.pl">Set library</a> ) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt index a85d490..be51e23 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt @@ -101,8 +101,8 @@ <dl> [% IF ( NoZebra ) %]<dt><a href="/cgi-bin/koha/admin/stopwords.pl">Stop words</a></dt> <dd>Words ignored during search.</dd>[% END %] - <!-- <dt><a href="/cgi-bin/koha/admin/printers.pl">Network Printers</a></dt> - <dd>Printers (UNIX paths).</dd> --> + [% IF UsePrintQueues %]<dt><a href="/cgi-bin/koha/admin/printers.pl">Network Printers</a></dt> + <dd>Printers (UNIX paths).</dd>[% END %] <dt><a href="/cgi-bin/koha/admin/z3950servers.pl">Z39.50 client targets</a></dt> <dd>Define which servers to query for MARC data in the integrated Z39.50 client.</dd> </dl> diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt index 15e8064..bcb918f 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/branches.tt @@ -143,10 +143,10 @@ tinyMCE.init({ <li><label for="branchurl">URL</label><input type="text" name="branchurl" id="branchurl" value="[% branchurl |html %]" /></li> <li><label for="opac_info">OPAC info</label><textarea name="opac_info" id="opac_info">[% opac_info |html %]</textarea></li> <li><label for="branchip">IP</label><input type="text" name="branchip" id="branchip" value="[% branchip |html %]" /> <span class="hint">Can be entered as a single IP, or a subnet such as 192.168.1.*</span></li> - <!-- - <li><label for="branchprinter">Library Printer</label> +[% IF UsePrintQueues %] + <li><label for="branchprinter">Library printer</label> <select id="branchprinter" name="branchprinter"> - <option value="">None</option> + <option value="">(None)</option> [% FOREACH printerloo IN printerloop %] [% IF ( printerloo.selected ) %] <option value="[% printerloo.value %]" selected="selected">[% printerloo.branchprinter %]</option> @@ -155,7 +155,7 @@ tinyMCE.init({ [% END %] [% END %] </select></li> - --> +[% END %] <li><label for="branchnotes">Notes</label><input type="text" name="branchnotes" id="branchnotes" value="[% branchnotes |html %]" /></li> </ol> </fieldset> @@ -198,7 +198,9 @@ tinyMCE.init({ <th>Address</th> <th>Properties</th> <th>IP</th> - <!-- <th>Printer</th> --> +[% IF UsePrintQueues %] + <th>Printer</th> +[% END %] <th colspan="2"> </th> </tr></thead><tbody> [% FOREACH branche IN branches %] @@ -250,9 +252,11 @@ tinyMCE.init({ <td> [% branche.branchip %] </td> - <!-- <td> - [% branche.branchprinter %] - </td> --> +[% IF UsePrintQueues %] + <td> + [% branche.branchprintername %] + </td> +[% END %] <td> <a href="[% branche.action %]?op=edit&branchcode=[% branche.value |url %]">Edit</a> </td> diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref index a758b19..e743449 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref @@ -110,6 +110,12 @@ Circulation: yes: Do no: "Do not" - update a bibliographic record's total issues count whenever an item is issued (WARNING! This increases server load significantly; if performance is a concern, use the update_totalissues.pl cron job to update the total issues count). + - + - pref: UsePrintQueues + choices: + yes: "Use" + no: "Don't use" + - server print queues. Checkout Policy: - - pref: AllowNotForLoanOverride diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/printers.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/printers.tt index 7dfb80b..d1007a3 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/printers.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/printers.tt @@ -89,22 +89,17 @@ <form action="[% script_name %]" name="Aform" method="post"> <input type="hidden" name="op" value="add_validate" /> [% IF ( searchfield ) %] + <input type="hidden" name="searchfield" value="[% searchfield %]" /> <input type="hidden" name="add" value="0" /> [% ELSE %] <input type="hidden" name="add" value="1" /> [% END %] <fieldset class="rows"> -<ol> [% IF ( searchfield ) %] - <li> - <span class="label">Printer name: </span> - <input type="hidden" name="printername" id="" value="[% searchfield %]" />[% searchfield %] - </li> - [% ELSE %] +<ol> <li> <label for="printername">Printer name: </label> - <input type="text" name="printername" id="printername" size="50" maxlength="50" /> + <input type="text" name="printername" id="printername" size="50" maxlength="50" value="[% printername %]" /> </li> - [% END %] <li> <label for="printqueue">Queue: </label> <input type="text" name="printqueue" id="printqueue" size="50" maxlength="50" value="[% printqueue %]" /> @@ -190,7 +185,7 @@ <td>[% loo.printername %]</td> <td>[% loo.printqueue %]</td> <td>[% loo.printtype %]</td> - <td><a href="[% loo.script_name %]?op=add_form&searchfield=[% loo.printername %]">Edit</a> <a href="[% loo.script_name %]?op=delete_confirm&searchfield=[% loo.printername %]">Delete</a></td> + <td><a href="[% loo.script_name %]?op=add_form&searchfield=[% loo.printqueue %]">Edit</a> <a href="[% loo.script_name %]?op=delete_confirm&searchfield=[% loo.printqueue %]">Delete</a></td> </tr> [% END %] </table>[% ELSE %]<div class="notice">No printers defined.</div>[% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt index 6f72392..daef614 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -441,7 +441,6 @@ No patron matched <span class="ex">[% message %]</span> <legend>Patron selection</legend> <input type="hidden" name="branch" value="[% branch %]" /> - <input type="hidden" name="printer" value="[% printer %]" /> <input type="hidden" name="duedatespec" value="[% duedatespec %]" /> <input type="hidden" name="stickyduedate" value="[% stickyduedate %]" /> @@ -499,7 +498,6 @@ No patron matched <span class="ex">[% message %]</span> </div>[% END %] <input type="hidden" name="borrowernumber" id="borrowernumber" value="[% borrowernumber %]" /> <input type="hidden" name="branch" value="[% branch %]" /> - <input type="hidden" name="printer" value="[% printer %]" /> <input type="hidden" name="print" value="maybe" /> <input type="hidden" name="debt_confirmed" value="[% debt_confirmed %]" /> [% IF ( CHARGES ) %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/selectbranchprinter.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/selectbranchprinter.tt index acad21c..e742f81 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/selectbranchprinter.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/selectbranchprinter.tt @@ -28,7 +28,7 @@ Updated:<ul> [% IF ( update.updated_branch ) %] <li>Library: [% update.old_branch or "?" %] ⇒ [% update.LoginBranchcode or "?" %]</li> [% ELSIF ( update.updated_printer ) %] - <!-- FIXME: <li>Printer: [% update.old_printer or "?" %] ⇒ [% update.new_printer or "?" %]</li> --> + <li>Printer: [% update.old_printer or "?" %] ⇒ [% update.new_printer or "?" %]</li> [% ELSE %] <li>ERROR - unknown</li> [% END %] @@ -63,7 +63,6 @@ Updated:<ul> [% END %] </select></li> [% END %] -<!-- [% IF ( printerloop ) %] <li><label for="printer">Choose a network printer:</label> <select name="printer" id="printer"> @@ -75,7 +74,7 @@ Updated:<ul> [% END %] [% END %] </select></li> - [% END %] --> + [% END %] </ol> </fieldset> <fieldset class="action"><input type="submit" value="Submit" /></fieldset> diff --git a/t/db_dependent/lib/KohaTest/Koha.pm b/t/db_dependent/lib/KohaTest/Koha.pm index 13a145a..0dda47a 100644 --- a/t/db_dependent/lib/KohaTest/Koha.pm +++ b/t/db_dependent/lib/KohaTest/Koha.pm @@ -28,8 +28,6 @@ sub methods : Test( 1 ) { _getImagesFromDirectory _getSubdirectoryNames getImageSets - GetPrinters - GetPrinter getnbpages getallthemes getFacets diff --git a/t/db_dependent/lib/KohaTest/Printer.pm b/t/db_dependent/lib/KohaTest/Printer.pm new file mode 100644 index 0000000..ddbdfb9 --- /dev/null +++ b/t/db_dependent/lib/KohaTest/Printer.pm @@ -0,0 +1,26 @@ +package KohaTest::Printer; +use base qw( KohaTest ); + +use strict; +use warnings; + +use Test::More; + +use C4::Koha; +sub testing_class { 'C4::Printer' } + +sub methods : Test( 1 ) { + my $self = shift; + my @methods = qw( + GetPrinters + SearchPrinters + GetPrinterDetails + AddPrinter + UpdatePrinter + DeletePrinter + ); + + can_ok( $self->testing_class, @methods ); +} + +1; -- 1.7.2.5