From srdjan at catalyst.net.nz Wed Jan 6 01:40:28 2016 From: srdjan at catalyst.net.nz (Srdjan) Date: Wed, 6 Jan 2016 13:40:28 +1300 Subject: [Koha-patches] [PATCH] bug_6624: OpenLibrarySearch syspref for OPAC Message-ID: <1452040828-15137-1-git-send-email-srdjan@catalyst.net.nz> If set to Yes, OPAC search results and details will include buton from Open Library Raed API. In addition, Number of titles held in Open Library and the results link will be reported on the search results screen. --- .../data/mysql/atomicupdate/bug_6624-OpenLibrarySearch_syspref.sql | 2 ++ installer/data/mysql/sysprefs.sql | 1 + .../prog/en/modules/admin/preferences/enhanced_content.pref | 6 ++++++ 3 files changed, 9 insertions(+) create mode 100644 installer/data/mysql/atomicupdate/bug_6624-OpenLibrarySearch_syspref.sql diff --git a/installer/data/mysql/atomicupdate/bug_6624-OpenLibrarySearch_syspref.sql b/installer/data/mysql/atomicupdate/bug_6624-OpenLibrarySearch_syspref.sql new file mode 100644 index 0000000..f9123c4 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_6624-OpenLibrarySearch_syspref.sql @@ -0,0 +1,2 @@ +INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) +VALUES('OpenLibrarySearch','0','If Yes Open Library search results will show in OPAC',NULL,'YesNo'); diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index aa53139..1335f71 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -345,6 +345,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('OPACXSLTDetailsDisplay','default','','Enable XSL stylesheet control over details page display on OPAC','Free'), ('OPACXSLTResultsDisplay','default','','Enable XSL stylesheet control over results page display on OPAC','Free'), ('OpenLibraryCovers','0',NULL,'If ON Openlibrary book covers will be show','YesNo'), +('OpenLibrarySearch','0',NULL,'If Yes Open Library search results will show in OPAC','YesNo'), ('OrderPdfFormat','pdfformat::layout3pages','Controls what script is used for printing (basketgroups)','','free'), ('OverDriveClientKey','','Client key for OverDrive integration','30','Free'), ('OverDriveClientSecret','','Client key for OverDrive integration','30','YesNo'), diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref index 1e68153..af9dea5 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref @@ -116,6 +116,12 @@ Enhanced Content: yes: Add no: "Don't add" - cover images from Open Library to search results and item detail pages on the OPAC. + - + - pref: OpenLibrarySearch + choices: + yes: Show + no: "Don't show" + - search results from Open Library on the OPAC. Library Thing: # Awkward syntax below, due to quoting conflicts - -- 1.9.1 From srdjan at catalyst.net.nz Wed Jan 6 01:40:38 2016 From: srdjan at catalyst.net.nz (Srdjan) Date: Wed, 6 Jan 2016 13:40:38 +1300 Subject: [Koha-patches] [PATCH] bug_6624: Added Open Library Search and Read API to openlibrary.js Message-ID: <1452040838-15244-1-git-send-email-srdjan@catalyst.net.nz> --- koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js | 180 +++++++++++++++++++++++- 1 file changed, 175 insertions(+), 5 deletions(-) diff --git a/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js b/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js index 995cb6b..318576a 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js +++ b/koha-tmpl/opac-tmpl/bootstrap/js/openlibrary.js @@ -5,8 +5,7 @@ if (typeof KOHA == "undefined" || !KOHA) { /** * A namespace for OpenLibrary related functions. */ -KOHA.OpenLibrary = { - +KOHA.OpenLibrary = new function() { /** * Search all: @@ -17,7 +16,7 @@ KOHA.OpenLibrary = { * The result is asynchronously returned by OpenLibrary and catched by * olCallBack(). */ - GetCoverFromIsbn: function() { + this.GetCoverFromIsbn = function() { var bibkeys = []; $("[id^=openlibrary-thumbnail]").each(function(i) { bibkeys.push("ISBN:" + $(this).attr("class")); // id=isbn @@ -30,13 +29,13 @@ KOHA.OpenLibrary = { "&callback=KOHA.OpenLibrary.olCallBack&jscmd=data"); scriptElement.setAttribute("type", "text/javascript"); document.documentElement.firstChild.appendChild(scriptElement); - }, + } /** * Add cover pages
elements with class +"ol_readapi_book", extracts book identifiers from them (e.g. isbn, +lccn, etc.) and puts those into an asynchronous call to the Read API. +When the call returns, the results are used to add clickable links +to the "ol_readapi_book" elements found earlier. +A demonstration use of this script is available here: +http://internetarchive.github.com/read_api_extras/readapi_demo.html +*/ + +var ol_readapi_automator = +(function () { // open anonymous scope for tidiness + +// 'constants' +var readapi_bibids = ['isbn', 'lccn', 'oclc', 'olid', 'iaid', 'bibkeys']; +var magic_classname = 'ol_readapi_book'; + +// added to book divs to correlate with API results +var magic_bookid = 'ol_bookid'; +var ol_button_classname = 'ol_readapi_button'; + +// Find all book divs and concatenate ids from them to create a read +// API query url +function create_query() { + var q = 'http://openlibrary.org/api/volumes/brief/json/'; + + function add_el(i, el) { + // tag with number found so it's easy to discover later + // (necessary? just go by index?) + // (choose better name?) + $(el).attr(magic_bookid, i); + + if (i > 0) { + q += '|'; + } + q += 'id:' + i; + + for (bi in readapi_bibids) { + bibid = readapi_bibids[bi]; + if ($(el).attr(bibid)) { + q += ';' + bibid + ':' + $(el).attr(bibid); + } + } + } + + $('.' + magic_classname).each(add_el); + return q; +} + +function make_read_button(bookdata) { + buttons = { + 'full access': + "http://openlibrary.org/images/button-read-open-library.png", + 'lendable': + "http://openlibrary.org/images/button-borrow-open-library.png", + 'checked out': + "http://openlibrary.org/images/button-checked-out-open-library.png" + }; + if (bookdata.items.length == 0) { + return false; + } + first = bookdata.items[0]; + if (!(first.status in buttons)) { + return false; + } + result = '' + + ''; + return result; +} + +// Default function for decorating document elements with read API data +function default_decorate_el_fn(el, bookdata) { + // Note that 'bookdata' may be undefined, if the Read API call + // didn't return results for this book + if (!bookdata) { + decoration = 'Not found'; + } else { + decoration = make_read_button(bookdata); + } + if (decoration) { + el.innerHTML += decoration; + } +} + +function do_query(q, decorate_el_fn) { + if (!decorate_el_fn) { + decorate_el_fn = default_decorate_el_fn; + } + var starttime = (new Date()).getTime(); + + // Call a function on each
element + // with the target element and the data found for that element. + // Use decorate_el_fn if supplied, falling back to + // default_decorate_el_fn, above. + function query_callback(data, textStatus, jqXHR) { + var endtime = (new Date()).getTime(); + var duration = (endtime - starttime) / 1000; + // console.log('took ' + duration + ' seconds'); + + $('.' + magic_classname).each(function(i, el) { + var bookid = $(el).attr(magic_bookid); + if (bookid && bookid in data) { + decorate_el_fn(el, data[bookid]); + } else { + decorate_el_fn(el); + } + }); + } + + // console.log('calling ' + q); + $.ajax({ url: q, + data: { 'show_all_items': 'true' }, + dataType: 'jsonp', + success: query_callback + }); +} + +// Do stuff +var q = create_query(); +do_query(q); + +result = { + do_query: do_query, + create_query: create_query, + make_read_button: make_read_button }; + +return result; +})(); // close anonymous scope + +/* +Possible futures: +* Support alternate query targets, e.g. Hathi +* show_all_items +* show_inlibrary +* ezproxy prefix (implies show_inlibrary?) +* console debug output? (check all console.log) +*/ -- 1.9.1 From srdjan at catalyst.net.nz Fri Jan 8 07:14:37 2016 From: srdjan at catalyst.net.nz (Srdjan) Date: Fri, 8 Jan 2016 19:14:37 +1300 Subject: [Koha-patches] [PATCH] bug_8034: Restored network printer maintenance and selection Message-ID: <1452233677-4959-1-git-send-email-srdjan@catalyst.net.nz> 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 * C4::Printer - added branch count to printer queries * admin/printers.tt - show or not delete link * Restored printer maint/selection in admin zone UsePrintQueues permitting * Restored printer selection in circ/selectbranchprinter.pl UsePrintQueues permitting --- C4/Auth.pm | 53 +++++-- C4/Koha.pm | 40 ------ C4/Printer.pm | 158 +++++++++++++++++++++ admin/branches.pl | 31 ++-- admin/printers.pl | 148 ++++++++++--------- circ/circulation.pl | 11 +- circ/returns.pl | 13 +- circ/selectbranchprinter.pl | 49 ++++--- .../mysql/atomicupdate/bug_8034_printer_queues.sql | 8 ++ installer/data/mysql/kohastructure.sql | 20 +-- installer/data/mysql/sysprefs.sql | 1 + .../intranet-tmpl/prog/en/includes/admin-menu.inc | 2 +- .../intranet-tmpl/prog/en/includes/header.inc | 3 + .../prog/en/modules/admin/admin-home.tt | 6 +- .../prog/en/modules/admin/branches.tt | 18 ++- .../en/modules/admin/preferences/circulation.pref | 6 + .../prog/en/modules/admin/printers.tt | 40 ++---- .../prog/en/modules/circ/circulation.tt | 2 - .../prog/en/modules/circ/selectbranchprinter.tt | 5 +- t/db_dependent/Printer.t | 62 ++++++++ 20 files changed, 448 insertions(+), 228 deletions(-) create mode 100644 C4/Printer.pm create mode 100644 installer/data/mysql/atomicupdate/bug_8034_printer_queues.sql create mode 100644 t/db_dependent/Printer.t diff --git a/C4/Auth.pm b/C4/Auth.pm index d7be1d8..3dfe01f 100644 --- a/C4/Auth.pm +++ b/C4/Auth.pm @@ -29,6 +29,7 @@ use C4::Context; use C4::Templates; # to get the template use C4::Languages; use C4::Branch; # GetBranches +use C4::Printer qw(GetPrinterDetails); use C4::Search::History; use Koha; use Koha::AuthUtils qw(hash_password); @@ -52,7 +53,7 @@ BEGIN { @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 &checkpw_internal &checkpw_hash - &get_all_subpermissions &get_user_subpermissions + &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; @@ -398,6 +399,9 @@ sub get_template_and_user { $template->param(auth_forwarded_hash => $in->{'query'}->param('auth_forwarded_hash')); + my $userenv = C4::Context->userenv; + my $userenv_branch = $userenv ? $userenv->{"branch"} : undef; + # these template parameters are set the same regardless of $in->{'type'} # Set the using_https variable for templates @@ -411,11 +415,11 @@ 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"} : undef ), - LoginFirstname => ( C4::Context->userenv ? C4::Context->userenv->{"firstname"} : "Bel" ), - LoginSurname => C4::Context->userenv ? C4::Context->userenv->{"surname"} : "Inconnu", - emailaddress => C4::Context->userenv ? C4::Context->userenv->{"emailaddress"} : undef, - loggedinpersona => C4::Context->userenv ? C4::Context->userenv->{"persona"} : undef, + LoginBranchcode => $userenv_branch, + LoginFirstname => ( $userenv ? $userenv->{"firstname"} : undef ), + LoginSurname => $userenv ? $userenv->{"surname"} : undef, + emailaddress => $userenv ? $userenv->{"emailaddress"} : undef, + loggedinpersona => $userenv ? $userenv->{"persona"} : undef, TagsEnabled => C4::Context->preference("TagsEnabled"), hide_marc => C4::Context->preference("hide_marc"), item_level_itypes => C4::Context->preference('item-level_itypes'), @@ -440,7 +444,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"} : undef ), + LoginBranchname => ( $userenv ? $userenv->{"branchname"} : undef ), advancedMARCEditor => C4::Context->preference("advancedMARCEditor"), canreservefromotherbranches => C4::Context->preference('canreservefromotherbranches'), intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"), @@ -462,6 +466,14 @@ sub get_template_and_user { UseCourseReserves => C4::Context->preference("UseCourseReserves"), useDischarge => C4::Context->preference('useDischarge'), ); + 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' ); @@ -497,8 +509,8 @@ sub get_template_and_user { $opac_name = $1; # opac_search_limit is a branch, so we use it. } elsif ( $in->{'query'}->param('multibranchlimit') ) { $opac_name = $in->{'query'}->param('multibranchlimit'); - } 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( @@ -509,7 +521,7 @@ sub get_template_and_user { BranchCategoriesLoop => GetBranchCategories( 'searchdomain', 1, $opac_name ), LibraryName => "" . C4::Context->preference("LibraryName"), LibraryNameTitle => "" . $LibraryNameTitle, - LoginBranchname => C4::Context->userenv ? C4::Context->userenv->{"branchname"} : "", + LoginBranchname => $userenv ? $userenv->{"branchname"} : "", OPACAmazonCoverImages => C4::Context->preference("OPACAmazonCoverImages"), OPACFRBRizeEditions => C4::Context->preference("OPACFRBRizeEditions"), OpacHighlightedWords => C4::Context->preference("OpacHighlightedWords"), @@ -535,7 +547,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"), @@ -2023,7 +2035,24 @@ sub getborrowernumber { return 0; } -END { } # module clean-up code here (global destructor) +=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}; +} + 1; __END__ diff --git a/C4/Koha.pm b/C4/Koha.pm index 12ac19c..f4ea5bb 100644 --- a/C4/Koha.pm +++ b/C4/Koha.pm @@ -40,7 +40,6 @@ BEGIN { @EXPORT = qw( &slashifyDate &subfield_is_koha_internal_p - &GetPrinters &GetPrinter &GetItemTypes &getitemtypeinfo &GetItemTypesCategorized &GetItemTypesByCategory &GetSupportName &GetSupportList @@ -672,45 +671,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..e24c9b2 --- /dev/null +++ b/C4/Printer.pm @@ -0,0 +1,158 @@ +#!/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 + +my $PRINTER_SELECT_FROM = <dbh; + my $sth = $dbh->prepare($PRINTER_SELECT_FROM); + $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 .= '%'; + return C4::Context->dbh->selectall_arrayref( + "$PRINTER_SELECT_FROM + WHERE printername like ? OR printqueue like ? ORDER BY printername", + {Slice => {}}, + $searchstring, $searchstring); +} + +=head2 GetPrinterDetails + + $printer_rec = GetPrinterDetails( $printqueue ); + +=cut + +sub GetPrinterDetails { + my ( $printer ) = @_; + my $dbh = C4::Context->dbh; + return $dbh->selectrow_hashref( + "$PRINTER_SELECT_FROM + WHERE printqueue = ?", + undef, $printer); +} + +=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 printqueue = ?, printername = ?, printtype = ? WHERE printqueue = ?", undef, + $data->{printqueue}, $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 4a56f9d..d3a5158 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"; @@ -228,13 +229,10 @@ sub default { sub editbranchform { my ($branchcode,$innertemplate) = @_; - # initiate the scrolling-list to select the printers - my $printers = GetPrinters(); - my @printerloop; + my $data; my $oldprinter = ""; - # make the checkboxes..... my $catinfo = GetBranchCategories(); @@ -260,15 +258,20 @@ sub editbranchform { } $innertemplate->param( categoryloop => $catinfo ); - 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 $thisprinter ), + branchprinter => $printers->{$thisprinter}->{'printername'}, + }; + } - $innertemplate->param( printerloop => \@printerloop ); + $innertemplate->param( printerloop => \@printerloop ); + } for my $obsolete ( 'categoryname', 'categorycode', 'codedescription' ) { $innertemplate->param( @@ -304,6 +307,7 @@ sub branchinfotable { my ($branchcode,$innertemplate) = @_; my $branchinfo = $branchcode ? GetBranchInfo($branchcode) : GetBranchInfo(); + my $printers = GetPrinters(); my @loop_data = (); foreach my $branch (@$branchinfo) { # @@ -363,6 +367,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 9e0163b..b0436bc 100755 --- a/admin/printers.pl +++ b/admin/printers.pl @@ -7,17 +7,17 @@ # ALGO : # this script use an $op to know what to do. # if $op is empty or none of the above values, -# - the default screen is build (with all records, or filtered datas). -# - the user can clic on add, modify or delete record. +# - the default screen is build (with all records, or filtered datas). +# - the user can clic on add, modify or delete record. # if $op=add_form -# - if primkey exists, this is a modification,so we read the $primkey record -# - builds the add/modify form +# - if primkey exists, this is a modification,so we read the $primkey record +# - builds the add/modify form # if $op=add_validate -# - the user has just send datas, so we create/modify the record +# - the user has just send datas, so we create/modify the record # if $op=delete_form -# - we show the record having primkey=$primkey and ask for deletion validation form +# - we show the record having primkey=$primkey and ask for deletion validation form # if $op=delete_confirm -# - we delete the record having primkey=$primkey +# - we delete the record having primkey=$primkey # Copyright 2000-2002 Katipo Communications @@ -43,19 +43,7 @@ use CGI qw ( -utf8 ); 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'); @@ -78,75 +66,93 @@ my ($template, $loggedinuser, $cookie) = get_template_and_user( } ); -$template->param(searchfield => $searchfield, - script_name => $script_name); - #start the page and read in includes my $dbh = C4::Context->dbh; +my $list_printers = 1; ################## ADD_FORM ################################## # called by default. Used to create form to add or modify a record if ($op eq 'add_form') { - $template->param(add_form => 1); - #---- 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; - } - - $template->param(printqueue => $data->{'printqueue'}, - printtype => $data->{'printtype'}); - # END $OP eq ADD_FORM + $list_printers = 0; + $template->param(add_form => 1); + #---- if primkey exists, it's a modify action, so read values to modify... + my $data; + if ($searchfield) { + $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); - 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')); - } else { - my $sth=$dbh->prepare("UPDATE printers SET printqueue=?,printtype=? WHERE printername=?"); - $sth->execute($input->param('printqueue'),$input->param('printtype'),$input->param('printername')); - } - # END $OP eq ADD_VALIDATE + my $params = $input->Vars; + if ($input->param('add')){ + AddPrinter($params); + } else { + UpdatePrinter($searchfield, $params); + } + $template->param(add_validate => 1); + $searchfield = ''; +# 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=?"); - $sth->execute($searchfield); - my $data=$sth->fetchrow_hashref; - $template->param(printqueue => $data->{'printqueue'}, - printtype => $data->{'printtype'}); - # END $OP eq DELETE_CONFIRM + $list_printers = 0; + my $data=GetPrinterDetails($searchfield); + my $branches = $data->{branches}; + if ($branches && $branches > 0) { + $template->param(cannot_delete_branches => $branches); + $template->param(add_form => 1); + } else { + $template->param(delete_confirm => 1); + } + $template->param( + printqueue => $data->{'printqueue'}, + printtype => $data->{'printtype'}, + ); +# END $OP eq DELETE_CONFIRM ################## DELETE_CONFIRMED ################################## # 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); - # END $OP eq DELETE_CONFIRMED + # XXX Delete can fail + DeletePrinter($searchfield); + $template->param(delete_confirmed => 1); + $template->param(list_printers => 1); + $searchfield = ''; +# END $OP eq DELETE_CONFIRMED ################## DEFAULT ########################################### } else { # DEFAULT - $template->param(else => 1); - my ($count,$results)=StringSearch($searchfield,'web'); - my $max = ($offset+$pagesize < $count) ? $offset+$pagesize : $count; - my @loop = (@$results)[$offset..$max]; - - $template->param(loop => \@loop); - - if ($offset>0) { - $template->param(offsetgtzero => 1, - prevpage => $offset-$pagesize); - } - if ($offset+$pagesize<$count) { - $template->param(ltcount => 1, - nextpage => $offset+$pagesize); - } - + $searchfield ||= $input->param('description') || ""; } #---- END $OP eq DEFAULT +if ($list_printers) { + $template->param(list_printers => 1); + my $results=SearchPrinters($searchfield); + my $count = $results ? scalar(@$results) : 0; + my $max = ($offset+$pagesize < $count) ? $offset+$pagesize : $count; + my @loop = (@$results)[$offset..$max-1]; + + $template->param(loop => \@loop); + + if ($offset>0) { + $template->param(offsetgtzero => 1, + prevpage => $offset-$pagesize); + } + if ($offset+$pagesize<$count) { + $template->param(ltcount => 1, + nextpage => $offset+$pagesize); + } +} + +$template->param( + searchfield => $searchfield, + script_name => $script_name +); + output_html_with_http_headers $input, $cookie, $template->output; diff --git a/circ/circulation.pl b/circ/circulation.pl index 5747fbf..9ee6849 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -31,7 +31,7 @@ use C4::Output; use C4::Print; use C4::Auth qw/:DEFAULT get_session haspermission/; use C4::Branch; # GetBranches -use C4::Koha; # GetPrinter +use C4::Koha; use C4::Circulation; use C4::Utils::DataTables::Members; use C4::Members; @@ -73,12 +73,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 @@ -153,7 +147,6 @@ my $findborrower = $query->param('findborrower') || q{}; $findborrower =~ s|,| |g; $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) { @@ -600,8 +593,6 @@ $template->param( categoryname => $borrower->{'description'}, branch => $branch, branchname => GetBranchName($borrower->{'branchcode'}), - printer => $printer, - printername => $printer, was_renewed => $query->param('was_renewed') ? 1 : 0, expiry => $borrower->{'dateexpiry'}, roadtype => $roadtype, diff --git a/circ/returns.pl b/circ/returns.pl index f7fb52c..8d020bc 100755 --- a/circ/returns.pl +++ b/circ/returns.pl @@ -39,7 +39,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; @@ -83,16 +82,11 @@ if ( $query->param('print_slip') ) { ##################### #Global vars my $branches = GetBranches(); -my $printers = GetPrinters(); my $userenv = C4::Context->userenv; my $userenv_branch = $userenv->{'branch'} // ''; -my $printer = $userenv->{'branchprinter'} // ''; my $forgivemanualholdsexpire = $query->param('forgivemanualholdsexpire'); my $overduecharges = (C4::Context->preference('finesMode') && C4::Context->preference('finesMode') ne 'off'); -# -# Some code to handle the error if there is no branch or printer setting..... -# # Set up the item stack .... my %returneditems; @@ -600,19 +594,14 @@ foreach ( sort { $a <=> $b } keys %returneditems ) { } push @riloop, \%ri; } -my ($genbrname, $genprname); +my $genbrname; if (my $b = $branches->{$userenv_branch}) { $genbrname = $b->{'branchname'}; } -if (my $p = $printers->{$printer}) { - $genprname = $p->{'printername'}; -} $template->param( riloop => \@riloop, genbrname => $genbrname, - genprname => $genprname, branchname => $genbrname, - printer => $printer, errmsgloop => \@errmsgloop, exemptfine => $exemptfine, dropboxmode => $dropboxmode, diff --git a/circ/selectbranchprinter.pl b/circ/selectbranchprinter.pl index 7c0c6d7..1f53dc0 100755 --- a/circ/selectbranchprinter.pl +++ b/circ/selectbranchprinter.pl @@ -23,10 +23,10 @@ use CGI qw ( -utf8 ); 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/atomicupdate/bug_8034_printer_queues.sql b/installer/data/mysql/atomicupdate/bug_8034_printer_queues.sql new file mode 100644 index 0000000..cb0a599 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_8034_printer_queues.sql @@ -0,0 +1,8 @@ +ALTER TABLE printers DROP PRIMARY KEY; +ALTER TABLE printers MODIFY printqueue varchar(20) NOT NULL PRIMARY KEY; +ALTER TABLE printers ADD UNIQUE (printername); + +ALTER TABLE branches MODIFY branchprinter varchar(20) NULL; +ALTER TABLE branches ADD FOREIGN KEY (branchprinter) REFERENCES printers (printqueue) ON UPDATE CASCADE; + +INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('UsePrintQueues','0',NULL,NULL,'YesNo'); diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 431a541..8661d6a 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -413,10 +413,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`) + PRIMARY KEY (`branchcode`), + FOREIGN KEY (branchprinter) REFERENCES printers (printqueue) ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- @@ -1774,13 +1775,14 @@ 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`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +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; -- -- Table structure for table `printers_profile` diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index aa53139..8259ac7 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -501,6 +501,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('useDischarge','','','Allows librarians to discharge borrowers and borrowers to request a discharge','YesNo'), ('UseICU','0','1','Tell Koha if ICU indexing is in use for Zebra or not.','YesNo'), ('UseKohaPlugins','0','','Enable or disable the ability to use Koha Plugins.','YesNo'), +('UsePrintQueues','0',NULL,'Use printer queues','YesNo'), ('UseQueryParser','0',NULL,'If enabled, try to use QueryParser for queries.','YesNo'), ('UseTransportCostMatrix','0','','Use Transport Cost Matrix when filling holds','YesNo'), ('UseWYSIWYGinSystemPreferences','0','','Show WYSIWYG editor when editing certain HTML system preferences.','YesNo'), diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc index 6e6fa49..b75ae25 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc @@ -67,7 +67,7 @@
Additional parameters
    - + [% IF UsePrintQueues %]
  • Network Printers
  • [% END %]
  • Z39.50/SRU servers
  • Did you mean?
  • Columns settings
  • diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc index 50b348b..3167c98 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc @@ -59,6 +59,9 @@ [% END %] [% END %] + [% IF UsePrintQueues && PrinterName %] + - [% PrinterName %] + [% END %]