[rt-devel] Contrib: SetKeyword

Bruce Campbell bruce_campbell at ripe.net
Sun May 26 13:28:16 EDT 2002

The attached RT::Action and insert script will attempt to set a keyword on
the tickets based on the Template it is called with.

The usage that I created it for is:

	OnCreate SetKeyword with template Keyword_First

The contents of the template 'Keyword_First' is as follows:

	# This is a comment line and is ignored
	# Expecting KeywordSelectsName '/' KeywordDescendentName
	# Does not support more than one '/', sorry.
	Level/First Line Support

So when a ticket is created on our Operations queue, it is firstly
assigned to the First Line Support people.  Caveat - if what you type in
the Template does not match (via 'eq' operator) any keyword on the queue,
the requested Keyword won't be applied.

The Scrip allows for multiple keywords to be applied at one time.

                             Bruce Campbell                            RIPE
                   Systems/Network Engineer                             NCC
                 www.ripe.net - PGP562C8B1B                      Operations

-------------- next part --------------
# $Header: /home/rt2/etc/site_scrips/Action/RCS/SetKeyword.pm,v 1.4 2002/05/26 17:13:01 bc Exp $

package RT::Action::SetKeyword;
require RT::Action::Generic;

#What does this type of Action does

# {{{ sub Describe 
sub Describe  {
  my $self = shift;
  return (ref $self . " will add the Keywords in the Template to the ticket.");
# }}}

# {{{ sub Prepare 
sub Prepare  {
    # nothing to prepare
    return 1;
# }}}

sub Commit {
    my $self = shift;
    # split up the list.
    my $retval = undef;
    my @tsplit = split( '\n', $self->TemplateObj->Content );

    foreach my $this_one ( @tsplit ){
        # Ignore Comments.
	next if( $this_one =~ /^\s*#/ );

	# Split on the '/'.  The template should read something like:
	# 'Level/First Line Support'
        my @tsplit2 = split( '/', $this_one );

	# Did we catch anything?
	next unless defined( $tsplit2[1] );

	# Walk through the keywords on the queue.
        my $KeywordSelects = $self->TicketObj->QueueObj->KeywordSelects();

	while( my $kw = $KeywordSelects->Next ){
		# Does this keyword match part of the request?
		next unless( $kw->Name eq $tsplit2[0] );

		# Yup. Find out what kids we need.
		my $kw_kids=$kw->KeywordObj->Descendents;
		foreach my $kid( keys %{$kw_kids} ){

			# Does this kid match the second item?
			next unless( ${$kw_kids}{$kid} eq $tsplit2[1] );

			# Right.  Now add it.
			$retval += $self->TicketObj->AddKeyword( 
						KeywordSelect => $kw->id,
						Keyword => $kid );
    return( $retval );

-------------- next part --------------
#!/usr/bin/perl -w

package RT;
use strict;
use vars qw($VERSION $Handle $Nobody $SystemUser $item);

use lib "/home/rt2/lib";
use lib "/home/rt2/etc";

#This drags in RT's config.pm
use config;
use Carp;

use RT::Handle;
use RT::User;
use RT::CurrentUser;

#connect to the db
$RT::Handle = new RT::Handle($RT::DatabaseType);

#Put together a current user object so we can create a User object
my $CurrentUser = new RT::CurrentUser();

#now that we bootstrapped that little bit, we can use the standard RT cli
# helpers  to do what we need

use RT::Interface::CLI  qw(CleanEnv LoadConfig DBConnect 
			   GetCurrentUser GetMessageContent);

#Clean out all the nasties from the environment

#Load etc/config.pm and drop privs

#Connect to the database and get RT::SystemUser and RT::Nobody loaded


# {{{ ScripActions

my @ScripActions = (
			Name => 'SetKeyword',
			Description =>  'Updates ticket Keywords based on the Template Object',
			ExecModule => 'SetKeyword',
			Argument =>  '',

# }}}
print "Creating ScripActions...";

use RT::ScripAction;
for $item (@ScripActions) {
    my $new_entry = new RT::ScripAction($CurrentUser);
    my $return = $new_entry->Create(%$item);
    print $return.".";

print "done.\n";



More information about the Rt-devel mailing list