Zugriff auf die OTRS-Klassen via SOAP und - natürlich Python, was sonst
Motivation
Ich möchte gerne Tickets in OTRS mit python anlegen und auslesen. Damit kann ich einfache Support-Schnittstellen in User-Portale einbauen.
Installation OTRS mit SOAP
1. OTRS ist Perl (uaaarg), bitte zunächst die Installationsanweisungen für OTRS befolgen und OTRS soweit testen.
- Perl Module installieren
- Perl SOAP installieren
- siehe unten, Bug in Soap-lite!!
- einige Perl-Module müssen installiert werden (Abhängigkeiten SoapLite)
- SOAP in OTRS freischalten (Username und Passwort in Sysconfig setzen)
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
Weiter auf Client-Seite mit Python
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:
erste Tests - endlich Code
#!/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
ein neues Ticket anlegen
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
einen Artikel zu diesem Ticket anlegen
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.