[Rt-devel] could there be a REST/ticket creation bug?

Kim Jones vtplymblfan-rt at yahoo.com
Fri May 22 14:28:05 EDT 2009


I first posted the message below to rt-users thinking I was doing something wrong in my application's PHP code that is trying to submit a REST request to RT.... but having added debugging comments to RT code I think possibly there could be a bug? Please read and then look below for the rest of this message...


________________________________
From: "vtplymblfan-rt at yahoo.com" <vtplymblfan-rt at yahoo.com>
To: rt-users at lists.bestpractical.com
Sent: Tuesday, May 19, 2009 12:53:21 PM
Subject: [rt-users] any ideas why this post with php CURL not setting custom field?

Hi there,

I
have modified a web application to post to RT's web interface a create
ticket request. The post works perfectly... the ticket get created in
the right queue with the given subject and text... except that the
custom field value I pass (UPC) in does not get set. Here is the CURL
code:

----

    $content = 'id: new
CF-UPC: 786936180992
Text: This is the ticket text
Subject: This is the subject
Queue: External App Requests';

    $request = RT_LOCATION;
    $request .= 'ticket/new/';

    $postargs = array(
       'user' => RT_USER,
       'pass' => RT_PASS,
       'content' => $content
    );

    // get the curl session object
    $session = curl_init($request);

    // set the POST options
    curl_setopt ($session, CURLOPT_POST, true);
    curl_setopt ($session, CURLOPT_POSTFIELDS, $postargs);
    curl_setopt($session, CURLOPT_HEADER, true);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
    curl_setopt( $session, CURLOPT_HTTPHEADER, array( 'Expect:' ) );

    // do the POST and then close the session
    $response = curl_exec($session);
    curl_close($session);

---

In debugging this I have also created a simple form which posts to the same place:


<form method="POST"action="http://foo.foo.edu/REST/1.0/ticket/new/">
User: <input type="text" name="user" size="20"><br>
Pass: <input type="text" name="pass" size="20"><br>
Content: <textarea rows="10" name="content" cols="30">id: new
CF-UPC: 786936180992
Text: This is the ticket text from the form.
Subject: This is the subject
Queue: External App Requests</textarea><br>
<p><input type="submit" value="Submit" name="B1">
</form> 

When this form is used, again the ticket is created but in this case the custom field UPC does get set. But 
the "Content:" being sent is the same in both. In particular in both cases I am providing UPC's value with 
"CF-UPC: 78..." Can anyone here explain what the difference could possibly be between these two
posting methods that could result in this scenario? By the way, in both cases I am passing in the same 
user name and password. I am really stumped and I suspect some small stupid thing I have missed.

Thanks for your help,
Kim

________________________________

Ok so I decided to add comments to REST/1.0/Forms/ticket/default to see what RT was receiving in either case:

   else {
        # We'll create a new ticket, and fall through to set fields that
        # can't be set in the call to Create().
        my (%v, $text);

        foreach my $k (keys %data) {

push(@comments, "------------key: $k----------");
            # flexibly parse any dates
            if ($dates{lc $k}) {
                my $time = new RT::Date $session{CurrentUser};
                $time->Set(Format => 'unknown', Value => $data{$k});
                $data{$k} = $time->ISO;
            }

            if (exists $create{lc $k}) {
push(@comments, "key $k in create");
                $v{$create{lc $k}} = delete $data{$k};
            }
            # Set custom field
            elsif ($k =~ /^$cf_spec/) {
push(@comments, "GOT HERE with $k");
                my $cf = RT::CustomField->new( $RT::SystemUser );
push(@comments, "cf: $cf");
                my $cfk = $1 || $2;
push(@comments, "cfk: $cfk");
                unless($cf->LoadByName( Name => $cfk )) {
                    push @comments, "# Invalid custom field name ($cfk)";
                    delete $data{$k};
                    next;
                }
push(@comments, "value: $data{$k}");
        my($foo) = $cf->Id();
push(@comments, "foo: $foo");

                $v{"CustomField-".$cf->Id()} = delete $data{$k};
push(@comments, "v: $v{'CustomField-'.$foo}");
            }

And I have dicovered that either way I try to create a ticket, either with the PPH CURL code or with the form, the comments that get spit out are the same:

------------key: Subject----------
key Subject in create
------------key: id----------
------------key: CF-UPC----------
GOT HERE with CF-UPC
cf: RT::CustomField=HASH(0x5555592bf510)
cfk: UPC
value: 786936180992
foo: 1
v: 786936180992
------------key: Queue----------
key Queue in create
------------key: Text----------


So it appears that in both cases Forms/ticket/default is getting exactly the same thing and doing with it exactly the same thing.... specifically
taking in CF-UPC: 7893... and with that creating the custom field UPC with value 7893...

So then why in one case does the resulting ticket I find when I go to RT have this custom field set and in the other case not? Please are there any 
ticket creation experts who could shed light on what is going wrong after the request is processed in Forms/ticket/default?

Thanks so much for your help,
Kim Jones 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.bestpractical.com/pipermail/rt-devel/attachments/20090522/4f59e0a8/attachment.htm 


More information about the Rt-devel mailing list