The problem is with the FindMatch function. It only checks the first
attachment. I overhauled this perl module quite a bit. Here's my version
attached. Diff this one to yours to see the differences. :-)

js.

On Tue, Jul 29, 2008 at 01:01:49PM -0400, Roy Sowa wrote:
> I am currently using RT 3.6.5 and ECFV 1.2.b3
> 
> I cannot get the extract to work if the MatchString is not in the first 
> attachment.
> I have been using ECFV for a while on basic standard type email tickets, but 
> now I have the requirement
> to extract the MatchString from an attachment. 
> 
> It does not seem to matter if the ticket is created via GUI or email.
> The simplest test being;
>    1. Create ticket using GUI with a description that has the MatchString 
> .... ( this works  CF get populated)
>    2. Create ticket using GUI without any description and attach text file 
> that contains MatchString .... ( this works  Cf gets populated)
>    3. Create ticket using GUI with general desc and attach text file with 
> MatchString ..... ( this fails  No CF populated ) 
> 
>  Questions:
>      Does ExtractCustomFieldValues work with multi part messages if the 
> matchstring is in the second attachment?
>     
>     Where did I go wrong ?
> 
>    I have read the list , and  ContentObj is what is being used.  
>   Any hints or guidance would be much appreciated. 
> 
>  Thanks in advance.
> 
>  Roy
> 
> Community help: http://wiki.bestpractical.com
> Commercial support: [EMAIL PROTECTED]
> 
> 
> Discover RT's hidden secrets with RT Essentials from O'Reilly Media. 
> Buy a copy at http://rtbook.bestpractical.com
> 

-- 
Jean-Sebastien Morisset, Sr. UNIX Administrator <[EMAIL PROTECTED]>
package RT::Action::ExtractCustomFieldValues;
require RT::Action::Generic;

use strict;
use vars qw/@ISA/;
@ISA=qw(RT::Action::Generic);

our $VERSION = 1.3;

sub Describe  {
  my $self = shift;
  return (ref $self );
}

sub Prepare {
  return (1);
}

sub Commit {
    my $self = shift;
    my $Transaction = $self->TransactionObj;
    my $FirstAttachment = $Transaction->Attachments->First;
    unless ( $FirstAttachment ) { return 1; }

    my $Ticket = $self->TicketObj;
    my $TmplText = $self->TemplateObj->Content;
    my $Queue = $Ticket->QueueObj->Id;
    my $Separator = '\|';

    for (split(/[\n\r]+/, $TmplText)) {
        chomp;
        next if (/^#/);
        next if (/^\s*$/);
        if (/^Separator=(.*)$/) {
            $Separator=$1;
            next;
        }
        my ($CustomFieldName,$InspectField,$MatchString,$PostEdit,$Options) = 
split(/$Separator/);

        my $cf;
        if ($CustomFieldName) {
            $cf = LoadCF( Field => $CustomFieldName, Queue => $Queue );
        }

        my $match = FindMatch( Field => $InspectField, 
                Match => $MatchString,
                Transaction => $Transaction,
                FirstAttachment => $FirstAttachment );

        if ($cf) {
                $RT::Logger->debug("running ProcessCF...");
                ProcessCF ( PostEdit => $PostEdit,
                        Ticket      => $Ticket,
                        Options     => $Options,
                        CustomField => $cf,
                        Match       => $match );
        } else {
                $RT::Logger->debug("running ProcessMatch...");
                ProcessMatch( PostEdit => $PostEdit, 
                        Ticket => $Ticket,
                        Options => $Options,
                        Transaction => $Transaction,
                        FirstAttachment  => $FirstAttachment,
                        Match => $match );
        }
    }
    return(1);
}

sub LoadCF {
    my %args = @_;
    my $CustomFieldName = $args{Field};
    my $Queue = $args{Queue};

    $RT::Logger->debug("load cf $CustomFieldName");
    my $cf = new RT::CustomField($RT::SystemUser);
    my ($id,$msg) = $cf->LoadByNameAndQueue (Name=>"$CustomFieldName", 
Queue=>$Queue);
    if (! $id) {
      ($id,$msg) = $cf->LoadByNameAndQueue (Name=>"$CustomFieldName", Queue=>0);
    }
    $RT::Logger->debug("load cf done: $id $msg");

    return $cf;

}

sub FindMatch {
    my %args = @_;
    my $match = '';
    if ($args{Field} =~ /^body$/i) {
        $RT::Logger->info("look for match /".$args{Match}."/ in body");

        my $Attachments = $args{Transaction}->Attachments;
        my $LastContent = '';
        my $AttachNumber = 0;

        while (my $Message = $Attachments->Next) {
                $AttachNumber++;
                $RT::Logger->info("considering attachment #".$AttachNumber." of 
type ".$Message->ContentType);
                next unless $Message->ContentType =~ 
m!^(text/plain|message|text$)!i;
                next unless $Message->Content;
                next if $LastContent eq $Message->Content;
                $RT::Logger->info("accepted attachment #".$AttachNumber." for 
consideration");
                $LastContent = $Message->Content;
                if ($Message->Content =~ /$args{Match}/m) {
                        $match = $1||$&;
                        $RT::Logger->info("matched value");
                } else {
                        $RT::Logger->debug("no match");
                }
        }
    } else {
        $RT::Logger->info("look for match in Header $args{Field} 
(".$args{FirstAttachment}->GetHeader("$args{Field}").")");
        if ($args{FirstAttachment}->GetHeader("$args{Field}") =~ 
/$args{Match}/) {
                $match = $1||$&;
                $RT::Logger->info("matched value");
        }
    }
    return $match;
}

sub ProcessCF {
        my %args = @_;
        my @values = ();
        if ($args{CustomField}->SingleValue()) {
                push @values, $args{Match};
        } else {
                @values = split(',', $args{Match});
        }

    foreach my $value (@values) {
        if ($value && $args{PostEdit}) {
            local $_ = $value; # backwards compatibility
            eval($args{PostEdit});
            $RT::Logger->info("transformed ($args{PostEdit}) value ($value)");
        }
        if ($value) {
            $RT::Logger->info("found value for cf ($value)");
            my ($id,$msg) = $args{Ticket}->AddCustomFieldValue( Field => 
$args{CustomField}, 
                Value => $value , RecordTransaction => $args{Options} =~ /q/ ? 
0 : 1);
            $RT::Logger->info("CustomFieldValue 
(".$args{CustomField}->Name.",$value) added: $id $msg");
        }
    }
}

sub ProcessMatch {
    my %args = @_;
    my $Ticket = $args{Ticket};
    my $Transaction = $args{Transaction};
    my $FirstAttachment = $args{FirstAttachment};
    if ($args{Match} && $args{PostEdit}) {
        local $_ = $args{Match}; # backwards compatibility
        eval($args{PostEdit});
        $RT::Logger->debug("ran code $args{PostEdit} $@");
    }
}

1;
_______________________________________________
http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-users

Community help: http://wiki.bestpractical.com
Commercial support: [EMAIL PROTECTED]


Discover RT's hidden secrets with RT Essentials from O'Reilly Media. 
Buy a copy at http://rtbook.bestpractical.com

Reply via email to