From d5579539d59fcf58d9814ff20930248e06df4db8 Mon Sep 17 00:00:00 2001 From: erickson Date: Thu, 26 Apr 2007 15:48:39 +0000 Subject: [PATCH] added cascading delete support for reports and templates git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_1_0@7174 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- .../src/perlmods/OpenILS/Application/Reporter.pm | 143 +++++++++++++++++++++ Open-ILS/web/reports/oils_rpt_folder_window.js | 56 ++++---- Open-ILS/web/reports/oils_rpt_vars.js | 4 +- 3 files changed, 173 insertions(+), 30 deletions(-) diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Reporter.pm b/Open-ILS/src/perlmods/OpenILS/Application/Reporter.pm index 127dbb30cb..43eb35eb15 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Reporter.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Reporter.pm @@ -154,6 +154,9 @@ sub create_template { } + + + __PACKAGE__->register_method( api_name => 'open-ils.reporter.report.create', method => 'create_report'); @@ -335,6 +338,146 @@ sub delete_template { return 1; } + + +__PACKAGE__->register_method( + api_name => 'open-ils.reporter.template.delete.cascade', + method => 'cascade_delete_template'); + +#__PACKAGE__->register_method( +# api_name => 'open-ils.reporter.template.delete.cascade.force', +# method => 'cascade_delete_template'); + +sub cascade_delete_template { + my( $self, $conn, $auth, $templateId ) = @_; + + my $e = new_rstore_editor(authtoken=>$auth, xact=>1); + return $e->die_event unless $e->checkauth; + return $e->die_event unless $e->allowed('RUN_REPORTS'); + + my $ret = cascade_delete_template_impl( + $e, $e->requestor->id, $templateId, ($self->api_name =~ /force/o) ); + return $ret if ref $ret; # some fatal event occurred + + $e->rollback if $ret == 0; + $e->commit if $ret > 0; + return $ret; +} + + +__PACKAGE__->register_method( + api_name => 'open-ils.reporter.report.delete.cascade', + method => 'cascade_delete_report'); + +#__PACKAGE__->register_method( +# api_name => 'open-ils.reporter.report.delete.cascade.force', +# method => 'cascade_delete_report'); + +sub cascade_delete_report { + my( $self, $conn, $auth, $reportId ) = @_; + + my $e = new_rstore_editor(authtoken=>$auth, xact=>1); + return $e->die_event unless $e->checkauth; + return $e->die_event unless $e->allowed('RUN_REPORTS'); + + my $ret = cascade_delete_report_impl($e, $e->requestor->id, $reportId); + return $ret if ref $ret; # some fatal event occurred + + $e->rollback if $ret == 0; + $e->commit if $ret > 0; + return $ret; +} + + +# performs a cascading template delete +# returns 2 if all data was deleted +# returns 1 if some data was deleted +# returns 0 if no data was deleted +# returns event on error +sub cascade_delete_template_impl { + my( $e, $owner, $templateId ) = @_; + + # fetch the template to delete + my $template = $e->search_reporter_template( + {id=>$templateId, owner=>$owner})->[0] or return 0; + + # fetch he attached report IDs for this owner + my $reports = $e->search_reporter_report( + {template=>$templateId, owner=>$owner},{idlist=>1}); + + # delete the attached reports + my $all_rpts_deleted = 1; + for my $r (@$reports) { + my $evt = cascade_delete_report_impl($e, $owner, $r); + return $evt if ref $evt; + $all_rpts_deleted = 0 unless $evt == 2; + } + + # fetch all reports attached to this template that + # do not belong to $owner. If there are any, we can't + # delete the template + my $alt_reports = $e->search_reporter_report( + {template=>$templateId, owner=>{"!=" => $owner}},{idlist=>1}); + + # all_rpts_deleted will be false if a report has an + # attached scheduled owned by a different user + return 1 if @$alt_reports or not $all_rpts_deleted; + + $e->delete_reporter_template($template) + or return $e->die_event; + return 2; +} + +# performs a cascading report delete +# returns 2 if all data was deleted +# returns 1 if some data was deleted +# returns 0 if no data was deleted +# returns event on error +sub cascade_delete_report_impl { + my( $e, $owner, $reportId ) = @_; + + # fetch the report to delete + my $report = $e->search_reporter_report( + {id=>$reportId, owner=>$owner})->[0] or return 0; + + # fetch the attached schedule IDs for this owner + my $scheds = $e->search_reporter_schedule( + {report=>$reportId, runner=>$owner},{idlist=>1}); + + # delete the attached schedules + for my $sched (@$scheds) { + my $evt = delete_schedule_impl($e, $sched); + return $evt if $evt; + } + + # fetch all schedules attached to this report that + # do not belong to $owner. If there are any, we can't + # delete the report + my $alt_scheds = $e->search_reporter_schedule( + {report=>$reportId, runner=>{"!=" => $owner}},{idlist=>1}); + + return 1 if @$alt_scheds; + + $e->delete_reporter_report($report) + or return $e->die_event; + + return 2; +} + + +# deletes the requested schedule +# returns undef on success, event on error +sub delete_schedule_impl { + my( $e, $schedId ) = @_; + my $s = $e->retrieve_reporter_schedule($schedId) + or return $e->die_event; + $e->delete_reporter_schedule($s) or return $e->die_event; + return undef; +} + + + + __PACKAGE__->register_method( api_name => 'open-ils.reporter.report.delete', method => 'delete_report'); diff --git a/Open-ILS/web/reports/oils_rpt_folder_window.js b/Open-ILS/web/reports/oils_rpt_folder_window.js index 2d3203d6f0..0ef55457ff 100644 --- a/Open-ILS/web/reports/oils_rpt_folder_window.js +++ b/Open-ILS/web/reports/oils_rpt_folder_window.js @@ -382,26 +382,26 @@ oilsRptFolderWindow.prototype.deleteReports = function(list, idx, callback, erri } else { - var obj = this; - var req0 = new Request(OILS_RPT_REPORT_HAS_OUTS, SESSION, report.id()); - req0.callback( - function(r0) { - var r0es = r0.getResultObject(); - if( r0es != '0' ) { - obj.deleteReports(list, ++idx, - callback, 'oils_rpt_folder_contents_report_no_delete'); - } else { +// var obj = this; +// var req0 = new Request(OILS_RPT_REPORT_HAS_OUTS, SESSION, report.id()); +// req0.callback( +// function(r0) { +// var r0es = r0.getResultObject(); +// if( r0es != '0' ) { +// obj.deleteReports(list, ++idx, +// callback, 'oils_rpt_folder_contents_report_no_delete'); +// } else { _debug('deleting report ' + report.id()); var req = new Request(OILS_RPT_DELETE_REPORT, SESSION, report.id()); req.callback(function(r) { var res = r.getResultObject(); - if( res != 1 ) return oilsRptAlertFailure(); + if( res == 0 ) return oilsRptAlertFailure(); obj.deleteReports(list, ++idx, callback, errid) }); req.send(); - } - } - ); +// } +// } +// ); req0.send(); } @@ -418,28 +418,28 @@ oilsRptFolderWindow.prototype.deleteTemplates = function(list, idx, callback, er } else { - var req0 = new Request( OILS_RPT_TEMPLATE_HAS_RPTS, SESSION, tmpl.id() ); - req0.callback( - function(r0) { - var resp = r0.getResultObject(); - - if( resp != '0' ) { - obj.deleteTemplates(list, ++idx, - callback, 'oils_rpt_folder_contents_template_no_delete'); - - } else { +// var req0 = new Request( OILS_RPT_TEMPLATE_HAS_RPTS, SESSION, tmpl.id() ); +// req0.callback( +// function(r0) { +// var resp = r0.getResultObject(); +// +// if( resp != '0' ) { +// obj.deleteTemplates(list, ++idx, +// callback, 'oils_rpt_folder_contents_template_no_delete'); +// +// } else { _debug('deleting template ' + tmpl.id()); var req = new Request(OILS_RPT_DELETE_TEMPLATE, SESSION, tmpl.id()); req.callback(function(r) { var res = r.getResultObject(); - if( res != 1 ) return oilsRptAlertFailure(); + if( res == 0 ) return oilsRptAlertFailure(); obj.deleteTemplates(list, ++idx, callback, errid) }); req.send(); - } - } - ); - req0.send(); +// } +// } +// ); +// req0.send(); } } diff --git a/Open-ILS/web/reports/oils_rpt_vars.js b/Open-ILS/web/reports/oils_rpt_vars.js index 3059786092..807361dcca 100644 --- a/Open-ILS/web/reports/oils_rpt_vars.js +++ b/Open-ILS/web/reports/oils_rpt_vars.js @@ -76,8 +76,8 @@ var OILS_RPT_DELETE_FOLDER = 'open-ils.reporter:open-ils.reporter.folder.delet var OILS_RPT_CREATE_FOLDER = 'open-ils.reporter:open-ils.reporter.folder.create'; var OILS_RPT_FETCH_ORG_FULL_PATH = 'open-ils.reporter:open-ils.reporter.org_unit.full_path'; var OILS_RPT_FETCH_ORG_TREE = 'open-ils.actor:open-ils.actor.org_tree.retrieve'; -var OILS_RPT_DELETE_TEMPLATE = 'open-ils.reporter:open-ils.reporter.template.delete'; -var OILS_RPT_DELETE_REPORT = 'open-ils.reporter:open-ils.reporter.report.delete'; +var OILS_RPT_DELETE_TEMPLATE = 'open-ils.reporter:open-ils.reporter.template.delete.cascade'; +var OILS_RPT_DELETE_REPORT = 'open-ils.reporter:open-ils.reporter.report.delete.cascade'; var OILS_RPT_DELETE_SCHEDULE = 'open-ils.reporter:open-ils.reporter.schedule.delete'; var OILS_RPT_TEMPLATE_HAS_RPTS = 'open-ils.reporter:open-ils.reporter.template_has_reports'; var OILS_RPT_REPORT_HAS_OUTS = 'open-ils.reporter:open-ils.reporter.report_has_output'; -- 2.11.0