From Request Tracker Wiki
Revision as of 14:17, 22 November 2010 by Best Practical (talk) (1 revision: Import (2/2) from Kwiki on
Jump to navigation Jump to 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 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


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/


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

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



<%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>