create ticket on custom field change, RT#10139
authormark <mark>
Wed, 17 Nov 2010 20:44:11 +0000 (20:44 +0000)
committermark <mark>
Wed, 17 Nov 2010 20:44:11 +0000 (20:44 +0000)
rt/FREESIDE_MODIFIED
rt/lib/RT/Action.pm
rt/lib/RT/Action/CreateTickets.pm
rt/lib/RT/Condition.pm
rt/lib/RT/Condition/CustomFieldChange.pm [new file with mode: 0644]
rt/lib/RT/Scrip_Overlay.pm
rt/share/html/Admin/Elements/EditScrip
rt/share/html/Admin/Elements/EditScripOptions [new file with mode: 0644]
rt/share/html/Admin/Elements/SelectScripAction
rt/share/html/Admin/Elements/SelectScripCondition

index 2200dcf..f4bf5e5 100644 (file)
@@ -11,6 +11,11 @@ config.layout.in
 lib/RT/CustomField.pm #CheckMandatoryFields
 lib/RT/CustomField_Overlay.pm #customfield date patch
 lib/RT/Interface/Web.pm #customfield date patch
+lib/RT/Action.pm
+lib/RT/Condition.pm
+lib/RT/Scrip_Overlay.pm
+lib/RT/Action/CreateTickets.pm
+lib/RT/Condition/CustomFieldChange.pm
 lib/RT/Interface/Web_Vendor.pm
  lib/RT/Interface/Web/Handler.pm #freeside comp_root for dashboard emails
  lib/RT/Record.pm #and customfield date patch
@@ -27,6 +32,10 @@ lib/RT/URI/freeside/XMLRPC.pm
  share/html/autohandler #Footer getting appended where unwelcome
  share/html/index.html #option to redirect to ticket display on quick create
  share/html/Admin/CustomFields/Modify.html #CheckMandatoryFields
+ share/html/Admin/Elements/EditScrip
+ share/html/Admin/Elements/EditScripOptions
+ share/html/Admin/Elements/SelectScripAction
+ share/html/Admin/Elements/SelectScripCondition
  share/html/Admin/Users/Modify.html
  share/html/Elements/CollectionList
 share/html/Elements/EditCustomFieldDate #customfield date patch (NEW)
index 1918a7e..42bf767 100755 (executable)
@@ -204,6 +204,17 @@ sub IsApplicable  {
 }
 # }}}
 
+sub Options {
+  my $self = shift;
+  return();
+}
+
+sub Rules {
+  my $self = shift;
+  return () if !$self->ScripObj or !$self->ScripObj->ActionRules;
+  return(split "\n", $self->ScripObj->ActionRules);
+}
+
 # {{{ sub DESTROY
 sub DESTROY {
     my $self = shift;
index 4883ae3..74520ca 100644 (file)
@@ -762,6 +762,7 @@ sub ParseLines {
         FinalPriority   => $args{'finalpriority'} || 0,
         SquelchMailTo   => $args{'squelchmailto'},
         Type            => $args{'type'},
+        $self->Rules
     );
 
     if ( $args{content} ) {
@@ -1238,6 +1239,24 @@ sub PostProcess {
 
 }
 
+sub Options {
+  my $self = shift;
+  my $queues = RT::Queues->new($self->CurrentUser);
+  $queues->UnLimit;
+  my @names;
+  while (my $queue = $queues->Next) {
+    push @names, $queue->Id, $queue->Name;
+  }
+  return (
+    {
+      'name'    => 'Queue',
+      'label'   => 'In queue',
+      'type'    => 'select',
+      'options' => \@names
+    }
+  )
+}
+
 eval "require RT::Action::CreateTickets_Vendor";
 die $@ if ( $@ && $@ !~ qr{^Can't locate RT/Action/CreateTickets_Vendor.pm} );
 eval "require RT::Action::CreateTickets_Local";
index be7c4c5..dfd58e7 100755 (executable)
@@ -210,6 +210,19 @@ sub IsApplicable  {
 }
 # }}}
 
+sub Options {
+  my $self = shift;
+  return();
+}
+
+sub Rules {
+  my $self = shift;
+  return () if !$self->ScripObj or !$self->ScripObj->ConditionRules;
+  # By default, option names and values are on consecutive lines.
+  # Override this if you need anything more interesting.
+  return(split "\n", $self->ScripObj->ConditionRules);
+}
+
 # {{{ sub DESTROY
 sub DESTROY {
     my $self = shift;
diff --git a/rt/lib/RT/Condition/CustomFieldChange.pm b/rt/lib/RT/Condition/CustomFieldChange.pm
new file mode 100644 (file)
index 0000000..b9228a5
--- /dev/null
@@ -0,0 +1,56 @@
+package RT::Condition::CustomFieldChange;
+use base 'RT::Condition';
+use strict;
+
+=head2 IsApplicable
+
+If a custom field has a particular value.
+
+=cut
+
+# Based on Chuck Boeheim's code posted on the RT Wiki 3/13/06
+
+sub IsApplicable {
+    my $self = shift;
+    my $trans = $self->TransactionObj;
+    my $scrip = $self->ScripObj;
+    my %Rules = $self->Rules;
+    my ($field, $value) = @Rules{'field', 'value'};
+    return if !defined($field) or !defined($value);
+
+    if ($trans->Type eq 'Create') {
+        return 1 if $trans->TicketObj->FirstCustomFieldValue($field) eq $value;
+    }
+    if ($trans->Type eq 'CustomField') {
+        my $cf = RT::CustomField->new($self->CurrentUser);
+        $cf->Load($field);
+        return 1 if $trans->Field == $cf->Id and $trans->NewValue eq $value;
+    }
+    return undef;
+}
+
+sub Options {
+  my $self = shift;
+  my %args = ( 'QueueObj' => undef, @_ );
+  my $QueueObj = $args{'QueueObj'};
+  my $cfs = $QueueObj->TicketCustomFields();
+  my @fieldnames;
+  while ( my $cf = $cfs->Next ) {
+    push @fieldnames, $cf->Name, $cf->Name;
+  }
+  return (
+    { 
+      'name'    => 'field',
+      'label'   => 'Custom Field',
+      'type'    => 'select',
+      'options' => \@fieldnames,
+    },
+    {
+      'name'    => 'value',
+      'label'   => 'Value',
+      'type'    => 'text',
+    },
+  );
+}
+1;
+
index 6c2cbd5..b5beb34 100644 (file)
@@ -103,6 +103,8 @@ sub Create {
         CustomPrepareCode      => undef,
         CustomCommitCode       => undef,
         CustomIsApplicableCode => undef,
+        ConditionRules         => undef,
+        ActionRules            => undef,
         @_
     );
 
@@ -162,6 +164,8 @@ sub Create {
         CustomPrepareCode      => $args{'CustomPrepareCode'},
         CustomCommitCode       => $args{'CustomCommitCode'},
         CustomIsApplicableCode => $args{'CustomIsApplicableCode'},
+        ConditionRules         => $args{'ConditionRules'},
+        ActionRules            => $args{'ActionRules'},
     );
     if ( $id ) {
         return ( $id, $self->loc('Scrip Created') );
index 2bcf64d..a4e8beb 100755 (executable)
 <& /Admin/Elements/SelectScripCondition,
     Name => "Scrip-$id-ScripCondition",
     Default => $ARGS{"Scrip-$id-ScripCondition"} || $scrip->ConditionObj->Id,
+    ScripObj => $scrip,
+    Queue => $Queue,
 &></td></tr>
 
+<& /Admin/Elements/EditScripOptions,
+    Name => "Condition",
+    Default => $ARGS{"Scrip-$id-ConditionRules"} || $scrip->ConditionRules,
+    Queue => $Queue,
+    ScripX => $ARGS{"Scrip-$id-ScripCondition"} || $scrip->ConditionObj->Id,
+&>
+
 <tr><td align="right"><&|/l&>Action</&>:</td><td>
 <& /Admin/Elements/SelectScripAction,
     Name => "Scrip-$id-ScripAction",
     Default => $ARGS{"Scrip-$id-ScripAction"} || $scrip->ActionObj->Id,
+    ScripObj => $scrip,
+    Queue => $Queue,
 &></td></tr>
 
+<& /Admin/Elements/EditScripOptions,
+    Name => "Action",
+    Default => $ARGS{"Scrip-$id-ActionRules"} || $scrip->ActionRules,
+    Queue => $Queue,
+    ScripX => $ARGS{"Scrip-$id-ScripAction"} || $scrip->ActionObj->Id,
+&>
+
 <tr><td align="right"><&|/l&>Template</&>:</td><td>
 <& /Admin/Elements/SelectTemplate,
     Name => "Scrip-$id-Template",
@@ -165,6 +183,18 @@ $Queue => undef
 <%INIT>
 return ($id) unless $id;
 
+my @rules = ('ConditionRules', 'ActionRules');
+if ( exists($ARGS{"Scrip-$id-ScripCondition"}) ) {
+  foreach my $rules (@rules) {
+    my $prefix = join('-', 'Scrip', $id, $rules);
+    $ARGS{$prefix} = join("\n", map {
+      $_ =~ /^$rules-(.*)$/ ? 
+            ($1, $ARGS{$_}) : ()
+    } keys(%ARGS)
+    );
+  }
+}
+
 my $scrip = RT::Scrip->new( $session{'CurrentUser'} );
 if ( $id eq 'new' ) {
     return $scrip->Create(
@@ -177,6 +207,8 @@ if ( $id eq 'new' ) {
         CustomCommitCode       => $ARGS{"Scrip-new-CustomCommitCode"},
         CustomIsApplicableCode => $ARGS{"Scrip-new-CustomIsApplicableCode"},
         Stage                  => $ARGS{"Scrip-new-Stage"},
+        ConditionRules         => $ARGS{"Scrip-new-ConditionRules"},
+        ActionRules            => $ARGS{"Scrip-new-ActionRules"},
     );
 }
 else {
@@ -185,7 +217,8 @@ else {
         unless $scrip->id;
 
     my @attribs = qw(Queue ScripAction ScripCondition Template Stage
-        Description CustomPrepareCode CustomCommitCode CustomIsApplicableCode);
+        Description CustomPrepareCode CustomCommitCode CustomIsApplicableCode
+        ConditionRules ActionRules);
     my @results = UpdateRecordObject(
         AttributesRef   => \@attribs,
         AttributePrefix => 'Scrip-'.$scrip->Id,
diff --git a/rt/share/html/Admin/Elements/EditScripOptions b/rt/share/html/Admin/Elements/EditScripOptions
new file mode 100644 (file)
index 0000000..7b38484
--- /dev/null
@@ -0,0 +1,44 @@
+% return if !@options;
+<tr><td></td><td><table>
+% my $prefix = $Name.'Rules-';
+% foreach my $o (@options) {
+  <tr><td align="right"><% $o->{'label'} %>:</td>
+  <td>
+%   if ( $o->{'type'} eq 'text' ) {
+  <input type="text" name="<% $prefix.$o->{'name'} %>" value="<% $rules{$o->{'name'}} %>">
+%   }
+%   elsif ( $o->{'type'} eq 'select' and ref $o->{'options'} ) {
+  <select name="<% $prefix.$o->{'name'} %>">
+%     my @choices = @{ $o->{'options'} };
+%     while (@choices) {
+%       my $v = shift @choices;
+%       my $l = shift @choices;
+  <option value="<% $v %>"<% ($rules{$o->{'name'}} eq $v) ? ' SELECTED' : ''%>>
+  <% $l %></option>
+%     }
+  </select>
+%   } # else $o->{'type'}
+</td></tr>
+% } #foreach $o
+</table></td></tr>
+
+<%INIT>
+my (@options, %rules);
+if ( $ScripX ) {
+  my $ScripXObj = "RT::Scrip$Name"->new($session{'CurrentUser'});
+  $ScripXObj->Load($ScripX);
+  my $QueueObj = RT::Queue->new($session{'CurrentUser'});
+  $QueueObj->Load($Queue);
+  my $method = "Load$Name";
+  my $XObj = $ScripXObj->$method();
+  @options = $XObj->Options('QueueObj' => $QueueObj);
+  %rules = split("\n", $Default);
+}
+</%INIT>
+
+<%ARGS>
+$Name => undef
+$Default => undef
+$Queue => 0
+$ScripX => undef
+</%ARGS>
index f6d5bb2..4806590 100755 (executable)
 %# those contributions and any derivatives thereof.
 %# 
 %# END BPS TAGGED BLOCK }}}
-<select name="<%$Name%>">
+<select name="<%$Name%>"
+onchange="var idobj = document.getElementsByName('id')[0]; 
+if (idobj.value=='new') idobj.value = '';
+form.submit()">
 <option value="" 
 <% ! defined $Default && qq[ selected="selected"] |n %>
 >-</option>
index 34e700d..5167661 100755 (executable)
 %# those contributions and any derivatives thereof.
 %# 
 %# END BPS TAGGED BLOCK }}}
-<select name="<%$Name%>">
+<select name="<%$Name%>"
+onchange="var idobj = document.getElementsByName('id')[0]; 
+if (idobj.value=='new') idobj.value = '';
+form.submit()">
 <option value="" 
 <% ! defined $Default && qq[ selected="selected"] %>
 >-</option>