[rt-users] sending ticket attachments via soap
Roy El-Hames
rfh at pipex.net
Tue Oct 24 10:27:23 EDT 2006
This is the directory where I have my RTSoap.pm, I wanted to have the
SOAP related modules independent.
you can easily place it in local/lib/RT and remove that line or modify
it to /opt/rt3/local/lib/RT
Regards;
Roy
Torsten Brumm wrote:
> Hi Roy,
>
> in your SOAP Perl Scrip, you do: use lib ("/opt/rt3/local/html/SOAP");
> which file is this? Is it the attached perl from your mail?
>
> Torsten
>
> 2006/9/29, Roy El-Hames <rfh at pipex.net>:
>>
>> Yeah sure attached .. Its basic and far from perfect, it was my first
>> attempt writing soap service and just to serve my immediate needs, I
>> Just hope somebody can use it as a base and develop a full service that
>> can be used by .net and jave clients, The REST interface is very good,
>> but all the rage (what managers like) is SOAP and web services etc ..
>> Please bare in mind it includes some of our custom status'es , which you
>> may have to remove ..
>> Regards;
>> Roy
>>
>>
>> Torsten Brumm wrote:
>> > Hi Roy,
>> >
>> > can you also share this soap services, the "old" one from BPS seams to
>> be
>> > outdated or only for rt2x i think.
>> >
>> > Torsten
>> >
>> > 2006/9/8, Roy El-Hames <rfh at pipex.net>:
>> >>
>> >> rt-3.6.1/Apache2
>> >> I've written a simple soap service for rt that can communicate with
>> >> windows .net client via a wsdl file, however I can't find the best
>> way
>> >> to send attachments, as rt will expect a mime object that combine the
>> >> update/create text with the attachment, I'll need to create this
>> object
>> >> on the server (rt side), can anyone suggest the best way to do this,
>> the
>> >> .net developers would prefer to send attachments separate as a DIME
>> >> Referenced binary.
>> >> Thanks;
>> >> Roy
>> >> _______________________________________________
>> >> http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-users
>> >>
>> >> Community help: http://wiki.bestpractical.com
>> >> Commercial support: sales at bestpractical.com
>> >>
>> >>
>> >> Discover RT's hidden secrets with RT Essentials from O'Reilly Media.
>> >> Buy a copy at http://rtbook.bestpractical.com
>> >>
>> >
>> >
>> >
>>
>>
>>
>> #!/usr/bin/perl
>>
>> use lib ("/opt/rt3/local/html/SOAP");
>> use RTSoap;
>> use SOAP::Transport::HTTP;
>>
>> SOAP::Transport::HTTP::CGI
>> -> dispatch_to('/opt/rt3/local/html/SOAP','RTSoap')
>> -> handle;
>>
>> <?xml version="1.0" encoding="utf-8"?>
>> <wsdl:definitions name="RTSoap" xmlns:soap="
>> http://schemas.xmlsoap.org/wsdl/soap/"
>> xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
>> xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
>> xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
>> xmlns:tns="urn:RTSoap"
>> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>> xmlns:xsd-ENV="http://schemas.xmlsoap.org/soap/envelope/"
>> xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
>> xmlns:http="http://schemas.xmlsoap.org/wsdl/"
>> targetNamespace="urn:RTSoap"
>> xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
>> <wsdl:types>
>> <xsd:schema elementFormDefault="qualified"
>> targetNamespace="urn:RTSoap">
>> <xsd:element name="GetTicket">
>> <xsd:complexType>
>> <xsd:sequence>
>> <xsd:element minOccurs="0" maxOccurs="1" name="Requester"
>> type="xsd:string" />
>> <xsd:element minOccurs="1" maxOccurs="1" name="TicketId"
>> type="xsd:int" />
>> </xsd:sequence>
>> </xsd:complexType>
>> </xsd:element>
>>
>> <xsd:element name="GetTicketsByRequestor">
>> <xsd:complexType>
>> <xsd:sequence>
>> <xsd:element minOccurs="1" maxOccurs="1" name="Requester"
>> type="xsd:string" />
>> <xsd:element minOccurs="1" maxOccurs="1" name="Status"
>> type="xsd:string" />
>> </xsd:sequence>
>> </xsd:complexType>
>> </xsd:element>
>>
>> <xsd:element name="CreateTicket">
>> <xsd:complexType>
>> <xsd:sequence>
>> <xsd:element name="Requester"
>> type="xsd:string" />
>> <xsd:element name="Cc" type="xsd:string" />
>> <xsd:element name="Subject" type="xsd:string" />
>> <xsd:element name="Queue" type="xsd:string" />
>> <xsd:element name="Attachment" type="xsd:string"
>> />
>> <xsd:element name="Text" type="xsd:string" />
>> </xsd:sequence>
>> </xsd:complexType>
>> </xsd:element>
>>
>> <xsd:element name="UpdateTicket">
>> <xsd:complexType>
>> <xsd:sequence>
>> <xsd:element name="Requester"
>> type="xsd:string" />
>> <xsd:element name="Cc" type="xsd:string" />
>> <xsd:element name="TicketId" type="xsd:int" />
>> <xsd:element name="Subject" type="xsd:string" />
>> <xsd:element name="Attachment" type="xsd:string"
>> />
>> <xsd:element name="Text" type="xsd:string" />
>> <xsd:element name="Status" type="xsd:string"/>
>> </xsd:sequence>
>> </xsd:complexType>
>> </xsd:element>
>>
>> <xsd:element name="GetTicketResponse">
>> <xsd:complexType>
>> <xsd:sequence>
>> <xsd:element minOccurs="0" maxOccurs="1" name="Basics"
>> type="tns:Basics" />
>> <xsd:element minOccurs="0" maxOccurs="1" name="Updates"
>> type="tns:Updates" />
>> </xsd:sequence>
>> </xsd:complexType>
>> </xsd:element>
>>
>> <xsd:element name="GetTicketsByRequestorResponse">
>> <xsd:complexType>
>> <xsd:sequence>
>> <xsd:element minOccurs="0" maxOccurs="1"
>> name="TicketsList" type="tns:TicketsList" />
>> </xsd:sequence>
>> </xsd:complexType>
>> </xsd:element>
>>
>> <xsd:element name="CreateTicketResponse">
>> <xsd:complexType>
>> <xsd:sequence>
>> <xsd:element minOccurs="0" maxOccurs="1" name="TicketId"
>> type="tns:TicketId" />
>> </xsd:sequence>
>> </xsd:complexType>
>> </xsd:element>
>>
>> <xsd:element name="UpdateTicketResponse">
>> <xsd:complexType>
>> <xsd:sequence>
>> <xsd:element minOccurs="0" maxOccurs="1"
>> name="UpdateStatus" type="xsd:string" />
>> </xsd:sequence>
>> </xsd:complexType>
>> </xsd:element>
>>
>> <xsd:complexType name="TicketId">
>> <xsd:sequence>
>> <xsd:element minOccurs="1" maxOccurs="1" name="TicketId"
>> type="xsd:string" />
>> </xsd:sequence>
>> </xsd:complexType>
>>
>> <xsd:complexType name="Basics">
>> <xsd:sequence>
>> <xsd:element minOccurs="1" maxOccurs="1" name="TicketId"
>> type="xsd:string" />
>> <xsd:element minOccurs="0" maxOccurs="1" name="Subject"
>> type="xsd:string" />
>> <xsd:element minOccurs="0" maxOccurs="1" name="Status"
>> type="xsd:string" />
>> <xsd:element minOccurs="0" maxOccurs="1" name="LastUpdateTime"
>> type="xsd:string" />
>> <xsd:element minOccurs="0" maxOccurs="1" name="ResolvedTime"
>> type="xsd:string" />
>> <xsd:element minOccurs="0" maxOccurs="1" name="Requesters"
>> type="xsd:string" />
>> </xsd:sequence>
>> </xsd:complexType>
>>
>> <xsd:complexType name="Update">
>> <xsd:sequence>
>> <xsd:element minOccurs="0" name="TransactionCreator"
>> type="xsd:string" />
>> <xsd:element minOccurs="0" name="TransactionCreated"
>> type="xsd:string" />
>> <xsd:element minOccurs="0" name="Correspondence"
>> type="xsd:string" />
>> </xsd:sequence>
>> </xsd:complexType>
>>
>> <xsd:complexType name="Updates">
>> <xsd:sequence>
>> <xsd:element minOccurs="0" maxOccurs="unbounded"
>> name="Update" type="tns:Update" />
>> </xsd:sequence>
>> </xsd:complexType>
>>
>> <xsd:complexType name="TicketParams">
>> <xsd:sequence>
>> <xsd:element minOccurs="0" name="TicketId"
>> type="xsd:string" />
>> <xsd:element minOccurs="0" name="Subject"
>> type="xsd:string" />
>> <xsd:element minOccurs="0" name="Status"
>> type="xsd:string"
>> />
>> </xsd:sequence>
>> </xsd:complexType>
>>
>> <xsd:complexType name="TicketsList">
>> <xsd:sequence>
>> <xsd:element minOccurs="0" maxOccurs="unbounded"
>> name="TicketParams" type="tns:TicketParams" />
>> </xsd:sequence>
>> </xsd:complexType>
>>
>> </xsd:schema>
>> </wsdl:types>
>> <wsdl:message name="GetTicketSoapIn">
>> <wsdl:part name="parameters" element="tns:GetTicket" />
>> </wsdl:message>
>> <wsdl:message name="GetTicketSoapOut">
>> <wsdl:part name="parameters" element="tns:GetTicketResponse" />
>> </wsdl:message>
>>
>> <wsdl:message name="GetTicketsByRequestorSoapIn">
>> <wsdl:part name="parameters" element="tns:GetTicketsByRequestor" />
>> </wsdl:message>
>> <wsdl:message name="GetTicketsByRequestorSoapOut">
>> <wsdl:part name="parameters"
>> element="tns:GetTicketsByRequestorResponse" />
>> </wsdl:message>
>>
>> <wsdl:message name="CreateTicketSoapIn">
>> <wsdl:part name="parameters" element="tns:CreateTicket" />
>> </wsdl:message>
>> <wsdl:message name="CreateTicketSoapOut">
>> <wsdl:part name="parameters" element="tns:CreateTicketResponse" />
>> </wsdl:message>
>>
>> <wsdl:message name="UpdateTicketSoapIn">
>> <wsdl:part name="parameters" element="tns:UpdateTicket" />
>> </wsdl:message>
>> <wsdl:message name="UpdateTicketSoapOut">
>> <wsdl:part name="parameters" element="tns:UpdateTicketResponse" />
>> </wsdl:message>
>>
>> <wsdl:portType name="ServiceSoap">
>>
>> <wsdl:operation name="GetTicket">
>> <wsdl:input message="tns:GetTicketSoapIn" />
>> <wsdl:output message="tns:GetTicketSoapOut" />
>> </wsdl:operation>
>>
>> <wsdl:operation name="GetTicketsByRequestor">
>> <wsdl:input message="tns:GetTicketsByRequestorSoapIn" />
>> <wsdl:output message="tns:GetTicketsByRequestorSoapOut" />
>> </wsdl:operation>
>>
>> <wsdl:operation name="CreateTicket">
>> <wsdl:input message="tns:CreateTicketSoapIn" />
>> <wsdl:output message="tns:CreateTicketSoapOut" />
>> </wsdl:operation>
>>
>> <wsdl:operation name="UpdateTicket">
>> <wsdl:input message="tns:UpdateTicketSoapIn" />
>> <wsdl:output message="tns:UpdateTicketSoapOut" />
>> </wsdl:operation>
>>
>> </wsdl:portType>
>>
>> <wsdl:binding name="ServiceSoap" type="tns:ServiceSoap">
>> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
>>
>> <wsdl:operation name="GetTicket">
>> <soap:operation soapAction="urn:RTSoap/GetTicket" style="document"
>> />
>> <wsdl:input>
>> <soap:body use="literal" />
>> </wsdl:input>
>> <wsdl:output>
>> <soap:body use="literal" />
>> </wsdl:output>
>> </wsdl:operation>
>> <wsdl:operation name="GetTicketsByRequestor">
>> <soap:operation soapAction="urn:RTSoap/GetTicketsByRequestor"
>> style="document" />
>> <wsdl:input>
>> <soap:body use="literal" />
>> </wsdl:input>
>> <wsdl:output>
>> <soap:body use="literal" />
>> </wsdl:output>
>> </wsdl:operation>
>>
>> <wsdl:operation name="CreateTicket">
>> <soap:operation soapAction="urn:RTSoap/CreateTicket"
>> style="document" />
>> <wsdl:input>
>> <soap:body use="literal" />
>> </wsdl:input>
>> <wsdl:output>
>> <soap:body use="literal" />
>> </wsdl:output>
>> </wsdl:operation>
>>
>> <wsdl:operation name="UpdateTicket">
>> <soap:operation soapAction="urn:RTSoap/UpdateTicket"
>> style="document" />
>> <wsdl:input>
>> <soap:body use="literal" />
>> </wsdl:input>
>> <wsdl:output>
>> <soap:body use="literal" />
>> </wsdl:output>
>> </wsdl:operation>
>>
>> </wsdl:binding>
>> <wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap">
>> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
>>
>> <wsdl:operation name="GetTicket">
>> <soap12:operation soapAction="urn:RTSoap/GetTicket"
>> style="document"
>> />
>> <wsdl:input>
>> <soap12:body use="literal" />
>> </wsdl:input>
>> <wsdl:output>
>> <soap12:body use="literal" />
>> </wsdl:output>
>> </wsdl:operation>
>>
>> <wsdl:operation name="GetTicketsByRequestor">
>> <soap12:operation soapAction="urn:RTSoap/GetTicketsByRequestor"
>> style="document" />
>> <wsdl:input>
>> <soap12:body use="literal" />
>> </wsdl:input>
>> <wsdl:output>
>> <soap12:body use="literal" />
>> </wsdl:output>
>> </wsdl:operation>
>>
>> <wsdl:operation name="CreateTicket">
>> <soap12:operation soapAction="urn:RTSoap/Create"
>> style="document" />
>> <wsdl:input>
>> <soap12:body use="literal" />
>> </wsdl:input>
>> <wsdl:output>
>> <soap12:body use="literal" />
>> </wsdl:output>
>> </wsdl:operation>
>> <wsdl:operation name="UpdateTicket">
>> <soap12:operation soapAction="urn:RTSoap/UpdateTicket"
>> style="document" />
>> <wsdl:input>
>> <soap12:body use="literal" />
>> </wsdl:input>
>> <wsdl:output>
>> <soap12:body use="literal" />
>> </wsdl:output>
>> </wsdl:operation>
>>
>> </wsdl:binding>
>> <wsdl:service name="Service">
>> <wsdl:port name="ServiceSoap" binding="tns:ServiceSoap">
>> <soap:address location="http://YOURRTADDRESS/res.cgi" />
>> </wsdl:port>
>> <wsdl:port name="ServiceSoap12" binding="tns:ServiceSoap12">
>> <soap12:address location="http://YOURRTADDRESS/res.cgi" />
>> </wsdl:port>
>> </wsdl:service>
>> </wsdl:definitions>
>>
>>
>>
>>
>> package RTSoap ;
>>
>> use lib ( "/opt/rt3/lib", "/opt/rt3/local/lib" );
>> use RT;
>> use RT::Ticket;
>> use RT::Users;
>> CleanEnv;
>> RT::LoadConfig;
>> RT::Init;
>> our @ISA = qw( SOAP::Server::Parameters );
>>
>> sub new {
>> $self = shift;
>> my $class = ref($self) || $self;
>> bless {_tic => shift} => $class;
>> return $class;
>> }
>>
>> sub Hello {
>> ### test function ##is soap lite working
>> my $self = shift;
>> my ($string) = @_;
>> return "Hello " . $string;
>> }
>>
>> sub RT_User {
>> my ($address) = shift;
>> unless ($address) {
>> return (undef);
>> }
>> my $user = RT::CurrentUser->new();
>> $user->LoadByEmail($address);
>> unless ($user->Id){
>> return undef;
>> }
>> return $user;
>> }
>>
>> sub GetTicketsByRequestor {
>> #### you get a requester and may get status resolved
>> ## if you get status = resolved only return a list of resolved
>> tickets else return all non resolved tickets for this requestor
>>
>> my $self = shift;
>> my %args = %{pop->method};
>> my $requestor = $args{'Requester'};
>> my $status = $args{'Status'};
>> my $error = undef;
>>
>> ## Get user
>> my $CurrentUser = RT_User($requestor);
>> if (!$CurrentUser) {
>> $error = "Not RT user, verify email address";
>> die $error;
>> }
>> $RT::Logger->error("Web service invoked do I get back here
>> $requestor");
>> my $tickets = new RT::Tickets($CurrentUser);
>> if (!$tickets) {
>> $error = "No tickets of this status for this user";
>> die $error;
>> }
>> my @collection;
>> $tickets->LimitWatcher(TYPE => 'Requestor', VALUE =>$requestor);
>> if ($status =~ /resolved/) {
>> $tickets->LimitStatus(VALUE => "resolved");
>> $tickets->LimitStatus(VALUE => "completed");
>> } else {
>> $tickets->LimitStatus(VALUE => "open");
>> $tickets->LimitStatus(VALUE => "new");
>> $tickets->LimitStatus(VALUE => "stalled");
>> $tickets->LimitStatus(VALUE => "re-opened");
>> $tickets->LimitStatus(VALUE => "monitored");
>> }
>> $tickets->OrderBy(FIELD => 'id', ORDER => 'DESC');
>> while (my $ticket = $tickets->Next) {
>> my @list;
>> @list = (
>> SOAP::Data->name("TicketParams" =>
>> \SOAP::Data->value(
>>
>>
>> SOAP::Data->name('TicketId')->value($ticket->Id()),
>>
>>
>> SOAP::Data->name('Subject')->value($ticket->Subject()),
>>
>>
>> SOAP::Data->name('Status')->value($ticket->Status())))
>> );
>> push @collection, at list
>> }
>> if (!@collection) {
>> $error = "Failed to retrieve ticket list ";
>> die $error;
>> }
>> return (
>> SOAP::Data->name("TicketsList" => \SOAP::Data->value(
>>
>>
>> SOAP::Data->name('CallItWhatEver')->value(@collection)))
>> );
>>
>> }
>>
>> sub GetTicket(){
>> ### you get a ticket id return the ticket providing the supplied
>> requestor is in this ticket requesters string
>> use RT::Transactions;
>> my $self = shift;
>> my %args = %{pop->method};
>> my $requestor = $args{'Requester'};
>> my $ticketId = $args{'TicketId'};
>> my $error = undef;
>> ### debug
>> # $RT::Logger->error("Web service invoked and my requestor is
>> $requestor");
>> #####
>> my @collection;
>> my $CurrentUser = RT_User($requestor);
>> if (!$CurrentUser) {
>> $error = "Not RT user, verify email address";
>> die $error;
>> }
>> my $ticket = new RT::Ticket($CurrentUser,$self->{_tic});
>> $ticket->Load($ticketId);
>> unless ( $ticket->id ) {
>> $error = "Error loading ticket, maybe invalid ticket
>> id" ;
>> die $error;
>> }
>> if ($ticket->Id()){
>> unless ($ticket->IsWatcher(Type => 'Requestor',
>> PrincipalId => $CurrentUser->PrincipalId)) {
>> $error = "Permission denied. $requestor is not a
>> requestor for this ticket";
>> die $error;
>> }
>> $Tid = $ticket->Id();
>> $TSubject = $ticket->Subject();
>> $TStatus = $ticket->Status();
>> $TRequestors =
>> $ticket->Requestors->MemberEmailAddressesAsString;
>> $TLastUpdate = $ticket->LastUpdated;
>> $TResolved = $ticket->Resolved;
>> my $trans = RT::Transactions->new($RT::SystemUser);
>> $trans->LimitToTicket($Tid);
>> $trans->Limit(
>> FIELD => 'Type',
>> OPERATOR => '=',
>> VALUE => "Correspond"
>> );
>> $trans->Limit(
>> FIELD => 'Type',
>> OPERATOR => '=',
>> VALUE => "Create"
>> );
>> while (my $tran = $trans->Next ) {
>> my $attachments =
>> RT::Attachments->new($RT::SystemUser);
>> $attachments->Limit(FIELD => 'TransactionId',
>> OPERATOR => '=',
>> VALUE => $tran->Id()
>> );
>> $attachments->Limit(FIELD => 'ContentType',
>> OPERATOR => '=',
>> VALUE => 'text/plain'
>> );
>> $attachments->Limit(FIELD => 'Content',
>> OPERATOR => '!=',
>> VALUE => ''
>> );
>> my ($update, at updates) ;
>> while (my $attachment = $attachments->Next) {
>> my $aid = $attachment->Id() ;
>> my $atid =
>> $attachment->TransactionId() ;
>> my $acontent = $attachment->Content();
>> $update = (
>>
>>
>> SOAP::Data->type('string')->name('Correspondence')->value($acontent)
>> );
>> push @updates,$update ;
>> }
>> my @t = (
>> SOAP::Data->name("Update" =>
>> \SOAP::Data->value(
>>
>>
>> SOAP::Data->type('string')->name('TransactionCreator')->value($tran->CreatorObj->Name),
>>
>>
>>
>> SOAP::Data->type('string')->name('TransactionCreated')->value($tran->Created),
>>
>>
>>
>> SOAP::Data->type('complexType')->name('Correspondence')->value(@updates)
>> ))
>> );
>> push @collection, at t ;
>> }
>> } else {
>> $error = "Error loading ticket updates";
>> die $error;
>> }
>> # format SOAP::Data Object and return
>> return (
>> SOAP::Data->name('Basics' => \SOAP::Data->value(
>> SOAP::Data->name('TicketId')->value($Tid),
>> SOAP::Data->name('Subject')->value($TSubject),
>> SOAP::Data->name('Status')->value($TStatus),
>>
>>
>>
>> SOAP::Data->name('LastUpdateTime')->value($TLastUpdate),
>>
>>
>> SOAP::Data->name('ResolvedTime')->value($TResolved),
>>
>>
>> SOAP::Data->name('Requesters')->value($TRequestors))),
>> SOAP::Data->name('Updates' => \SOAP::Data->value(
>>
>>
>> SOAP::Data->name('CallItWhatEver')->value(@collection)))
>> );
>> }
>>
>> sub CreateTicket {
>> #### attachments handling is rubbish ... need looking at later
>> use MIME::Entity;
>> my $MimeMessage;
>> my $self = shift;
>> my %args = %{pop->method};
>> my $requestor = $args{'Requester'};
>> my $cc = $args{'Cc'};
>> my $queue = $args{'Queue'};
>> my $subject = $args{'Subject'};
>> my $txt = $args{'Text'};
>> my $attach = $args{'Attachment'};
>> ###### for debug purposes ###
>> $RT::Logger->error("SOAPING:do I get text? ($txt)");
>> if ($attach) {
>> $RT::Logger->error("SOAPING:I have attachment");
>> }
>>
>> ############
>> my $CurrentUser = RT_User($requestor);
>> if (!$CurrentUser) {
>> $CurrentUser = $RT::SystemUser ; ### we need to create
>> tickets for new users as well
>> }
>>
>> if ($attach) {
>> $MimeMessage = $attach;
>> } else {
>> $Mime = MIME::Entity->build(
>> From => $requestor,
>> Subject =>$subject,
>> Cc => $cc,
>> Type => 'text/plain',
>> Data => $txt
>> );
>> $MimeMessage = $Mime->stringify();
>> }
>>
>>
>> my $newticket = new RT::Ticket($CurrentUser);
>> my $parser = RT::EmailParser->new();
>> $parser->ParseMIMEEntityFromScalar($MimeMessage);
>> #$parser->ParseMIMEEntityFromScalar($attach);
>>
>> my %create_args = (
>> Queue => $queue,
>> Requestor => $requestor,
>> Cc => $cc,
>> Subject => $subject,
>> MIMEObj => $parser->Entity
>> );
>>
>> my ( $id, $Trans, $ErrMsg ) = $newticket->Create(%create_args);
>> unless ( $id && $Trans ) {
>> die $ErrMsg ;
>> }
>> return (SOAP::Data->name('TicketId' =>
>> \SOAP::Data->value(
>>
>> SOAP::Data->name('TicketId')->value($id))));
>> }
>>
>> sub UpdateTicket {
>> ### only update if the supplied requester is the ticket
>> requester
>> ### attachments attchments attachments
>> use MIME::Entity;
>> my $MimeMessage;
>> my $self = shift;
>> my %args = %{pop->method};
>> my $txt = $args{'Text'};
>> my $attach = $args{'Attachment'};
>> my $CurrentUser = RT_User($args{'Requester'});
>> my $error = undef;
>> if (!$CurrentUser) {
>> $error = "Not RT user, verify email address";
>> die $error;
>> }
>>
>> if ($attach && $attach != '') {
>> $MimMessage = $attach;
>> } else {
>> $Mime = MIME::Entity->build(
>> From => $requestor,
>> Subject =>$subject,
>> Cc => $cc,
>> Type => 'text/plain',
>> Data => $txt
>> );
>> $MimeMessage = $Mime->stringify();
>> }
>>
>> my $ticket = new RT::Ticket($CurrentUser);
>> $ticket->Load($args{'TicketId'}) ;
>> unless ( $ticket->id ) {
>> $error = "Error loading ticket, maybe invalid ticket
>> id";
>> die $error;
>> }
>> unless ($ticket->IsWatcher(Type => 'Requestor', PrincipalId =>
>> $CurrentUser->PrincipalId)) {
>> $error = "Permission denied. $requestor is not a
>> requestor for this ticket";
>> die $error;
>> }
>> my $parser = RT::EmailParser->new();
>> $parser->ParseMIMEEntityFromScalar($MimeMessage);
>> my ($val,$msg);
>> if ( $args{'Status'} && $args{'Status'} ne $ticket->Status ) {
>> ( $val, $msg ) = $ticket->SetStatus( $args{'Status'} );
>> if ($val == 0) {
>> $msg = "Failed to update status";
>> die $msg;
>> }
>> }
>> if ($MimeMessage) {
>> ( $val, $msg ) = $ticket->Correspond( MIMEObj =>
>> $parser->Entity,
>> CcMessageTo =>
>> $args{'Cc'});
>> if ($val == 0) {
>> $msg = "Failed to update ticket";
>> die $msg;
>> }
>> }
>> return (SOAP::Data->name('UpdateStatus')->value("OK"));
>> }
>> 1;
>>
>>
>>
>>
>>
>>
>
>
More information about the rt-users
mailing list