prevent deletion of auto-created RT scrips, #18184
authorMark Wells <mark@freeside.biz>
Wed, 17 Jul 2013 22:43:52 +0000 (15:43 -0700)
committerMark Wells <mark@freeside.biz>
Wed, 17 Jul 2013 22:43:52 +0000 (15:43 -0700)
FS/FS/TicketSystem.pm
rt/share/html/Admin/Elements/EditScrips

index 7b18575..96980e9 100644 (file)
@@ -228,30 +228,42 @@ sub _upgrade_data {
     my $desc = $s->{'Description'};
     my ($c, $a, $t) = map lc,
       @{ $s }{'ScripCondition', 'ScripAction', 'Template'};
-    # skip existing scrips
-    next if ( exists($scrip{$c}{$a}{$t}) );
-    if ( !exists($condition{$c}) ) {
-      warn "ScripCondition '$c' not found.\n";
-      next;
-    }
-    if ( !exists($action{$a}) ) {
-      warn "ScripAction '$a' not found.\n";
-      next;
-    }
-    if ( !exists($template{$t}) ) {
-      warn "Template '$t' not found.\n";
-      next;
+
+    if ( exists($scrip{$c}{$a}{$t}) ) {
+      $Scrip->Load( $scrip{$c}{$a}{$t} );
+    } else { # need to create it
+
+      if ( !exists($condition{$c}) ) {
+        warn "ScripCondition '$c' not found.\n";
+        next;
+      }
+      if ( !exists($action{$a}) ) {
+        warn "ScripAction '$a' not found.\n";
+        next;
+      }
+      if ( !exists($template{$t}) ) {
+        warn "Template '$t' not found.\n";
+        next;
+      }
+      my %new_param = (
+        ScripCondition => $condition{$c}->[0],
+        ScripAction => $action{$a}->[0],
+        Template => $template{$t}->[0],
+        Queue => 0,
+        Description => $desc,
+      );
+      warn "Creating scrip: $c $a [$t]\n";
+      my ($val, $msg) = $Scrip->Create(%new_param);
+      die $msg if !$val;
+
+    } #if $scrip{...}
+    # set the Immutable attribute on them if needed
+    if ( !$Scrip->FirstAttribute('Immutable') ) {
+      my ($val, $msg) =
+        $Scrip->SetAttribute(Name => 'Immutable', Content => '1');
+      die $msg if !$val;
     }
-    my %new_param = (
-      ScripCondition => $condition{$c}->[0],
-      ScripAction => $action{$a}->[0],
-      Template => $template{$t}->[0],
-      Queue => 0,
-      Description => $desc,
-    );
-    warn "Creating scrip: $c $a [$t]\n";
-    my ($val, $msg) = $Scrip->Create(%new_param);
-    die $msg if !$val;
+
   } #foreach (@Scrips)
 
   # one-time fix: accumulator fields (support time, etc.) that had values 
index b09eca9..25cafb4 100755 (executable)
@@ -98,17 +98,33 @@ else {
 
 # deal with modifying and deleting existing scrips
 # we still support DeleteScrip-id format but array is preferred
+
+my @not_deleted;
 foreach my $id ( grep $_, @DeleteScrip, map /^DeleteScrip-(\d+)/, keys %ARGS ) {
     my $scrip = RT::Scrip->new($session{'CurrentUser'});
     $scrip->Load( $id );
-    my ($retval, $msg) = $scrip->Delete;
-    if ($retval) {
-        push @actions, loc("Scrip deleted");
-    }
-    else {
-        push @actions, $msg;
+    my $a = $scrip->FirstAttribute('Immutable');
+    if ( defined($a) and $a->Content ) {
+        # then disable the scrip instead of deleting it
+        my ($retval, $msg) = $scrip->SetStage('Disabled');
+        if ( $retval ) {
+            push @actions, loc("Scrip disabled (cannot delete system scrips)");
+        } else {
+            push @actions, $msg;
+            push @not_deleted, $id;
+        }
+    } else { # not an immutable scrip
+        my ($retval, $msg) = $scrip->Delete;
+        if ($retval) {
+            push @actions, loc("Scrip deleted");
+        }
+        else {
+            push @actions, $msg;
+            push @not_deleted, $id;
+        }
     }
 }
+$DECODED_ARGS->{DeleteScrip} = \@not_deleted;
 </%init>
 
 <%ARGS>