Difference between revisions of "ForkIntoNewTicket"

From Request Tracker Wiki
Jump to navigation Jump to search
 
m
 
(One intermediate revision by one other user not shown)
Line 13: Line 13:
In order to install it in RT I advise you to create a $RT/local/lib/RT/Action directory and put the scrip ih this directory.
In order to install it in RT I advise you to create a $RT/local/lib/RT/Action directory and put the scrip ih this directory.


<nowiki>
<pre>
$cat $RT/local/lib/RT/Action/ForkIntoNewTicket.pm
  $cat $RT/local/lib/RT/Action/ForkIntoNewTicket.pm
   package RT::Action::ForkIntoNewTicket;
   package RT::Action::ForkIntoNewTicket;
   use strict;
   use strict;
Line 91: Line 91:
  die $@ if ($@ &amp;&amp; $@ !~ qr{^Can't locate RT/Action/ForkIntoNewTicket_Local.pm});
  die $@ if ($@ &amp;&amp; $@ !~ qr{^Can't locate RT/Action/ForkIntoNewTicket_Local.pm});
  1;
  1;
</nowiki>
</pre>


== installation ==
== installation ==
Line 97: Line 97:
Once we have created the scrip action we can inform RT of it. Execute the following script exactly one times. It will not make any output and can be removed afterwards.
Once we have created the scrip action we can inform RT of it. Execute the following script exactly one times. It will not make any output and can be removed afterwards.


  <nowiki>$cat createForkIntoNewTicket.pl
  <pre>
$cat createForkIntoNewTicket.pl
  #!/home/rt/perl/bin/perl
  #!/home/rt/perl/bin/perl
  use strict;
  use strict;
Line 128: Line 129:
             ExecModule          =&gt; 'ForkIntoNewTicket'
             ExecModule          =&gt; 'ForkIntoNewTicket'
             );
             );
</nowiki>
 
</pre>


This script have to be run to use new action in web interface.
This script have to be run to use new action in web interface.

Latest revision as of 19:18, 13 August 2016

HomePage > Contributions > ForkIntoNewTicket

ForkIntoNewTicket

Summary

I use this scrip associated with a condition scrip that only catch correspondence/comment to a closed ticket. This scrip create a new ticket based on the correspondence/comment (subject,to,from,data).

It also copy attachments, and add links beetween the two tickets.

The scrip action

In order to install it in RT I advise you to create a $RT/local/lib/RT/Action directory and put the scrip ih this directory.

  $cat $RT/local/lib/RT/Action/ForkIntoNewTicket.pm
  package RT::Action::ForkIntoNewTicket;
  use strict;
  use base qw(RT::Action::Generic);
  #What does this type of Action doeszxczxc
  # {{{ sub Describe
  sub Describe  {
     my $self = shift;
     return (ref $self . " Fork into a new ticket, the last correspondence / comment.");
  }
  # }}}
  # {{{ sub Prepare
  sub Prepare  {
     # nothing to prepare
     return 1;
  }
  # }}}
  sub Commit {
     my $self = shift;
     my $ticket = $self->TicketObj;
     my $transaction = $self->TransactionObj;
     ## retrieve original message
     my $MIMEObj = MIME::Entity->build(To       => $transaction->Attachments->First->GetHeader('To'),
                                       From     => $transaction->Attachments->First->GetHeader('From'),
                                       Subject  => $transaction->Subject,
                                       Date     => $transaction->Attachments->First->GetHeader('Date'),
                                       Encoding => '-SUGGEST',
                                       Data     => 'Réponse reçue concernant le ticket résolu #'.$ticket->Id.":\n\n".$transaction->Content
                                       );

    RT::I18N::SetMIMEEntityToUTF8($MIMEObj);
    ## don't forget the attachments
    my $transaction_content_obj = $transaction->ContentObj;
    my $attachments = $transaction->Attachments;
    while (my $attachment = $attachments->Next) {
        # don't attach blank file
        next unless ($attachment->ContentLength || $attachment->Filename);
        # don't attach the message itself...
        next if (
                $transaction_content_obj
                && $transaction_content_obj->Id == $attachment->Id
                && $transaction_content_obj->ContentType =~ qr{text/plain}i
                );
        $MIMEObj->attach(
                         Type     => $attachment->ContentType,
                         Charset  => $attachment->OriginalEncoding,
                         Data     => $attachment->OriginalContent,
                         Filename => Encode::decode_utf8($attachment->Filename),
                         Encoding => '-SUGGEST'
                         );
    }
    # new ticket (cross link is automatic)
    my $child_ticket = RT::Ticket->new($RT::SystemUser);
    my $user = RT::User->new($RT::SystemUser);
    $user->Load($transaction->Creator);
    my $mail = $user->EmailAddress;
    my ($child_id, $child_TransObj, $errorMsg) =
        $child_ticket->Create(
                              Queue     => $ticket->Queue,
                              Subject   => '--> ticket #'.$ticket->Id.':'.$ticket->Subject,
                              RefersTo  => $ticket->Id,
                              MIMEObj   => $MIMEObj,
                              Requestor => $mail
                              );
    ## add a comment to the resolved ticket to inform that we have open a new ticket
    $ticket->Comment(
                     Content => 'Suite à la correspondance précédente, un nouveau ticket a été ouvert : ticket #'.$child_ticket->Id);
    unless ($child_id) {
            $RT::Logger->debug(">>Error : ". $errorMsg);
            return undef
    }
 }
 eval "require RT::Action::ForkIntoNewTicket_Vendor";
 die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/ForkIntoNewTicket_Vendor.pm});
 eval "require RT::Action::ForkIntoNewTicket_Local";
 die $@ if ($@ && $@ !~ qr{^Can't locate RT/Action/ForkIntoNewTicket_Local.pm});
 1;

installation

Once we have created the scrip action we can inform RT of it. Execute the following script exactly one times. It will not make any output and can be removed afterwards.

 $cat createForkIntoNewTicket.pl
 #!/home/rt/perl/bin/perl
 use strict;
 use Unicode::String qw(utf8 latin1);
 # Replace this with your RT_LIB_PATH
 use lib "/home/rt/rt/lib";
 # Replace this with your RT_ETC_PATH
 use lib "/home/rt/rt/etc";
 use RT;
 use RT::Interface::CLI qw( CleanEnv GetCurrentUser );
 use RT::ScripAction;
 ##########################################################################
 ### RT CLI initialization
 CleanEnv();
 RT::LoadConfig();
 RT::Init();
 ##Drop setgid permissions
 RT::DropSetGIDPermissions();
 ##Get the current user all loaded
 our $CurrentUser = GetCurrentUser();
 unless( $CurrentUser->Id )
 {
   print "No RT user found. Please consult your RT administrator.\n";
   exit 1;
 }
 my $sa = new RT::ScripAction($CurrentUser);
 $sa->Create(
            Name                 => "Fork la réponse dans un nouveau ticket",
            Description          => "Fork la réponse dans un nouveau ticket",
            ExecModule           => 'ForkIntoNewTicket'
            );

This script have to be run to use new action in web interface.

$ perl createNotResolvedCondition.pl

NOTE:

In RT3.2 there is no sub named DropSetGIDPermissions() in lib/RT.pm, so I commented that line and it works.

problems

If you meet problem it may be necessary to copy some files into local directory :

$cp $RT/lib/RT/base.pm $RT/local/lib/RT
$cp $RT/lib/RT/Action/Generic.pm $RT/local/lib/RT/Action

conclusion

I use it with the scrip condition ReplyToResolved with global scrip On Reply Open disabled

--