From: mark Date: Wed, 17 Nov 2010 20:44:11 +0000 (+0000) Subject: create ticket on custom field change, RT#10139 X-Git-Tag: TORRUS_1_0_9~90 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=5ef064aeca4a22dbe38b538e65d512d5d398fe2f create ticket on custom field change, RT#10139 --- diff --git a/rt/FREESIDE_MODIFIED b/rt/FREESIDE_MODIFIED index 2200dcfa4..f4bf5e5b3 100644 --- a/rt/FREESIDE_MODIFIED +++ b/rt/FREESIDE_MODIFIED @@ -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) diff --git a/rt/lib/RT/Action.pm b/rt/lib/RT/Action.pm index 1918a7e37..42bf767e7 100755 --- a/rt/lib/RT/Action.pm +++ b/rt/lib/RT/Action.pm @@ -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; diff --git a/rt/lib/RT/Action/CreateTickets.pm b/rt/lib/RT/Action/CreateTickets.pm index 4883ae3a8..74520ca69 100644 --- a/rt/lib/RT/Action/CreateTickets.pm +++ b/rt/lib/RT/Action/CreateTickets.pm @@ -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"; diff --git a/rt/lib/RT/Condition.pm b/rt/lib/RT/Condition.pm index be7c4c56d..dfd58e757 100755 --- a/rt/lib/RT/Condition.pm +++ b/rt/lib/RT/Condition.pm @@ -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 index 000000000..b9228a50f --- /dev/null +++ b/rt/lib/RT/Condition/CustomFieldChange.pm @@ -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; + diff --git a/rt/lib/RT/Scrip_Overlay.pm b/rt/lib/RT/Scrip_Overlay.pm index 6c2cbd58e..b5beb3434 100644 --- a/rt/lib/RT/Scrip_Overlay.pm +++ b/rt/lib/RT/Scrip_Overlay.pm @@ -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') ); diff --git a/rt/share/html/Admin/Elements/EditScrip b/rt/share/html/Admin/Elements/EditScrip index 2bcf64d49..a4e8beb4a 100755 --- a/rt/share/html/Admin/Elements/EditScrip +++ b/rt/share/html/Admin/Elements/EditScrip @@ -64,14 +64,32 @@ <& /Admin/Elements/SelectScripCondition, Name => "Scrip-$id-ScripCondition", Default => $ARGS{"Scrip-$id-ScripCondition"} || $scrip->ConditionObj->Id, + ScripObj => $scrip, + Queue => $Queue, &> +<& /Admin/Elements/EditScripOptions, + Name => "Condition", + Default => $ARGS{"Scrip-$id-ConditionRules"} || $scrip->ConditionRules, + Queue => $Queue, + ScripX => $ARGS{"Scrip-$id-ScripCondition"} || $scrip->ConditionObj->Id, +&> + <&|/l&>Action: <& /Admin/Elements/SelectScripAction, Name => "Scrip-$id-ScripAction", Default => $ARGS{"Scrip-$id-ScripAction"} || $scrip->ActionObj->Id, + ScripObj => $scrip, + Queue => $Queue, &> +<& /Admin/Elements/EditScripOptions, + Name => "Action", + Default => $ARGS{"Scrip-$id-ActionRules"} || $scrip->ActionRules, + Queue => $Queue, + ScripX => $ARGS{"Scrip-$id-ScripAction"} || $scrip->ActionObj->Id, +&> + <&|/l&>Template: <& /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 index 000000000..7b3848419 --- /dev/null +++ b/rt/share/html/Admin/Elements/EditScripOptions @@ -0,0 +1,44 @@ +% return if !@options; + +% my $prefix = $Name.'Rules-'; +% foreach my $o (@options) { + + +% } #foreach $o +
<% $o->{'label'} %>: +% if ( $o->{'type'} eq 'text' ) { + +% } +% elsif ( $o->{'type'} eq 'select' and ref $o->{'options'} ) { + +% } # else $o->{'type'} +
+ +<%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); +} + + +<%ARGS> +$Name => undef +$Default => undef +$Queue => 0 +$ScripX => undef + diff --git a/rt/share/html/Admin/Elements/SelectScripAction b/rt/share/html/Admin/Elements/SelectScripAction index f6d5bb23f..48065905c 100755 --- a/rt/share/html/Admin/Elements/SelectScripAction +++ b/rt/share/html/Admin/Elements/SelectScripAction @@ -45,7 +45,10 @@ %# those contributions and any derivatives thereof. %# %# END BPS TAGGED BLOCK }}} - diff --git a/rt/share/html/Admin/Elements/SelectScripCondition b/rt/share/html/Admin/Elements/SelectScripCondition index 34e700d9e..516766157 100755 --- a/rt/share/html/Admin/Elements/SelectScripCondition +++ b/rt/share/html/Admin/Elements/SelectScripCondition @@ -45,7 +45,10 @@ %# those contributions and any derivatives thereof. %# %# END BPS TAGGED BLOCK }}} -