RT::Action::NotifyGroup - RT Action that sends notifications


RT-Action-NotifyGroup documentation Contained in the RT-Action-NotifyGroup distribution.

Index


Code Index:

NAME

Top

RT::Action::NotifyGroup - RT Action that sends notifications to groups and/or users

DESCRIPTION

Top

RT action module that allow you to notify particular groups and/or users. Distribution is shipped with rt-notify-group-admin script that is command line tool for managing NotifyGroup scrip actions. For more more info see its documentation.

INSTALL

Top

	perl Makefile.PL
	make
	make install

METHODS

Top

SetRecipients

Sets the recipients of this message to Groups and/or Users.

AUTHOR

Top

	Ruslan U. Zakirov
	cubic@wildgate.miee.ru

COPYRIGHT

Top

SEE ALSO

Top

RT::Action::NotifyGroupAsComment, rtx-notify-group-admin


RT-Action-NotifyGroup documentation Contained in the RT-Action-NotifyGroup distribution.
package RT::Action::NotifyGroup;
use strict;

our $VERSION = '0.02';

use base qw(RT::Action::Notify);
require RT::User;
require RT::Group;

sub SetRecipients
{
	my $self = shift;

	my $arg = $self->Argument;

	my $old_arg = eval { Storable::thaw( $arg ) };
	unless( $@ ) {
		$arg = $self->__ConvertOldArg( $old_arg );
		return;
	}

	foreach( $self->__SplitArg( $arg ) ) {
		$self->_HandleArgument( $_ );
	}

	my $creator = $self->TransactionObj->CreatorObj->EmailAddress();
	unless( $RT::NotifyActor ) {
		@{ $self->{'To'} } = grep ( !/^\Q$creator\E$/, @{ $self->{'To'} } );
	}

	$self->{'seen_ueas'} = {};

	return 1;
}

sub _HandleArgument
{
	my $self = shift;
	my $instance = shift;
	
	my $obj = RT::Principal->new( $RT::SystemUser );
	$obj->Load( $instance );
	unless( $obj->id ) {
		$RT::Logger->error( "Couldn't load principal #$instance" );
		return;
	}
	if( $obj->Disabled ) {
		$RT::Logger->info( "Principal #$instance is disabled => skip" );
		return;
	}
	if( !$obj->PrincipalType ) {
		$RT::Logger->crit( "Principal #$instance has empty type" );
	} elsif( lc $obj->PrincipalType eq 'user' ) {
		$self->__HandleUserArgument( $obj->Object );
	} elsif( lc $obj->PrincipalType eq 'group' ) {
		$self->__HandleGroupArgument( $obj->Object );
	} else {
		$RT::Logger->info( "Principal #$instance has unsupported type" );
	}
	return;
}

sub __HandleUserArgument
{
	my $self = shift;
	my $obj = shift;
	
	my $uea = $obj->EmailAddress;
	unless( $uea ) {
		$RT::Logger->warning( "User #". $obj->id ." has no email address" );
		return;
	}
	$self->__PushUserAddress( $uea );
}

sub __HandleGroupArgument
{
	my $self = shift;
	my $obj = shift;

	my $members = $obj->UserMembersObj;
	while( my $m = $members->Next ) {
		$self->__HandleUserArgument( $m );
	}
}

sub __SplitArg
{
	return split /[^0-9]+/, $_[1];
}

sub __ConvertOldArg
{
	my $self = shift;
	my $arg = shift;
	my @res;
	foreach my $r ( @{ $arg } ) {
		my $obj;
		next unless $r->{'Type'};
		if( lc $r->{'Type'} eq 'user' ) {
			$obj = RT::User->new( $RT::SystemUser );
		} elsif ( lc $r->{'Type'} eq 'user' ) {
			$obj = RT::Group->new( $RT::SystemUser );
		} else {
			next;
		}
		$obj->Load( $r->{'Instance'} );
		my $id = $obj->id;
		next unless( $id );

		push @res, $id;
	}

	return join ';', @res;
}

sub __PushUserAddress
{
	my $self = shift;
	my $uea = shift;
	push( @{ $self->{'To'} }, $uea ) unless( $self->{'seen_ueas'}{ $uea }++ );
	return;
}


1;