Ich möchte gerne Tickets in OTRS mit python anlegen und auslesen. Damit kann ich einfache Support-Schnittstellen in User-Portale einbauen.
1. OTRS ist Perl (uaaarg), bitte zunächst die Installationsanweisungen für OTRS befolgen und OTRS soweit testen.
2. Ich habe OTRS-3.0.6 unter CentOS-5.6-x64 im Einsatz. Erste Versuche mit SOAPpy scheitern an dieser Fehlermeldung:
no element found at line 1, column 0, byte -1 at /usr/lib/perl5/XML/Parser.pm line 187
das ist dieser Bug: http://bugs.otrs.org/show_bug.cgi?id=5467
und wird mit diesem Patch behoben:
http://users.otrs.com/~mb/SOAP-Lite-0.713_01.tar.gz
mittlerweile habe ich auf OTRS-3.1.4 geupgraded, alle nachfolgenden Codes funktionieren mit dieser Version
wir gehen davon aus, das otrs mit SOAP funktioniert
1. OTRS kann KEIN WSDL!! Dh wir können keine Python-WSDL-Module verwenden (zB. suds), sondern brauchen die kompliziertere SOAPpy
2. Ich habe ein WSDL-File auf dem OTRS-Server abgelegt. Darin definiere ich die Services, dann können wir in SOAPpy auf WSDL umschalten. Das WSDL-File kann hier eingesehen werden und ist eine Kopie vom OTRS User Forum (http://forums.otrs.org/viewtopic.php?f=20&t=1257) mit den nötigen Änderungen für unser OTRS:
#!/usr/local/bin/python from SOAPpy import WSDL wsdlfile='http://194.94.30.115/otrs.wsdl' server=WSDL.Proxy(wsdlfile) print server.methods.keys() # dieses Ticket habe ich vorher in OTRS angelegt und mir die Ticketnummer kopiert: TicketNr='2011030404000012' tickets=server.Dispatch('soapusername', 'soapstrenggeheimespasswort', 'TicketObject', 'TicketSearch', 'TicketNumber', TicketNr, 'UserID', 1) print tickets
Als Ergebnis erhalte ich dieses Array:
<SOAPpy.Types.structType DispatchResponse at -1210679540>: {'s-gensym15': 2011030404000012L, 's-gensym13': 5}
das scheint ein Struct mit Typ DispatchResponse zu sein, es wird die TicketNr und die TicketID zurückgegeben, die suche nach dem Ticket war also erfolgreich.
soweit erstmal, SOAP funzt prinzipiell, jetzt gehts in die Details
title = "My Test Ticket 2 via SOAP and Python" myfrom = "me@fh-schmalkalden.de" ticketID=server.Dispatch('soapuser', 'soappasswd', "TicketObject", "TicketCreate", "Title", title, "Queue", "Postmaster", "Lock", "Unlock", "PriorityID", 2, "State", "new", "CustomerUser", myfrom, "OwnerID", 1, "UserID", 1, "LockID",1 ) print ticketID
body="Bitte helfen sie mir, mei internet gäht nimmer".decode('utf-8') artID=server.Dispatch('soapuser', 'soappasswd', "TicketObject", "ArticleCreate", "TicketID", ticketID, "ArticleType", "webrequest", "SenderType", "customer", "HistoryType", "WebRequestCustomer", "HistoryComment", "created from Python", "From", myfrom, "Subject", title, "ContentType", "text/plain; charset=utf-8", "Body", body, "UserID", 1, "Loop", 0, "AutoResponseType", 'auto reply', "OrigHeader", ( 'From',myfrom, 'To','Postmaster', 'Subject',title, ), ) print artID
die artID war aber None, keine Ahnung warum, jedenfalls habe ich jetzt ein neues Ticket im OTRS mit einem zugehörigen Record.