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