OneTicketPerRequestor: Initial email plugin.
This commit is contained in:
parent
260747c706
commit
13d6d49af0
1 changed files with 101 additions and 0 deletions
101
lib/RT/Interface/Email/OneTicketPerRequestor.pm
Normal file
101
lib/RT/Interface/Email/OneTicketPerRequestor.pm
Normal file
|
@ -0,0 +1,101 @@
|
|||
package RT::Interface::Email::OneTicketPerRequestor;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Role::Basic 'with';
|
||||
with 'RT::Interface::Email::Role';
|
||||
|
||||
use Email::Address;
|
||||
use Encode;
|
||||
use RT::Interface::Email ();
|
||||
use RT::Plugin;
|
||||
use RT::Tickets;
|
||||
use YAML::Tiny;
|
||||
|
||||
my %QUEUES = ();
|
||||
my $plugin_self = RT::Plugin->new(name => "RT-Extension-Conservancy");
|
||||
foreach my $confdir ($plugin_self->Path("etc"), $RT::LocalEtcPath, $RT::EtcPath) {
|
||||
next unless (defined($confdir) && $confdir);
|
||||
my $conf_path = "$confdir/OneTicketPerRequestor.yml";
|
||||
if (-r $conf_path) {
|
||||
%QUEUES = %{YAML::Tiny->read($conf_path)->[0]};
|
||||
last if (%QUEUES);
|
||||
}
|
||||
}
|
||||
|
||||
# Compile the user's configuration into arguments for RT::Tickets->OrderBy.
|
||||
while (my ($key, $sort_orders) = each %QUEUES) {
|
||||
if (!ref($sort_orders)) {
|
||||
$sort_orders = [($sort_orders ? $sort_orders : ())];
|
||||
}
|
||||
if (!@$sort_orders) {
|
||||
push(@$sort_orders, "Created DESC");
|
||||
}
|
||||
$QUEUES{$key} = [map {
|
||||
my ($field, $order) = split;
|
||||
$order = uc($order || "ASC");
|
||||
[FIELD => $field, ORDER => $order];
|
||||
} @$sort_orders];
|
||||
}
|
||||
|
||||
sub ReadHeader {
|
||||
my $headers = shift;
|
||||
my $header_name = shift;
|
||||
return Encode::decode("UTF-8", $headers->get($header_name) || "");
|
||||
}
|
||||
|
||||
sub BeforeDecrypt {
|
||||
my %args = (
|
||||
Message => undef,
|
||||
RawMessage => undef,
|
||||
Actions => undef,
|
||||
Queue => undef,
|
||||
@_
|
||||
);
|
||||
|
||||
my $queue_name = $args{Queue}->Name;
|
||||
my $sort_orders = $QUEUES{$queue_name};
|
||||
if (!defined($sort_orders)) {
|
||||
return;
|
||||
}
|
||||
elsif (RT::Interface::Email::ExtractTicketId($args{Message})) {
|
||||
return;
|
||||
}
|
||||
my $headers = $args{Message}->head();
|
||||
my @from_addrs = Email::Address->parse(ReadHeader($headers, "From"));
|
||||
my $from_address;
|
||||
foreach my $address (@from_addrs) {
|
||||
$from_address = $address->address;
|
||||
last if $from_address;
|
||||
}
|
||||
unless (defined($from_address) && $from_address) {
|
||||
$RT::Logger->debug("OTPR stopping: Message has no From address (?!)");
|
||||
return;
|
||||
}
|
||||
|
||||
my $ticket_search = RT::Tickets->new($RT::SystemUser);
|
||||
$ticket_search->LimitQueue(
|
||||
OPERATOR => "=",
|
||||
VALUE => $queue_name,
|
||||
);
|
||||
$ticket_search->LimitWatcher(
|
||||
TYPE => "Requestor",
|
||||
OPERATOR => "=",
|
||||
VALUE => $from_address,
|
||||
);
|
||||
foreach my $sort_args (@$sort_orders) {
|
||||
$ticket_search->OrderBy(@$sort_args);
|
||||
}
|
||||
|
||||
my $dest_ticket = $ticket_search->First;
|
||||
if (!defined($dest_ticket)) {
|
||||
return;
|
||||
}
|
||||
$RT::Logger->info(sprintf("OTPR: Redirecting email from <%s> to ticket #%s",
|
||||
$from_address, $dest_ticket->id));
|
||||
my $subject = ReadHeader($headers, "Subject");
|
||||
$headers->replace("Subject", RT::Interface::Email::AddSubjectTag($subject, $dest_ticket->id));
|
||||
}
|
||||
|
||||
1;
|
Loading…
Reference in a new issue