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