<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=CloningQueues</id>
	<title>CloningQueues - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=CloningQueues"/>
	<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=CloningQueues&amp;action=history"/>
	<updated>2026-08-22T03:31:46Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://rt-wiki.bestpractical.com/index.php?title=CloningQueues&amp;diff=526&amp;oldid=prev</id>
		<title>Admin: 2 revisions imported</title>
		<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=CloningQueues&amp;diff=526&amp;oldid=prev"/>
		<updated>2016-04-06T20:03:25Z</updated>

		<summary type="html">&lt;p&gt;2 revisions imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This provides the functionality of cloning existing queues including templates, scrips, privileges and custom fields during queue creation. It requires the modification &amp;#039;&amp;#039;&amp;#039;Admin/Queues/Modify.html&amp;#039;&amp;#039;&amp;#039; to include 2 callback points and 2 callbacks in &amp;#039;&amp;#039;&amp;#039;local/html/Callbacks/&amp;#039;&amp;#039;&amp;#039;. I can be contacted at [mailto:ccelhf@nus.edu.sg ccelhf@nus.edu.sg] to answer any queries regarding this customization.&lt;br /&gt;
&lt;br /&gt;
NOTE: this customization was only tested on RT3.6.7, please let me know if it works on other releases.&lt;br /&gt;
&lt;br /&gt;
OK -- This doesn&amp;#039;t work in 3.8.8 :) -- [[TomL]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Admin/Queues/Modify.html&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Place the following code after the &amp;quot;&amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039;&amp;quot; input field.&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;&amp;amp;amp; /Elements/Callback, %ARGS, _CallbackName =&amp;amp;gt; &amp;#039;CloneFrom&amp;#039; &amp;amp;amp;&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
and this before the &amp;quot;&amp;#039;&amp;#039;&amp;#039;Process&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Links&amp;#039;&amp;#039;&amp;#039;&amp;quot; Callback.&lt;br /&gt;
&lt;br /&gt;
 $m-&amp;amp;gt;comp(&amp;#039;/Elements/Callback&amp;#039;, %ARGS, _CallbackName =&amp;amp;gt; &amp;#039;Clone&amp;#039;, newqueue =&amp;amp;gt; $QueueObj-&amp;amp;gt;Id, clonequeue =&amp;amp;gt; $CloneQueue);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
You will need the following 2 callbacks in your &amp;#039;&amp;#039;&amp;#039;local/html/Callbacks/&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Admin/Queues/Modify.html/Clone&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;From&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 % if ( $ARGS{Create} == 1 ) {&lt;br /&gt;
 &amp;amp;lt;tr&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;td align=&amp;quot;right&amp;quot;&amp;amp;gt;Clone from: &amp;amp;lt;/td&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;td colspan=&amp;quot;3&amp;quot;&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;&amp;amp;amp; /Elements/SelectNewTicketQueue, Name=&amp;amp;gt;&amp;#039;CloneQueue&amp;#039;, ShowNullOption=&amp;amp;gt;1 &amp;amp;amp;&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/td&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/tr&amp;amp;gt;&lt;br /&gt;
 % }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Admin/Queues/Modify.html/Clone&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;amp;lt;%init&amp;amp;gt;&lt;br /&gt;
 return if ($clonequeue !~ /\d+/);&lt;br /&gt;
 &lt;br /&gt;
 my $NewQueueObj = new RT::Queue($session{&amp;#039;CurrentUser&amp;#039;});&lt;br /&gt;
 $NewQueueObj-&amp;amp;gt;Load($newqueue);&lt;br /&gt;
 &lt;br /&gt;
 my $CloneQueueObj = new RT::Queue($session{&amp;#039;CurrentUser&amp;#039;});&lt;br /&gt;
 $CloneQueueObj-&amp;amp;gt;Load($clonequeue);&lt;br /&gt;
 &lt;br /&gt;
 #### attach all custom fields from clone queue to the new queue&lt;br /&gt;
 &lt;br /&gt;
 my $objCFs = RT::ObjectCustomFields-&amp;amp;gt;new($RT::SystemUser);&lt;br /&gt;
 $objCFs-&amp;amp;gt;LimitToObjectId($clonequeue);&lt;br /&gt;
 &lt;br /&gt;
 my $objNewCF = RT::ObjectCustomField-&amp;amp;gt;new($session{&amp;#039;CurrentUser&amp;#039;});&lt;br /&gt;
 while (my $cf = $objCFs-&amp;amp;gt;Next) {&lt;br /&gt;
     $objNewCF-&amp;amp;gt;Create(ObjectId=&amp;amp;gt;$newqueue,SortOrder=&amp;amp;gt;$cf-&amp;amp;gt;SortOrder,CustomField=&amp;amp;gt;$cf-&amp;amp;gt;CustomField);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #### assign group and user privileges from clone queue to the new queue&lt;br /&gt;
 &lt;br /&gt;
 my $objACL = RT::ACL-&amp;amp;gt;new($RT::SystemUser);&lt;br /&gt;
 $objACL-&amp;amp;gt;LimitToObject($CloneQueueObj);&lt;br /&gt;
 &lt;br /&gt;
 my $objACE = RT::ACE-&amp;amp;gt;new($session{&amp;#039;CurrentUser&amp;#039;});&lt;br /&gt;
 my $objGroup = RT::Group-&amp;amp;gt;new($session{&amp;#039;CurrentUser&amp;#039;});&lt;br /&gt;
 &lt;br /&gt;
 while (my $acl = $objACL-&amp;amp;gt;Next) {&lt;br /&gt;
     $objGroup-&amp;amp;gt;LoadQueueRoleGroup(Queue=&amp;amp;gt;$newqueue, Type=&amp;amp;gt;$acl-&amp;amp;gt;PrincipalType);&lt;br /&gt;
     $objACE-&amp;amp;gt;Create(Object=&amp;amp;gt;$NewQueueObj,&lt;br /&gt;
                     PrincipalId=&amp;amp;gt;$objGroup-&amp;amp;gt;id || $acl-&amp;amp;gt;PrincipalId,&lt;br /&gt;
                     PrincipalType=&amp;amp;gt;$acl-&amp;amp;gt;PrincipalType,&lt;br /&gt;
                     RightName=&amp;amp;gt;$acl-&amp;amp;gt;RightName);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #### create templates for the new queue&lt;br /&gt;
 my $objTemplates = RT::Templates-&amp;amp;gt;new($RT::SystemUser);&lt;br /&gt;
 $objTemplates-&amp;amp;gt;LimitToQueue($clonequeue);&lt;br /&gt;
 &lt;br /&gt;
 my $objTemplate = RT::Template-&amp;amp;gt;new($session{&amp;#039;CurrentUser&amp;#039;});&lt;br /&gt;
 &lt;br /&gt;
 while (my $t = $objTemplates-&amp;amp;gt;Next) {&lt;br /&gt;
     $objTemplate-&amp;amp;gt;Create(Content=&amp;amp;gt;$t-&amp;amp;gt;Content,Queue=&amp;amp;gt;$newqueue,Description=&amp;amp;gt;$t-&amp;amp;gt;Description,Type=&amp;amp;gt;$t-&amp;amp;gt;Type,Name=&amp;amp;gt;$t-&amp;amp;gt;Name);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #### create scrips for the new queue&lt;br /&gt;
 &lt;br /&gt;
 my $objScrips = RT::Scrips-&amp;amp;gt;new($RT::SystemUser);&lt;br /&gt;
 $objScrips-&amp;amp;gt;LimitToQueue($clonequeue);&lt;br /&gt;
 &lt;br /&gt;
 my $objScrip = RT::Scrip-&amp;amp;gt;new($session{&amp;#039;CurrentUser&amp;#039;});&lt;br /&gt;
 &lt;br /&gt;
 while (my $s = $objScrips-&amp;amp;gt;Next) {&lt;br /&gt;
     my $template;&lt;br /&gt;
     $objTemplate-&amp;amp;gt;Load($s-&amp;amp;gt;Template);&lt;br /&gt;
     if ($objTemplate-&amp;amp;gt;Queue == 0) { ### global template&lt;br /&gt;
             $template = $s-&amp;amp;gt;Template;&lt;br /&gt;
     }&lt;br /&gt;
     else { ### local template, go find out which one&lt;br /&gt;
             my $objLocalTemplate = RT::Template-&amp;amp;gt;new($session{&amp;#039;CurrentUser&amp;#039;});&lt;br /&gt;
             $objLocalTemplate-&amp;amp;gt;LoadQueueTemplate(Queue=&amp;amp;gt;$newqueue,Name=&amp;amp;gt;$objTemplate-&amp;amp;gt;Name);&lt;br /&gt;
             $template = $objLocalTemplate-&amp;amp;gt;id;&lt;br /&gt;
     }&lt;br /&gt;
     $objScrip-&amp;amp;gt;Create(&lt;br /&gt;
             Queue=&amp;amp;gt;$newqueue,&lt;br /&gt;
             Description=&amp;amp;gt;$s-&amp;amp;gt;Description,&lt;br /&gt;
             ScripAction=&amp;amp;gt;$s-&amp;amp;gt;ScripAction,&lt;br /&gt;
             ScripCondition=&amp;amp;gt;$s-&amp;amp;gt;ScripCondition,&lt;br /&gt;
             CustomPrepareCode=&amp;amp;gt;$s-&amp;amp;gt;CustomPrepareCode,&lt;br /&gt;
             CustomCommitCode=&amp;amp;gt;$s-&amp;amp;gt;CustomCommitCode,&lt;br /&gt;
             CustomIsApplicableCode=&amp;amp;gt;$s-&amp;amp;gt;CustomIsApplicableCode,&lt;br /&gt;
             Stage=&amp;amp;gt;$s-&amp;amp;gt;Stage,&lt;br /&gt;
             Template=&amp;amp;gt;$template);&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;/%init&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;%args&amp;amp;gt;&lt;br /&gt;
 $newqueue =&amp;amp;gt; undef&lt;br /&gt;
 $clonequeue =&amp;amp;gt; undef&lt;br /&gt;
 &amp;amp;lt;/%args&amp;amp;gt;&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>