[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>></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