[Rt-commit] r10256 - in rt/branches/3.6-EXPERIMENTAL-ABERDEEN: html/Admin/RuleManager html/Callbacks/RuleManager/Admin/Elements/QueueTabs html/Callbacks/RuleManager/Admin/Elements/SystemTabs html/Callbacks/RuleManager/Admin/Global/index.html lib/RT/Action lib/RT/Extension

audreyt at bestpractical.com audreyt at bestpractical.com
Sun Jan 6 06:35:23 EST 2008


Author: audreyt
Date: Sun Jan  6 06:35:23 2008
New Revision: 10256

Modified:
   rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/Elements/RuleManagerTabs
   rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/RuleManager/Modify.html
   rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/RuleManager/index.html
   rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Elements/QueueTabs/Default
   rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Elements/SystemTabs/Default
   rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Global/index.html/Default
   rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Action/RuleManager.pm
   rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Extension/RuleManager.pm

Log:
* Rule Manager: Allow for per-queue rules.

Modified: rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/Elements/RuleManagerTabs
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/Elements/RuleManagerTabs	(original)
+++ rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/Elements/RuleManagerTabs	Sun Jan  6 06:35:23 2008
@@ -45,32 +45,46 @@
 %# those contributions and any derivatives thereof.
 %# 
 %# END BPS TAGGED BLOCK }}}
-<& /Admin/Elements/Tabs, 
-    subtabs => $tabs,
-    current_tab => 'Admin/RuleManager/', 
-    current_subtab => $current_tab, 
-    Title => $Title &>
+% if ($QueueObj) {
+<& /Admin/Elements/QueueTabs,
+    id             => $QueueObj->Id,
+    QueueObj       => $QueueObj,
+    current_tab    => "Admin/RuleManager/?Queue=$Queue",
+    current_subtab => $current_subtab,
+    subtabs        => $tabs,
+    Title          => $Title,
+&>
+% } else {
+<& /Admin/Elements/SystemTabs,
+    subtabs         => $tabs,
+    current_tab     => "Admin/RuleManager/?Queue=$Queue", 
+    current_subtab  => $current_tab, 
+    Title           => $Title,
+&>
+% }
+
 <%INIT>
 my $tabs;
 if ($id) {
     $tabs->{'R'} = {
         title     => loc('Rule #[_1]', $id),
-        path      => "Admin/RuleManager/Modify.html?id=".$id,
+        path      => "Admin/RuleManager/Modify.html?Queue=$Queue&id=$id",
     };
 }
 if (
     $session{'CurrentUser'}->HasRight(Right =>'ModifyTemplate', Object => $RT::System)
 ) {
   $tabs->{"A"} = { title => loc('Select rule'),
-  		     	path => "Admin/RuleManager/",
+  		     	path => "Admin/RuleManager/?Queue=$Queue",
 			   };
   $tabs->{"B"} = { title => loc('New rule'),
-  		     	path => "Admin/RuleManager/Modify.html?Create=1",
+  		     	path => "Admin/RuleManager/Modify.html?Queue=$Queue&Create=1",
 		separator => 1,
 	};
 }
-  # Now let callbacks add their extra tabs
-  $m->comp('/Elements/Callback', tabs => $tabs, %ARGS);
+
+# Now let callbacks add their extra tabs
+$m->comp('/Elements/Callback', tabs => $tabs, %ARGS);
 
 foreach my $tab ( sort keys %{$tabs->{'this'}->{'subtabs'}} ) {  
     if ( $tabs->{'this'}->{'subtabs'}->{$tab}->{'path'} eq $current_tab ) {
@@ -78,13 +92,26 @@
         $tabs->{'this'}->{'subtabs'}->{$tab}->{"current_subtab"} = $current_subtab; 
     }                                                                           
 }   
-  $current_tab = "Admin/RuleManager/Modify.html?id=".$id if $id;
+
+$current_tab = "Admin/RuleManager/Modify.html?Queue=$Queue&id=$id" if $id;
+
+
+my $QueueObj;
+if ($Queue) {
+    $QueueObj = RT::Queue->new($session{'CurrentUser'});
+    $QueueObj->Load($Queue);
+    unless ($QueueObj->id) {
+        Abort(loc("Queue [_1] not found", $Queue));
+    }
+}
+
 </%INIT>
 <%ARGS>
-$RuleObj => undef
-$id => undef
-$current_tab => undef
-$subtabs => undef
+$RuleObj        => undef
+$id             => undef
+$current_tab    => undef
+$subtabs        => undef
 $current_subtab => undef
-$Title => undef
+$Title          => undef
+$Queue          => undef
 </%ARGS>

Modified: rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/RuleManager/Modify.html
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/RuleManager/Modify.html	(original)
+++ rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/RuleManager/Modify.html	Sun Jan  6 06:35:23 2008
@@ -46,17 +46,22 @@
 %# 
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => $title &>
-<& /Admin/Elements/RuleManagerTabs, id => $RuleObj ? $RuleObj->Id : 0,
-    RuleObj => $RuleObj,
-    current_tab => $current_tab, 
-    Title => $title &>
+<& /Admin/Elements/RuleManagerTabs,
+    id          => $RuleObj ? $RuleObj->Id : 0,
+    RuleObj     => $RuleObj,
+    current_tab => $current_tab,
+    Title       => $title,
+    Queue       => $Queue,
+&>
 <& /Elements/ListActions, actions => \@results &>
 
 <form action="<%$RT::WebPath%>/Admin/RuleManager/Modify.html" method="post">
 % if ($Create) {
 <input type="hidden" class="hidden" name="id" value="new" />
+<input type="hidden" class="hidden" name="Queue" value="<%$Queue%>" />
 % } else {
 <input type="hidden" class="hidden" name="id" value="<%$RuleObj->Id%>" />
+<input type="hidden" class="hidden" name="Queue" value="<%$Queue%>" />
 <input type="hidden" class="hidden" name="do_update" value="1" />
 % }
 
@@ -73,7 +78,7 @@
 <td>
 <& SELF:Select,
     Name    => 'Field',
-    Options => [RT::Extension::RuleManager::FieldOptions()],
+    Options => [$rm->FieldOptions],
     Default => ($Create ? '' : $RuleObj->Field),
 &>
 </td>
@@ -91,7 +96,7 @@
 <td>
 <& SELF:Select,
     Name    => 'Handler',
-    Options => [RT::Extension::RuleManager::HandlerOptions()],
+    Options => [$rm->HandlerOptions],
     Default => ($Create ? '' : $RuleObj->Handler),
     Refresh => 1,
 &>
@@ -109,7 +114,7 @@
 % } elsif ($1 eq 'queue') {
 <& /Elements/SelectQueue, Name => 'Argument', Default => $default, ShowNullOption => 1 &>
 % } elsif ($1 eq 'user') {
-<& /Elements/SelectOwner, Name => 'Argument', Default => $default, DefaultValue => 1 &>
+<& /Elements/SelectOwner, Name => 'Argument', Default => $default, DefaultValue => 1, QueueObj => $QueueObj &>
 % } else {
 <input name="Argument" value="<% $default %>" />
 % }
@@ -136,30 +141,48 @@
 require RT::Extension::RuleManager;
 my $current_tab;
 my $RuleObj;
+my $QueueObj;
 my ($title, @results);
+my $rm = RT::Extension::RuleManager->new($Queue);
+
+if ($Queue) {
+    $QueueObj = RT::Queue->new($session{'CurrentUser'});
+    $QueueObj->Load($Queue);
+}
 
 $Create = 1 if not defined $id;
 
 if ($Create) {
-    $current_tab = 'Admin/RuleManager/Modify.html?Create=1';
-    $title = loc("Create a rule");
+    $current_tab = "Admin/RuleManager/Modify.html?Queue=$Queue&Create=1";
+    if ($Queue) {
+        $title = loc("Create a rule for queue [_1]", $QueueObj->Name);
+    }
+    else {
+        $title = loc("Create a rule for all queues");
+    }
 }
 else {
     if ($id eq 'new') {
-        $RuleObj = RT::Extension::RuleManager->create(%ARGS);
+        $RuleObj = $rm->create(%ARGS);
         push @results, loc('Rule created.');
     }
     elsif ($id =~ /^\d+$/) {
-        $RuleObj = RT::Extension::RuleManager->load($id)
-                || RT::Extension::RuleManager->named($Name)
+        $RuleObj = $rm->load($id)
+                || $rm->named($Name)
                 || Abort("Couldn't load rule '$Name'");
     }
     else {
         Abort("Couldn't load rule ''");
     }
-    $title = loc('Editing Rule #[_1]', $RuleObj->id);
+
+    if ($Queue) {
+        $title = loc('Editing Rule #[_1] for Queue [_2]', $RuleObj->id, $QueueObj->Name);
+    }
+    else {
+        $title = loc('Editing Global Rule #[_1]', $RuleObj->id);
+    }
     
-    $current_tab = 'Admin/RuleManager/Modify.html?id='.$RuleObj->id;
+    $current_tab = "Admin/RuleManager/Queue=$Queue&Modify.html?id=".$RuleObj->id;
 }
 
 if ($RuleObj and $RuleObj->Id and $do_update) {
@@ -183,9 +206,10 @@
 </%METHOD>
 
 <%ARGS>
-$id => undef
-$result => undef
-$Name => undef
-$Create => undef
+$id        => undef
+$result    => undef
+$Name      => undef
+$Create    => undef
+$Queue     => 0
 $do_update => 0
 </%ARGS>

Modified: rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/RuleManager/index.html
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/RuleManager/index.html	(original)
+++ rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Admin/RuleManager/index.html	Sun Jan  6 06:35:23 2008
@@ -46,22 +46,22 @@
 %# 
 %# END BPS TAGGED BLOCK }}}
 <& /Admin/Elements/Header, Title => loc('Rule Manager') &>
-<& /Admin/Elements/RuleManagerTabs, current_tab => 'Admin/RuleManager/', 
-    current_subtab => 'Admin/RuleManager/',
-    Title => loc('All Rules') &>
-
-<!--
-- List rules by order, with move up/down buttons as well as deletion.
-- Clicking on a rule brings Modify.html with the usual controls:
-    - Match
-    - Pattern
-    - Action
-    - Argument
-    - StopAfterProcessingIfMatched
-- Auto-vivify the action/rule/template combination?
--->
+<& /Admin/Elements/RuleManagerTabs,
+    current_tab    => "Admin/RuleManager/?Queue=$Queue",
+    current_subtab => "Admin/RuleManager/?Queue=$Queue",
+    Title          => $title,
+    Queue          => $Queue
+&>
 
-<h2><&|/l&>Select a rule</&>:</h2>
+<h2><&|/l&>Current Rules</&></h2>
+<& SELF:ShowRules, rules => $current_rules, Queue => $Queue, EffectiveQueue => $Queue &>
+
+% if ($global_rules) {
+<h2><&|/l&>Rules which apply to all queues</&></h2>
+<& SELF:ShowRules, rules => $global_rules, Queue => $Queue, EffectiveQueue => 0 &>
+% }
+
+<%METHOD ShowRules>
 %if (@$rules == 0) {
 <li><em><&|/l&>No rules found.</&></em></li>
 % } else {
@@ -70,14 +70,16 @@
 <tr valign="top"><td>
 <% $rule->Id %>.
 </td><td>
-<a href="Modify.html?id=<%$rule->id%>"><% length($rule->Name) ? $rule->Name : '(#'.$rule->Id.')' %></a>
+<a href="Modify.html?Queue=<% $EffectiveQueue %>&id=<%$rule->id%>"><% length($rule->Name) ? $rule->Name : '(#'.$rule->Id.')' %></a>
 <br />
 <tt>&gt;</tt> <strong><% $rule->Field %></strong> matches <strong><% $rule->PrettyPattern %></strong><br />
 <tt>=</tt> <% $rule->Handler %>
-% if (length(my $arg = $rule->PrettyArgument)) {
+% if ($rule->Handler =~ /:$/) {
+%     if (length(my $arg = $rule->PrettyArgument)) {
 <strong><% $rule->PrettyArgument %></strong>
-% } else {
+%     } else {
 <em>(<&|/l&>none</&>)</em>
+%     }
 % }
 % if ($rule->Final) {
 <br />
@@ -86,26 +88,51 @@
 </td>
 <td style="white-space: nowrap" width="1"
 % if ($rule->Id > 1) {
->[<a href="index.html?Raise=<% $rule->Id %>"><&|/l&>Move up</&></a>]</td
+>[<a href="index.html?EffectiveQueue=<%$EffectiveQueue%>&Queue=<% $Queue %>&Raise=<% $rule->Id %>"><&|/l&>Move up</&></a>]</td
 % }
 >
 <td style="white-space: nowrap" width="1"
 % if ($rule->Id < @$rules) {
->[<a href="index.html?Raise=<% $rule->Id+1 %>"><&|/l&>Move down</&></a>]</td
+>[<a href="index.html?EffectiveQueue=<%$EffectiveQueue%>&Queue=<% $Queue %>&Raise=<% $rule->Id+1 %>"><&|/l&>Move down</&></a>]</td
 % }
 >
-<td style="white-space: nowrap" width="1">[<a href="index.html?Delete=<% $rule->Id %>" onclick="return confirm('<&|/l&>Really delete this rule?</&>')"><&|/l&>Delete</&></a>]</td>
+<td style="white-space: nowrap" width="1">[<a href="index.html?EffectiveQueue=<%$EffectiveQueue%>&Queue=<% $Queue %>&Delete=<% $rule->Id %>" onclick="return confirm('<&|/l&>Really delete this rule?</&>')"><&|/l&>Delete</&></a>]</td>
 </tr>
 %}
-% }
 </td></tr></table>
+% }
+<%ARGS>
+$rules
+$Queue
+$EffectiveQueue
+</%ARGS>
+</%METHOD>
+
+
+
 <%INIT>
 require RT::Extension::RuleManager;
-RT::Extension::RuleManager->raise($Raise) if $Raise;
-RT::Extension::RuleManager->delete($Delete) if $Delete;
-my $rules = RT::Extension::RuleManager->rules;
+my $rm = RT::Extension::RuleManager->new($Queue);
+RT::Extension::RuleManager->new($EffectiveQueue)->raise($Raise) if $Raise;
+RT::Extension::RuleManager->new($EffectiveQueue)->delete($Delete) if $Delete;
+
+my $current_rules = $rm->rules;
+my $global_rules;
+my $title;
+
+if ($Queue) {
+    my $QueueObj = RT::Queue->new($session{'CurrentUser'});
+    $QueueObj->Load($Queue);
+    $title = loc("Manage rules for queue [_1]", $QueueObj->Name);
+    $global_rules = RT::Extension::RuleManager->new(0)->rules;
+}
+else {
+    $title = loc("Manage rules which applies to all queues");
+}
 </%INIT>
 <%ARGS>
-$Raise => undef
+$Raise  => undef
 $Delete => undef
+$Queue  => 0
+$EffectiveQueue => 0
 </%ARGS>

Modified: rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Elements/QueueTabs/Default
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Elements/QueueTabs/Default	(original)
+++ rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Elements/QueueTabs/Default	Sun Jan  6 06:35:23 2008
@@ -49,7 +49,7 @@
 $tabs->{this}{subtabs}{RuleManager} = {
     title => loc('Rule Manager'),
     path => "Admin/RuleManager/?Queue=$id",
-} if $id
+} if $id;
 </%INIT>
 <%ARGS>
 $tabs

Modified: rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Elements/SystemTabs/Default
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Elements/SystemTabs/Default	(original)
+++ rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Elements/SystemTabs/Default	Sun Jan  6 06:35:23 2008
@@ -48,7 +48,7 @@
 <%INIT>
 $tabs->{RuleManager} = {
     title => loc('Rule Manager'),
-    path => 'Admin/RuleManager/',
+    path => 'Admin/RuleManager/?Queue=0',
 };
 </%INIT>
 <%ARGS>

Modified: rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Global/index.html/Default
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Global/index.html/Default	(original)
+++ rt/branches/3.6-EXPERIMENTAL-ABERDEEN/html/Callbacks/RuleManager/Admin/Global/index.html/Default	Sun Jan  6 06:35:23 2008
@@ -48,7 +48,7 @@
 <%INIT>
 $tabs->{RuleManager} = {
     title => loc('Rule Manager'),
-    path => 'Admin/RuleManager/',
+    path => '../RuleManager/',
     text => loc('Manage global rules'),
 };
 </%INIT>

Modified: rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Action/RuleManager.pm
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Action/RuleManager.pm	(original)
+++ rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Action/RuleManager.pm	Sun Jan  6 06:35:23 2008
@@ -60,12 +60,14 @@
 }
 # }}}
 
-# Evaluate all conditions from first to last.
+# Evaluate all rules from first to last, placing queue-specific rules before global ones.
 sub Prepare {
-    my $self = shift;
-    my $rules = RT::Extension::RuleManager->rules;
+    my $self         = shift;
+    my $queue_rules  = RT::Extension::RuleManager->new($self->TicketObj->QueueObj->Id)->rules;
+    my $global_rules = RT::Extension::RuleManager->new(0)->rules;
     my @matched;
-    foreach my $rule (@$rules) {
+
+    foreach my $rule (@$queue_rules, @$global_rules) {
         next unless $self->MatchRule($rule);
         push @matched, $rule;
         last if $rule->Final;

Modified: rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Extension/RuleManager.pm
==============================================================================
--- rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Extension/RuleManager.pm	(original)
+++ rt/branches/3.6-EXPERIMENTAL-ABERDEEN/lib/RT/Extension/RuleManager.pm	Sun Jan  6 06:35:23 2008
@@ -17,6 +17,15 @@
     'Move the ticket to this queue:',       # loc
 );
 
+sub new {
+    my $class = shift;
+    my $queue = shift || 0;
+    bless \$queue => $class;
+}
+
+# Queue ID of $self
+sub queue { ${$_[0]} }
+
 sub create {
     my $self = shift;
     my %args = @_;
@@ -27,8 +36,11 @@
     } => RuleClass;
 
     my $rules = $self->rules;
-    $rec->{_root} = $rules;
-    $rec->{_pos} = 0+@$rules;
+
+    $rec->{_queue}  = $self->queue;
+    $rec->{_root}   = $rules;
+    $rec->{_pos}    = 0+@$rules;
+
     push @$rules, $rec;
     $self->_save($rules);
 
@@ -78,8 +90,9 @@
     my $self = shift;
     my $rules = $self->_load || [];
     for my $i (0..$#$rules) {
-        $rules->[$i]{_pos} = $i;
-        $rules->[$i]{_root} = $rules;
+        $rules->[$i]{_pos}   = $i;
+        $rules->[$i]{_root}  = $rules;
+        $rules->[$i]{_queue} = $self->queue;
         bless $rules->[$i] => RuleClass;
     }
     return $rules;
@@ -87,7 +100,6 @@
 
 sub _init_action {
     # This initializes the RT::Action we care about.
-    # XXX - Override the "Autoreply" scrip by default?
 
     my $action = RT::ScripAction->new($RT::SystemUser);
     $action->LoadByCol( ExecModule => 'RuleManager' );
@@ -118,6 +130,7 @@
         my %this = %$rule;
         delete $this{_pos};
         delete $this{_root};
+        delete $this{_queue};
         push @to_save, \%this;
     }
 
@@ -129,24 +142,32 @@
 sub _template {
     my $self = shift;
     my $rule_manager_template = RT::Template->new($RT::SystemUser);
-    $rule_manager_template->Load(RuleManagerTemplate);
+    $rule_manager_template->LoadQueueTemplate(
+        Name    => RuleManagerTemplate,
+        Queue   => $self->queue,
+    );
+
     if (!$rule_manager_template->Id) {
         local $YAML::Syck::ImplicitUnicode = 1;
 
         my $autoreply_template = RT::Template->new($RT::SystemUser);
-        $autoreply_template->Load('Autoreply');
+        $autoreply_template->LoadQueueTemplate(
+            Name    => 'Autoreply',
+            Queue   => $self->queue,
+        );
+
         $rule_manager_template->Create(
             Name        => RuleManagerTemplate,
             Description => RuleManagerTemplate,
-            Content     => Dump([{
+            Content     => $autoreply_template->Id ? Dump([{
                 Name        => 'Default Autoreply',
                 Field       => 'Subject',
                 Pattern     => '',
                 Handler     => 'Send the autoreply in this template:',
                 Argument    => $autoreply_template->Content,
                 Final       => ''
-            }]),
-            Queue       => 0,
+            }]) : '',
+            Queue       => $self->queue,
         );
 
         my $rule_manager_action = $self->_init_action;
@@ -192,7 +213,7 @@
         $updated ||= ($self->{$field} ne $args->{$field});
         $self->{$field} = $args->{$field};
     }
-    RT::Extension::RuleManager->_save($self->{_root}) if $updated;
+    RT::Extension::RuleManager->new($self->{_queue})->_save($self->{_root}) if $updated;
     return $updated;
 }
 
@@ -247,7 +268,7 @@
         sub Set$_ {
             return if \$_[0]{'$_'} eq \$_[1];
             \$_[0]{'$_'} = \$_[1];
-            RT::Extension::RuleManager->_save(\$_[0]{_root});
+            RT::Extension::RuleManager->new(\$_[0]{_queue})->_save(\$_[0]{_root});
         }
     ]} Fields;
 }


More information about the Rt-commit mailing list