added cascading delete support for reports and templates
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 26 Apr 2007 15:48:39 +0000 (15:48 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 26 Apr 2007 15:48:39 +0000 (15:48 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_1_0@7174 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Reporter.pm
Open-ILS/web/reports/oils_rpt_folder_window.js
Open-ILS/web/reports/oils_rpt_vars.js

index 127dbb3..43eb35e 100644 (file)
@@ -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');
index 2d3203d..0ef5545 100644 (file)
@@ -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();
        }
 }
 
index 3059786..807361d 100644 (file)
@@ -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';