CcManagers
Overview
If you have a similar group structure like the one defined in rights (see section departments of a company as groups), you might need that the users of each departments are not able to see the tickets of the queues and that managers of those departments can do. If creating a queue for each group is not an option, keep reading.
Note that I habe been using RT for over a week now; this is my very first custom action, so there might be ways of improving it.
--Gmirandaupc 10:50, December 13, 2010 (UTC)
Custom action code
Parameters
The code assumes that there is a top-level group that must be passed as a parameter (in the installation script). I call that group 'Customers', although it could be just 'Departments'. There is also a hardcoded value, the suffix of the manager groups. Each department group with managers must have a subgroup whose name is the name of the parent group succeeded by 'Mgr'.
Sample structure:
- Customers
- OrderDept
- OrderDeptMgr
- TeacherDept
- TeacherDeptMgr
- OrderDept
Install script
# To install, install CcManagers.pm in local/lib/RT/Action, and # this script in local/etc/CcManagers.install # /opt/rt3/sbin/rt-setup-database --action insert \ # --datafile /opt/rt3/local/etc/CcManagers.install #
@ScripActions = ( { Name => 'On Create Add Manager Group CC', Description => 'When a ticket is created, if the user belongs to a group under a predefined parent group (the argument), the manager subgroup will be added as Cc.', ExecModule => 'CcManagers', Argument => 'Customers' }, );
Code
Save the following code to the local action lib dir (i.e. /opt/rt3/local/lib/RT/Action) as CcManagers.pm
# # This custom action sets the users of the manager group of the ESSI or LSI # departments as CC of the ticket, depending on the group of the user that # created the ticket. # # @author Guillermo Miranda Álamo - LCLSI UPC <gmiranda@lsi.upc.edu> # @date 09/12/2010 (dd/mm/yyyy). # package RT::Action::CcManagers; use base qw(RT::Action::Generic); use RT::Groups; my $actionDesc = "On Create Add Manager Group CC"; =head2 Prepare When the ticket is created, if the user is in a group (or more) of 'Customers' (note that 'Customers' is the argument), the manager subgroup of that group will be added as Cc. It is mandatory that the managers subgroup are named with a suffix "Mgr". So if the group name is "TestingDept", the managers must be in "TestingDeptMgr", a subgroup of "TestingDept". =cut sub Prepare { my $self = shift; $RT::Logger->debug( "[" . $actionDesc . "] Custom action prep init. Argument is " . $self->Argument ); my $ticket = $self->TicketObj; my $transaction = $self->TransactionObj; #my $owner = $ticket->OwnerObj; #nobody my $owner = RT::User->new( $RT::SystemUser ); $owner->Load( $transaction->Creator ); my $queue = $ticket->QueueObj; # Change this, it should be a user-defined value my $managerSuffix = "Mgr"; # The suffix of the name of every manager group my $parentGroupName = $self->Argument; # The name of the parent group of all the departments my $parentGroupObj = RT::Group->new( $RT::SystemUser ); $parentGroupObj->LoadUserDefinedGroup( $parentGroupName ); return undef unless $parentGroupObj; my $ownerGroups = RT::Groups->new( $RT::SystemUser ); #$ownerGroups->LimitToRolesForQueue( $queue->Id ); # Doesn't seem to work $ownerGroups->LimitToUserDefinedGroups(); $ownerGroups->UnLimit(); # For each group while( my $ownerGroup = $ownerGroups->Next() ){ # If it's a department and the user is in that department if( $parentGroupObj->HasMember( $ownerGroup->Id ) ){ $RT::Logger->info( "[" . $actionDesc . "] Checking group '" . $ownerGroup->Name . "' (" . $ownerGroup->Id . ") for user " . $owner->Name . "-" . $owner->PrincipalId ); if( $ownerGroup->HasMember( $owner->Id ) ){ $RT::Logger->info( "[" . $actionDesc . "] User is member of '" . $ownerGroup->Name . "' (" . $ownerGroup->Id . ")" ); # This action will be performed for each dept the user belongs to my $groupName = $ownerGroup->Name . $managerSuffix; # $RT::Logger->info( "[" . $actionDesc . "] Manager group name should be " . $groupName ); # Retrieve the group my $groupObj = RT::Group->new( $RT::SystemUser ); $groupObj->LoadUserDefinedGroup( $groupName ); # If the group doesn't have a manager subgroup, skip if( !$groupObj ){ next; } $RT::Logger->debug( "[" . $actionDesc . "] Adding '" . $groupName ."'(" . $groupObj->Id . ") to ticket \#" .$ticket->id ); # Add the group (as a group, not every user of the group) as Cc $ticket->AddWatcher( Type => 'Cc', PrincipalId => $groupObj->PrincipalId ); } } } return 1; } sub Commit{ my $self = shift; return 1; } 1;
You can use the following install script
Scrip creation
Condition: Create Action: On Create Add Manager Group Cc Template: Global template: Blank Stage: TransactionCreate
Credits
This custom action is based on the code of OnCreateAddGroupCc and OnCreateSetDeptHeadCc.