Wikia

Request Tracker Wiki

CustomConditionSnippets

Comment1
860pages on
this wiki

Introduction Edit

This page introduce you with some code that can be used in Conditions and is part of CodeSnippets series of articles.

Custom conditions specifics Edit

Read WriteCustomCondition to understand basics of writing conditions.

Code Snippets Edit

Here is list of various custom conditions you can use.

On Create and variants Edit

 return 0 unless $self->TransactionObj->Type eq "Create";
 return 1;

On Create, but queue is not 'xxx' Edit

 
    return 0 unless $self->TransactionObj->Type eq "Create";
    return 0 if $self->TicketObj->QueueObj->Name eq "xxx";
    return 1;
    

On Create with status resolved Edit

If you create Ticket with status resolved then standard RT condition OnResolve wouldn't trigger.

return 0 unless $self->TransactionObj->Type eq "Create";
return 0 unless $self->TicketObj->Status eq 'resolved';
return 1;

On Correspond/Comment and variants Edit

 return 0 unless $self->TransactionObj->Type eq "Correspond";
 return 1;

On Correspond to Unowned Ticket Edit

 return 0 unless $self->TransactionObj->Type eq "Correspond";
 return 0 unless $self->TicketObj->Owner == $RT::Nobody->id;
 return 1;

Can be used in "On Correspond to Unowned Notify Admin Ccs With Admin Correspondence".

On Status Change and variants Edit

For historical reasons it's more correct to write this condition like this:

my $txn = $self->TransactionObj;
my $type = $txn->Type;
return 0 unless $type eq "Status"
    || ( $type eq 'Set' && $txn->Field eq 'Status');
return 1;

On Status Change to "resolved" Edit

my $txn = $self->TransactionObj;
my $type = $txn->Type;
return 0 unless $type eq "Status"
    || ( $type eq 'Set' && $txn->Field eq 'Status');
return 0 unless $txn->NewValue eq "resolved";
return 1;

on Status Change from "new" to "open" Edit

my $txn = $self->TransactionObj;
my $type = $txn->Type;
return 0 unless $type eq "Status"
    || ( $type eq 'Set' && $txn->Field eq 'Status');
return 0 unless $txn->OldValue eq "new";
return 0 unless $txn->NewValue eq "open";
return 1;

On Queue Change Edit

return 0 unless $self->TransactionObj->Type eq "Set";
return 0 unless $self->TransactionObj->Field eq "Queue";
return 1;

On Owner Change and variants Edit

return 0 unless $self->TransactionObj->Type eq "Set";
return 0 unless $self->TransactionObj->Field eq "Owner";
return 1;

On Owner Change from Nobody to Any Edit

my $txn = $self->TransactionObj;
return 0 unless $txn->Type eq "Set";
return 0 unless $txn->Field eq "Owner";
return 0 unless $txn->OldValue == $RT::Nobody->id;
return 1;

On Take Edit

my $txn = $self->TransactionObj;
return 0 unless $txn->Type eq "Set";
return 0 unless $txn->Field eq "Owner";
return 0 unless $txn->OldValue == $RT::Nobody->id;
return 0 unless $txn->NewValue == $txn->Creator;
return 1;

On Steal Edit

See also OnStealEnhanced

my $txn = $self->TransactionObj;
return 0 unless $txn->Type eq "Set";
return 0 unless $txn->Field eq "Owner";
return 0 if $txn->OldValue == $RT::Nobody->id;
return 0 unless $txn->NewValue == $txn->Creator;
return 1;

On Give Edit

my $txn = $self->TransactionObj;
return 0 unless $txn->Type eq "Set";
return 0 unless $txn->Field eq "Owner";
return 0 unless $txn->OldValue == $RT::Nobody->id;
return 0 if $txn->NewValue == $txn->Creator;
return 1;

On Give Up Edit

my $txn = $self->TransactionObj;
return 0 unless $txn->Type eq "Set";
return 0 unless $txn->Field eq "Owner";
return 0 unless $txn->OldValue == $txn->Creator;
return 0 unless $txn->NewValue == $RT::Nobody->id;
return 1;

On Assign Edit

my $txn = $self->TransactionObj;
return 0 unless $txn->Type eq "Set";
return 0 unless $txn->Field eq "Owner";
return 0 unless $txn->OldValue == $RT::Nobody->id;
return 0 if $txn->NewValue == $txn->Creator;
return 1;

On Re-Assign Edit

my $txn = $self->TransactionObj;
return 0 unless $txn->Type eq "Set";
return 0 unless $txn->Field eq "Owner";
return 0 if $txn->OldValue == $txn->Creator;
return 0 if $txn->NewValue == $txn->Creator;
return 1;

== Checks with acting user (actor)

 my $actor = $self->TransactionObj->CreatorObj;

On action by privileged Edit

my $actor = $self->TransactionObj->CreatorObj;
return 1 if $actor->Privileged;
return 0;

On owner's action Edit

my $actor = $self->TransactionObj->CreatorObj;
my $owner = $self->TicketObj->OwnerObj;
return 1 unless $actor->id == $owner->id;
return 0;

Checks with watchers and groups Edit

When particular email address is in requestors Edit

return 1 if $self->TicketObj->IsWatcher(
    Type => 'Requestor', Email => 'foo@bar.com'
);
return 0;

When actor is member of one or more particular groups Edit

my @enforced_groups = ("Group 1","Group 2","etc");

my $actor = $self->TransactionObj->CreatorObj;
foreach my $gname (@enforced_groups) {
  my $group = RT::Group->new( $self->CurrentUser );
  $group->LoadUserDefinedGroup( $gname );
  next unless $group->id;
  return 1 if $group->HasMemberRecursively( $actor->id );
}
return 0;

Owner is not in the group Edit

my $in_group = 'SupportManagers';

my $owner = $self->TicketObj->OwnerObj;
my $group = RT::Group->new( $self->CurrentUser );
$group->LoadUserDefinedGroup( $in_group );
return 0 if $group->HasMemberRecursively( $owner->id );

return 1;

Checks with Custom Fields Edit

When current custom field value is X Edit

 
         my $Ticket = $self->TicketObj;
        
         return 0 unless $self->TicketObj->FirstCustomFieldValue('CustomFieldName') eq 'X';
         return 1;
       

On CustomField change Edit

 return 0 unless $self->TransactionObj->Type eq 'CustomField';
 return 1;

On CustomField 'X' change Edit

 return 0 unless $self->TransactionObj->Type eq 'CustomField';
 my $cf = RT::CustomField->new( $self->CurrentUser );
 $cf->Load( $self->TransactionObj->Field );
 return 0 unless $cf->Name eq 'X';
 return 1;

On CustomField 'X' change from 'A' to 'B' Edit

 my $txn = $self->TransactionObj;
 return 0 unless $txn->Type eq 'CustomField';
 my $cf = RT::CustomField->new( $self->CurrentUser );
 $cf->Load( $txn->Field );
 return 0 unless $cf->Name eq 'X';
 return 0 unless $txn->OldValue eq 'A';
 return 0 unless $txn->NewValue eq 'B';
 return 1;

When Custom Field 'X' is set to 'A' Edit

 my $txn = $self->TransactionObj;
 my $type = $txn->Type;
 if ( $type eq 'Create' ) {
     # CF can be set on create
     return 0 unless $self->TicketObj->FirstCustomFieldValue('X') eq 'A';
 } elsif ( $type eq 'CustomField' ) {
     # CF can be changed later
     my $cf = RT::CustomField->new( $self->CurrentUser );
     $cf->Load( $txn->Field );
     return 0 unless $cf->Name eq 'X';

     return 0 unless $txn->NewValue eq 'A';
} else {
     return 0;
}
return 1;

On Correspond, set Custom Field "X" to "0" Edit

return 1;
my $ticket = $self->TicketObj;
my $cf_obj = RT::CustomField->new($RT::SystemUser);
my $cf_name = "X";
my $cf_value = "0";

$cf_obj->LoadByName( Name => $cf_name );
$RT::Logger->debug( "Loaded \$cf_obj->Name = ". $cf_obj->Name() ."\n" );
$ticket->AddCustomFieldValue( Field=>$cf_obj, Value=>$cf_value,
RecordTransaction=>0 );
return 1;

UserDefined2 (use with rt-crontool) Edit

create a file UserDefined2.pm in lib/RT/Condition

package RT::Condition::UserDefined2;
use base 'RT::Condition';
use strict;
=head2 IsApplicable

=cut

sub IsApplicable {
    my $self = shift;
    local $@;
    my $retval = eval { $self->Argument; }; warn $@ if $@;
    return ($retval);
}

RT::Base->_ImportOverlays();
1;

With this you have a powerful way to check a customized condition. You can use it like that:

bin/rt-crontool --verbose --log debug --search RT::Search::ActiveTicketsInQueue --search-arg Support --condition RT::Condition::UserDefined2 --condition-arg "if($self->TicketObj->Priority == 4){return(1);}else {return(undef);}" --action RT::Action::SetPriority --action-arg 7

This example searches all tickets in queue Support, checks if the priority is 4 and sets the priority to 7. You may use arbitrary perl-code for the condition.

add your own conditions Edit

...

Around Wikia's network

Random Wiki