Bug 12025 - Inventory tool fails with "Could not reads headers", or sometimes a timeout

For libraries with large numbers of records, using a file of barcodes in
the inventory tool without selecting filters to limit the catalog
selection to compare against can result in an error of "could not read
headers" or a page timeout.

When you upload a file of barcodes, and do not specify any filters on
the rest of the form, it effectively runs GetItemsForInventory() such
that *every* item in the database is returned.  On a large enough
database, this takes so long that the script times out.

The current documentation in the manual implies that if you upload a
file of barcodes, the *only* thing it does is set the date-last-seen
field.  This is not entirely true; it also tries to compare the list of
scanned items to what is expected to be seen in the list of items.

The work-around for libraries with a large number of item records is to,
when uploading a file of barcodes, to also set the filters (e.g.,
library, shelving location, call number range, etc.) to
specify the range of items that the file of barcodes corresponds to.

This patch adds a warning when a librarian attempts to upload a
barcode list file for comparison without selecting any filters
to limit the catalog selection.

Test Plan:
1) Apply this patch
2) Browse to the inventory tool
3) Click the "Choose File" button, select a file
4) Click the "Submit" button
5) You should see a warning message
6) Click "Cancel"
7) Select one of more filters
8) Click the "Submit" button
9) This time the script should proceed without triggering the warning.

Signed-off-by: Bernardo Gonzalez Kriegel <bgkriegel@gmail.com>
Work as described following test plan.
No errors

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
This commit is contained in:
Kyle Hall 2014-05-21 07:14:50 -04:00 committed by Tomas Cohen Arazi
parent 5c1599c925
commit 54e1ae7ed3

View file

@ -8,8 +8,27 @@
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.checkboxes.min.js"></script>
<script type="text/javascript">
//<![CDATA[
$(document).ready(function(){
function checkForm() {
if ( $('#uploadbarcodes').val() ) {
if ( !(
$('#branchloop').val() ||
$('#locationloop').val() ||
$('#minlocation').val() ||
$('#maxlocation').val() ||
$('#statuses input:checked').length
) ) {
return confirm(
_("You have not selected any catalog filters and are about to compare a file of barcodes to your entire catalog.") + "\n\n" +
_("For large catalogs this can result in unexpected behavior") + "\n\n" +
_("Are you sure you want to do this?")
);
}
}
return true;
}
$(document).ready(function(){
inventorydt = $('#inventoryt').dataTable($.extend(true, {}, dataTablesDefaults, {
'sPaginationType': 'full_numbers',
[% IF compareinv2barcd %]
@ -88,7 +107,7 @@ $(document).ready(function(){
[% END %]
[% UNLESS op %]
<div class="yui-g">
<form method="post" action="/cgi-bin/koha/tools/inventory.pl" enctype="multipart/form-data">
<form method="post" action="/cgi-bin/koha/tools/inventory.pl" enctype="multipart/form-data" onsubmit="return checkForm()">
<fieldset class="rows">
<legend>Use a barcode file</legend>
<ol>
@ -98,9 +117,6 @@ $(document).ready(function(){
</ol>
</fieldset>
<!-- submit button for uploaded file -->
<fieldset class="action"><input type="submit" value="Submit" class="button" /></fieldset>
<fieldset class="rows">
<legend>Select items you want to check</legend>
<ol><li>
@ -144,7 +160,7 @@ $(document).ready(function(){
</fieldset>
<fieldset class="rows">
<legend>Item statuses</legend>
<div name="statuses" style="display: block;">
<div id="statuses" style="display: block;">
[% FOREACH status IN statuses %]
[% IF (status.values) %]
<fieldset style="float: left; padding: 5px; margin: 5px;text-align:right">
@ -189,7 +205,6 @@ $(document).ready(function(){
</fieldset>
<input type="hidden" name="op" value="do_it" />
<!-- repeat submit button for generating shelf list -->
<fieldset class="action"><input type="submit" value="Submit" class="button" /></fieldset>
</form>
</div>