CloningQueues

From Request Tracker Wiki
Jump to: navigation, search

This provides the functionality of cloning existing queues including templates, scrips, privileges and custom fields during queue creation. It requires the modification Admin/Queues/Modify.html to include 2 callback points and 2 callbacks in local/html/Callbacks/. I can be contacted at ccelhf@nus.edu.sg to answer any queries regarding this customization.

NOTE: this customization was only tested on RT3.6.7, please let me know if it works on other releases.

OK -- This doesn't work in 3.8.8 :) -- TomL

Admin/Queues/Modify.html

Place the following code after the "Description" input field.

<& /Elements/Callback, %ARGS, _CallbackName => 'CloneFrom' &>

and this before the "'Process'Links" Callback.

$m->comp('/Elements/Callback', %ARGS, _CallbackName => 'Clone', newqueue => $QueueObj->Id, clonequeue => $CloneQueue);

You will need the following 2 callbacks in your local/html/Callbacks/

'Admin/Queues/Modify.html/Clone'From

% if ( $ARGS{Create} == 1 ) {

<tr>
<td align="right">Clone from: </td>
<td colspan="3">
<& /Elements/SelectNewTicketQueue, Name=>'CloneQueue', ShowNullOption=>1 &>
</td>
</tr>
% }

and

Admin/Queues/Modify.html/Clone

<%init> return if ($clonequeue !~ /\d+/); my $NewQueueObj = new RT::Queue($session{'CurrentUser'}); $NewQueueObj->Load($newqueue); my $CloneQueueObj = new RT::Queue($session{'CurrentUser'}); $CloneQueueObj->Load($clonequeue); #### attach all custom fields from clone queue to the new queue my $objCFs = RT::ObjectCustomFields->new($RT::SystemUser); $objCFs->LimitToObjectId($clonequeue); my $objNewCF = RT::ObjectCustomField->new($session{'CurrentUser'}); while (my $cf = $objCFs->Next) { $objNewCF->Create(ObjectId=>$newqueue,SortOrder=>$cf->SortOrder,CustomField=>$cf->CustomField); } #### assign group and user privileges from clone queue to the new queue my $objACL = RT::ACL->new($RT::SystemUser); $objACL->LimitToObject($CloneQueueObj); my $objACE = RT::ACE->new($session{'CurrentUser'}); my $objGroup = RT::Group->new($session{'CurrentUser'}); while (my $acl = $objACL->Next) { $objGroup->LoadQueueRoleGroup(Queue=>$newqueue, Type=>$acl->PrincipalType); $objACE->Create(Object=>$NewQueueObj, PrincipalId=>$objGroup->id || $acl->PrincipalId, PrincipalType=>$acl->PrincipalType, RightName=>$acl->RightName); } #### create templates for the new queue my $objTemplates = RT::Templates->new($RT::SystemUser); $objTemplates->LimitToQueue($clonequeue); my $objTemplate = RT::Template->new($session{'CurrentUser'}); while (my $t = $objTemplates->Next) { $objTemplate->Create(Content=>$t->Content,Queue=>$newqueue,Description=>$t->Description,Type=>$t->Type,Name=>$t->Name); } #### create scrips for the new queue my $objScrips = RT::Scrips->new($RT::SystemUser); $objScrips->LimitToQueue($clonequeue); my $objScrip = RT::Scrip->new($session{'CurrentUser'}); while (my $s = $objScrips->Next) { my $template; $objTemplate->Load($s->Template); if ($objTemplate->Queue == 0) { ### global template $template = $s->Template; } else { ### local template, go find out which one my $objLocalTemplate = RT::Template->new($session{'CurrentUser'}); $objLocalTemplate->LoadQueueTemplate(Queue=>$newqueue,Name=>$objTemplate->Name); $template = $objLocalTemplate->id; } $objScrip->Create( Queue=>$newqueue, Description=>$s->Description, ScripAction=>$s->ScripAction, ScripCondition=>$s->ScripCondition, CustomPrepareCode=>$s->CustomPrepareCode, CustomCommitCode=>$s->CustomCommitCode, CustomIsApplicableCode=>$s->CustomIsApplicableCode, Stage=>$s->Stage, Template=>$template); } </%init> <%args> $newqueue => undef $clonequeue => undef </%args>