- 0 Talk
-
CustomConditionSnippets
Redirected from OnCustomFieldValueChange
Contents
|
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 if $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;
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
...