From: Jason Stephenson Date: Fri, 9 Mar 2012 16:01:23 +0000 (-0500) Subject: Add open-ils.cat.asset.copy.batch.delete as a streaming method. X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=d57a6bc0fa037c29482eb48e0f37e01387c8798b;p=working%2FEvergreen.git Add open-ils.cat.asset.copy.batch.delete as a streaming method. Use this method with appropriate callbacks in server/cat/util.js, server/cat/copy_buckets.js, and circ/copy_status.js. This should improve the performance of batch deletes in the client and allow staff to delete more items at once. This patch requires that working/user/dyrcona/lp939535 be applied to OpenSRF in order to function properly. Signed-off-by: Jason Stephenson --- diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm index e1d2c82ced..8264e63fdc 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm @@ -1308,7 +1308,94 @@ sub acn_sms_msg { ); } +__PACKAGE__->register_method( + method => "asset_copy_batch_delete", + api_name => "open-ils.cat.asset.copy.batch.delete", + stream => 1, +); + +__PACKAGE__->register_method( + method => "asset_copy_batch_delete", + api_name => "open-ils.cat.asset.copy.batch.delete.override", + stream => 1, +); + +sub asset_copy_batch_delete { + my ($self, $client, $auth, $copy_ids) = @_; + + my $editor = new_editor(authtoken=>$auth); + return $editor->die_event unless $editor->checkauth; + + # diddle with the client: + $client->recv_timeout(300); + $client->max_chunk_size(0); + $client->max_chunk_count(0); + + # Check for override. + my $override = $self->api_name =~ /override/; + my $count = 0; + my $target = scalar(@{$copy_ids}); + my $retarget_holds = []; + my $copies = []; + + # Tell the client we've started. + $client->respond({'lookup' => [0,$target]}); + + # Retrieve copy data. + my $req = OpenSRF::AppSession->create('open-ils.cstore') + ->request( + 'open-ils.cstore.direct.asset.copy.search', + { id => $copy_ids, deleted => 'f' }, + { flesh => 1, flesh_fields => {'acp' => ['call_number']} } + ); + while (my $r = $req->recv(count=>1,timeout=>300)) { + my $acp = $r->content; + if ($acp && $U->event_code($acp)) { + return $acp; + } else { + push(@$copies, $acp); + } + $count++; + $client->respond({'lookup' => [$count,$target]}) + if (($count % 10 == 0) || $count == $target); + } + $req->finish; + + # Reset count and target: + $count = 0; + $target = scalar(@{$copies}); + $client->respond({'delete' => [$count,$target]}); + + $editor->xact_begin; + foreach my $acp (@$copies) { + my $r = $assetcom->delete_copy( + $editor, + $override, + $acp->call_number, + $acp, + $retarget_holds, + 1, + 0 + ); + if ($r && $U->event_code($r)) { + $editor->rollback; + return $r; + } else { + $count++; + $client->respond({'delete' => [$count,$target]}) if ($count % 10 == 0); + } + } + $editor->commit; + $U->simplereq( + 'open-ils.circ', + 'open-ils.circ.hold.reset.batch', + $auth, + $retarget_holds + ) if (@$retarget_holds); + $client->respond_complete({'delete' => [$count,$target]}); + return undef; +} 1; diff --git a/Open-ILS/xul/staff_client/server/cat/copy_buckets.js b/Open-ILS/xul/staff_client/server/cat/copy_buckets.js index 74fd2bfae8..8d659a7b0e 100644 --- a/Open-ILS/xul/staff_client/server/cat/copy_buckets.js +++ b/Open-ILS/xul/staff_client/server/cat/copy_buckets.js @@ -462,7 +462,9 @@ cat.copy_buckets.prototype = { ['command'], function() { try { - + var cbdata = { didoverride : false }; + var app = 'open-ils.cat'; + var name = 'open-ils.cat.asset.copy.batch.delete'; obj.list2.select_all(); JSAN.use('util.widgets'); JSAN.use('util.functional'); @@ -474,49 +476,33 @@ cat.copy_buckets.prototype = { } ); - var copies = util.functional.map_list( - list, - function (acp_id) { - return obj.network.simple_request('FM_ACP_RETRIEVE',[acp_id]); - } - ); - - for (var i = 0; i < copies.length; i++) { - copies[i].ischanged(1); - copies[i].isdeleted(1); - } - - var robj = obj.network.simple_request( - 'FM_ACP_FLESHED_BATCH_UPDATE', - [ ses(), copies, true], - null, // no callback - { - 'title' : document.getElementById('catStrings').getString('staff.cat.copy_buckets.batch.error'), - 'overridable_events' : [ - 1208 /* TITLE_LAST_COPY */, - 1227 /* COPY_DELETE_WARNING */ - ] - } - ); - if (typeof robj.ilsevent != 'undefined') { - switch(Number(robj.ilsevent)) { - case 1208 /* TITLE_LAST_COPY */ : - case 1227 /* COPY_DELETE_WARNING */ : - case 5000 /* PERM_DENIED */ : - // ignore this - break; - default: - obj.error.standard_unexpected_error_alert($('catStrings').getString('staff.cat.copy_buckets.batch.error'), robj); - } - } - + function completionCallback(r,d) { + if (!d.didoverride) { obj.render_pending_copies(); // FIXME -- need a generic refresh for lists setTimeout( function() { JSAN.use('util.widgets'); util.widgets.dispatch('change_bucket',obj.controller.view.bucket_menulist); - }, 0 - ); + }, 0); + // Stop the throbber + if (document.getElementById('network_progress')) { + if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.dec == 'function') g.menu.network_meter.dec(app,name); + } else if (typeof xulG != 'undefined') { + if (xulG && xulG.network_meter && typeof xulG.network_meter.dec == 'function') xulG.network_meter.dec(app,name); + } + } + } + + // Gentlemen! Start your throbbers! + if (document.getElementById('network_progress')) { + if (g && g.menu && g.menu.network_meter && typeof g.menu.network_meter.inc == 'function') g.menu.network_meter.inc(app,name); + } else if (typeof xulG != 'undefined') { + if (xulG && xulG.network_meter && typeof xulG.network_meter.inc == 'function') xulG.network_meter.inc(app,name); + } + + JSAN.use('cat.util'); + cat.util.asset_copy_batch_delete(list, false, $('catStrings').getString('staff.cat.copy_buckets.batch.error'), completionCallback, cbdata); + } catch(E) { alert( js2JSON(E) ); } diff --git a/Open-ILS/xul/staff_client/server/cat/util.js b/Open-ILS/xul/staff_client/server/cat/util.js index 75a37045be..58b90e05f7 100644 --- a/Open-ILS/xul/staff_client/server/cat/util.js +++ b/Open-ILS/xul/staff_client/server/cat/util.js @@ -12,7 +12,7 @@ cat.util.EXPORT_OK = [ 'render_loan_duration', 'mark_item_as_missing_pieces', 'render_callnumbers_for_bib_menu', 'render_cn_prefix_menuitems', 'render_cn_suffix_menuitems', 'render_cn_class_menu', 'render_cn_prefix_menu', 'render_cn_suffix_menu', 'transfer_specific_title_holds', - 'request_items', 'mark_for_overlay', 'get_cbs_for_bre_id' + 'request_items', 'mark_for_overlay', 'get_cbs_for_bre_id', 'asset_copy_batch_delete' ]; cat.util.EXPORT_TAGS = { ':all' : cat.util.EXPORT_OK }; @@ -1288,4 +1288,66 @@ cat.util.get_cbs_for_bre_id = function(doc_id) { } } +cat.util.asset_copy_batch_delete = function(copy_ids, override, title, completionCallback, data) { + var app = 'open-ils.cat'; + var name = 'open-ils.cat.asset.copy.batch.delete'; + if (override) name += '.override'; + + var requestOverride = function(err) { + + netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserWrite'); + var xml = '' + + '' + + ''; + + var t1 = String(err.code).replace(/&/g,'&').replace(//g,'>'); + var t2 = String(err.textcode).replace(/&/g,'&').replace(//g,'>'); + var t3 = String(err.desc).replace(/&/g,'&').replace(//g,'>'); + + xml += '' + + '' + t2 + '' + + '' + t3 + '' + ''; + + xml += '' + + '' + $('offlineStrings').getString('network.override.force.prompt') + '' + + '