Bugzilla – Attachment 36566 Details for
Bug 13478
Force item holds only for specific biblios
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 13478: Force item holds only for specific biblios
Bug-13478-Force-item-holds-only-for-specific-bibli.patch (text/plain), 13.04 KB, created by
Marcel de Rooy
on 2015-03-05 11:17:34 UTC
(
hide
)
Description:
Bug 13478: Force item holds only for specific biblios
Filename:
MIME Type:
Creator:
Marcel de Rooy
Created:
2015-03-05 11:17:34 UTC
Size:
13.04 KB
patch
obsolete
>From 487e6262a96c5cdfac5741c50f268c19610dc091 Mon Sep 17 00:00:00 2001 >From: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> >Date: Thu, 18 Dec 2014 11:59:13 +0100 >Subject: [PATCH] Bug 13478: Force item holds only for specific biblios >Content-Type: text/plain; charset=utf-8 > >This patch adds the option to selectively force item holds for specific >biblionumbers. >The patch adds routine C4::Reserves::CheckBiblioForceItemHolds. It is >tested in Reserves.t. >The preference OPACItemHolds gets a new choice: selectiveforce. >The description of the pref is adjusted. > >Please note that this option is specifically targeted for the OPAC. Staff >users still have both possibilities. > >A follow-up report (13479) will add the possibility for staff users to >enable the forced item hold on biblio level. > >TEST PLAN: >[ 1] Run the unit test t/db_dependent/Reserves.t. >[ 2] Set OPACItemHolds to force. >[ 3] Add a hold in the OPAC; verify that you cannot place a next/av hold. >[ 4] Set OPACItemHolds to Allow. >[ 5] Add a hold in the OPAC; verify that you can place both hold types. >[ 6] Set OPACItemHolds to Do not allow. >[ 7] Add a hold in the OPAC; verify that you can only place next/av holds. >[ 8] Enable forced item holds for two biblionumbers: > UPDATE biblio SET forced_item_holds=1 WHERE biblionumber=? >[ 9] Set OPACItemHolds to Selectively force. >[10] Add a hold on three biblionumbers at once (including these two). > Verify that you have two hold types for the single biblio and that > you have only item holds for the two other biblios. > >Signed-off-by: Nick <nick@quecheelibrary.org> > >Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> >Amended: Added the column to biblio and removed the separate table. >--- > C4/Reserves.pm | 17 +++++++++++++++ > Koha/Schema/Result/Biblio.pm | 11 ++++++++- > installer/data/mysql/sysprefs.sql | 2 +- > .../prog/en/modules/admin/preferences/opac.pref | 3 +- > .../opac-tmpl/bootstrap/en/modules/opac-reserve.tt | 22 ++++++++++--------- > opac/opac-reserve.pl | 3 ++ > t/db_dependent/Reserves.t | 18 +++++++++++++++- > 7 files changed, 61 insertions(+), 15 deletions(-) > >diff --git a/C4/Reserves.pm b/C4/Reserves.pm >index f405262..476f366 100644 >--- a/C4/Reserves.pm >+++ b/C4/Reserves.pm >@@ -2434,6 +2434,23 @@ sub IsItemOnHoldAndFound { > return $found; > } > >+=head2 CheckBiblioForceItemHolds >+ >+ This subroutine returns true if item holds are forced for each biblio >+ by OPACItemHolds. If this pref is set to selective, the biblio should >+ be found in the designated table. >+ In other cases it returns undef. >+ >+=cut >+ >+sub CheckBiblioForceItemHolds { >+ my ( $biblionumber ) = @_; >+ return 1 if C4::Context->preference('OPACItemHolds') eq 'force'; >+ return if C4::Context->preference('OPACItemHolds') ne 'selectiveforce'; >+ my $rec = Koha::Database->new()->schema()->resultset('Biblio')->find( $biblionumber ); >+ return 1 if $rec && $rec->force_item_holds; >+} >+ > =head1 AUTHOR > > Koha Development Team <http://koha-community.org/> >diff --git a/Koha/Schema/Result/Biblio.pm b/Koha/Schema/Result/Biblio.pm >index 5f2e399..8fa6387 100644 >--- a/Koha/Schema/Result/Biblio.pm >+++ b/Koha/Schema/Result/Biblio.pm >@@ -89,6 +89,11 @@ __PACKAGE__->table("biblio"); > data_type: 'mediumtext' > is_nullable: 1 > >+=head2 force_item_holds >+ >+ data_type: 'tinyint' >+ is_nullable: 1 >+ > =cut > > __PACKAGE__->add_columns( >@@ -121,6 +126,8 @@ __PACKAGE__->add_columns( > { data_type => "date", datetime_undef_if_invalid => 1, is_nullable => 0 }, > "abstract", > { data_type => "mediumtext", is_nullable => 1 }, >+ "force_item_holds", >+ { data_type => "tinyint", is_nullable => 1 }, > ); > > =head1 PRIMARY KEY >@@ -328,8 +335,8 @@ Composing rels: L</oai_sets_biblios> -> set > __PACKAGE__->many_to_many("sets", "oai_sets_biblios", "set"); > > >-# Created by DBIx::Class::Schema::Loader v0.07025 @ 2013-10-14 20:56:21 >-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:0//8OGf7OteNnwT03g4QsA >+# Created by DBIx::Class::Schema::Loader v0.07036 @ 2015-03-05 11:43:19 >+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:E+zNAx8qgwQKSj7JaYyDHg > > __PACKAGE__->belongs_to( > "biblioitem", >diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql >index 9020b4b..6566f48 100644 >--- a/installer/data/mysql/sysprefs.sql >+++ b/installer/data/mysql/sysprefs.sql >@@ -262,7 +262,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` > ('OpacHiddenItems','','','This syspref allows to define custom rules for hiding specific items at opac. See docs/opac/OpacHiddenItems.txt for more informations.','Textarea'), > ('OpacHighlightedWords','1','','If Set, then queried words are higlighted in OPAC','YesNo'), > ('OpacHoldNotes','0','','Show hold notes on OPAC','YesNo'), >-('OPACItemHolds','1','0|1|force','Allow OPAC users to place hold on specific items. If No, users can only request next available copy. If Yes, users can choose between next available and specific copy. If Force, users *must* choose a specific copy.','Choice'), >+('OPACItemHolds','1','0|1|force|selectiveforce','Allow OPAC users to place hold on specific items. If No, users can only request next available copy. If Yes, users can choose between next available and specific copy. If Force, users *must* choose a specific copy. Selectiveforce works on specific biblios.','Choice'), > ('OpacItemLocation','callnum','callnum|ccode|location','Show the shelving location of items in the opac','Choice'), > ('OPACItemsResultsDisplay','0','','If OFF : show only the status of items in result list.If ON : show full location of items (branch+location+callnumber) as in staff interface','YesNo'), > ('OpacKohaUrl','1',NULL,'Show \'Powered by Koha\' text on OPAC footer.',NULL), >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref >index f0c0951..1205439 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref >@@ -499,7 +499,8 @@ OPAC: > no: "Don't allow" > yes: Allow > force: Force >- - patrons to place holds on specific items in the OPAC. If this is disabled, users can only put a hold on the next available item. If this is forced, users must put a hold on a specific item. >+ selectiveforce: Selectively force >+ - patrons to place holds on specific items in the OPAC. If this is disabled, users can only put a hold on the next available item. If this is forced, users must put a hold on a specific item. The 'selective force'-option works with a list of biblios with forced item holds. > - > - pref: OpacRenewalAllowed > choices: >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt >index a0442be..4696637 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt >@@ -119,7 +119,7 @@ > <div id="bigloop"> > > [% FOREACH bibitemloo IN bibitemloop %] >- <div class="holdrow"> >+ <div class="holdrow" id="holdrow_[% bibitemloo.biblionumber %]"> > <p> > [% IF ( bibitemloo.holdable ) %] > <input class="reserve_mode" name="reserve_mode" type="hidden" value="single"/> >@@ -249,7 +249,7 @@ > </li> > [% END # / IF OpacHoldNotes %] > >- [% IF OPACItemHolds == '1' or OPACItemHolds == 'force' %] >+ [% IF OPACItemHolds %] > <!-- ITEM HOLDS --> > <li class="lradio place_on_type" style="display:none;"> > <label class="radio inline" for="reqany_[% bibitemloo.biblionumber %]">Next available item</label> >@@ -268,7 +268,7 @@ > /> > [% END %] > <label class="radio inline" for="reqspecific_[% bibitemloo.biblionumber %]">A specific item</label> >- [% IF OPACItemHolds == "force" %] >+ [% IF bibitemloo.force_item_holds %] > <input type="radio" name="reqtype_[% bibitemloo.biblionumber %]" > id="reqspecific_[% bibitemloo.biblionumber %]" > class="selectspecific" >@@ -286,7 +286,7 @@ > [% END # / IF OPACItemHolds %] > </ul> > >- [% IF OPACItemHolds == '1' || OPACItemHolds == 'force' %] >+ [% IF OPACItemHolds %] > <table class="copiesrow table table-bordered table-striped" id="copiesrow_[% bibitemloo.biblionumber %]"> > <caption>Select a specific item:</caption> > <tr> >@@ -466,8 +466,8 @@ > // Hides all 'specific copy' table rows on load. > $(".copiesrow").hide(); > >- [% IF OPACItemHolds == 'force' %] >- [% FOREACH bibitemloo IN bibitemloop %] >+ [% FOREACH bibitemloo IN bibitemloop %] >+ [% IF bibitemloo.force_item_holds %] > [% IF bibitemloo.holdable %] > $("#toggle-hold-options-[% bibitemloo.biblionumber %]").click(); > $("#copiesrow_[% bibitemloo.biblionumber %]").show(); >@@ -529,15 +529,17 @@ > > $("#place_on_hdr").show(); > >- [% IF OPACItemHolds == '1' %] >- $(".place_on_type").show(); >+ [% FOREACH bibitemloo IN bibitemloop %] >+ [% IF OPACItemHolds == '1' OR !bibitemloo.force_item_holds %] >+ $("#holdrow_[% bibitemloo.biblionumber %]").find(".place_on_type").show(); > // onload, selectany is checked >- $(".selectany").attr("checked", "checked"); >+ $("#holdrow_[% bibitemloo.biblionumber %]").find(".selectany").attr("checked", "checked"); >+ [% END %] > [% END %] > > // If the user is *allowed* to choose a specific item > // The first one is preselected >- [% IF OPACItemHolds =="1" %] >+ [% IF OPACItemHolds %] > $("table.copiesrow").each(function(){ > var id = suffixOf($(this).attr("id"), "_"); > select_first_available(id); >diff --git a/opac/opac-reserve.pl b/opac/opac-reserve.pl >index b714368..26e527e 100755 >--- a/opac/opac-reserve.pl >+++ b/opac/opac-reserve.pl >@@ -561,6 +561,9 @@ foreach my $biblioNum (@biblionumbers) { > > if( $biblioLoopIter{holdable} ){ $anyholdable++; } > >+ $biblioLoopIter{force_item_holds} = >+ C4::Reserves::CheckBiblioForceItemHolds( $biblioNum ); >+ > push @$biblioLoop, \%biblioLoopIter; > } > >diff --git a/t/db_dependent/Reserves.t b/t/db_dependent/Reserves.t >index 4676a60..d4be510 100755 >--- a/t/db_dependent/Reserves.t >+++ b/t/db_dependent/Reserves.t >@@ -17,7 +17,7 @@ > > use Modern::Perl; > >-use Test::More tests => 53; >+use Test::More tests => 57; > > use MARC::Record; > use DateTime::Duration; >@@ -506,6 +506,22 @@ is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 'OK', "Res > ####### EO Bug 13113 <<< > #### > >+#Tests for CheckBiblioForceItemHolds >+$dbh->do('UPDATE biblio SET force_item_holds=NULL WHERE biblionumber=?',undef,($bibnum)); >+C4::Context->set_preference('OPACItemHolds', 'force'); >+is( C4::Reserves::CheckBiblioForceItemHolds($bibnum), 1, >+ 'If OPACItemHolds==force, each bib should force item holds'); >+C4::Context->set_preference('OPACItemHolds', 'selectiveforce'); >+isnt( C4::Reserves::CheckBiblioForceItemHolds($bibnum), 1, >+ 'For selectiveforce this bib should not be found'); >+$dbh->do('UPDATE biblio SET force_item_holds=1 WHERE biblionumber=?',undef,($bibnum)); >+is( C4::Reserves::CheckBiblioForceItemHolds($bibnum), 1, >+ 'For selectiveforce this bib should be found now'); >+C4::Context->set_preference('OPACItemHolds', '1'); >+isnt( C4::Reserves::CheckBiblioForceItemHolds($bibnum), 1, >+ 'For Allow this bib should return false again'); >+#End of tests for CheckBiblioForceItemHolds >+ > $dbh->rollback; > > sub count_hold_print_messages { >-- >1.7.7.6
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 13478
:
34513
|
34947
|
34948
|
36193
|
36237
|
36238
|
36566
|
36567
|
36866
|
36867