Mit XWiki-Formularen Tickets erzeugen


Wenn Sie die RESTful Webservices in todo4teams in Betrieb genommen haben, können Sie Tickets automatisiert erzeugen - z.B. indem Sie Daten strukturiert in einem XWiki-Formular erfassen und an todo4teams senden.

Voraussetzung ist, dass Sie die REST-Schnittstelle Ihrer todo4teams-Instanz erfolgreich in Betrieb genommen und ggf. Test-Tickets erzeugt haben.

Hier stellen wir Ihnen vor, wie Sie eine entsprechende Seite in XWiki erstellen.

Betten Sie in eine XWiki-Seite zwei Komponenten ein:

  1. Ein HTML-Formular, in dem der Benutzer die Daten eingeben kann.
  2. Ein Stück Groovy-Code, das diese Formulardaten in eine Ticketbeschreibung einsetzt und das Ticket über den REST-Service an todo4teams sendet.

Den gesamten Code der Seite sehen Sie unten. Benutzen Sie ihn als Vorlage und passen Sie die Service-URL (YOURTODOSERVER), Benutzername und -passwort des API-Benutzers (YOURAPIUSERNAME, YOURAPIPASSWORD) sowie die ID des Teams, an das das Ticket adressiert werden soll (siehe addressedGroupId), an!

Der Code zwischen {{html}} und {{/html} erzeugt das Formular, das in diesem Beispiel etwas so ausieht:
image-20250224150916-1.png

Beim Absenden wird das Formular als POST-Request an die angezeigt Seite selbst gesendet. Der Code zwischen {{groovy}} und {{/groovy} verarbeitet die Anfrage, nachdem geprüft wurde, ob tatsächlich Daten gesendet wurde (oder ob die Seite nur angezeigt wurde).

Die Methode groovy.json.JsonOutput.toJson(...) erzeugt komfortabel den JSON-Code der Anfrage zur Erzeugung des Tickets in todo4teams.

Hier erfolgt auch die erforderliche Authentifizierung (HTTP-Basic Auth).

Die Antwort des Servers wird durch den HTTP-Status (if (postRC.equals(200))...) geprüft, und im Erfolgsfall die ID des erzeugten Tickets zurückgegeben.

Die in Velocity kodierte Bedingung

{{velocity}}
#if(!$request.formid)
   ...

sorgt dafür, dass das Formular nach dem Absenden nicht erneut angezeigt wird.


{{groovy}}
if(request.getParameter("formid")){  

def name = request.getParameter("name")
def company = request.getParameter("company")
def email = request.getParameter("email")
def phone = request.getParameter("phone")
def username="YOURAPIUSERNAME"
def password="YOURAPIPASSWORD"
def post = new URL("https://YOURTODSERVER/todo4teams/rest/tasks").openConnection();
 
def message = groovy.json.JsonOutput.toJson([addressedGroupId:17,description:"Anfrage:\n"+name+"\n"+company+"\n"+email+"\n"+phone,"minutes":180,"priority":2,"title":"Anfrage"])

String encoded = Base64.getEncoder().encodeToString((username+":"+password).getBytes("UTF-8"));  //Java 8
post.setRequestProperty("Authorization", "Basic "+encoded);
post.setRequestMethod("POST")
post.setDoOutput(true)
post.setRequestProperty("Content-Type", "application/json")
post.getOutputStream().write(message.getBytes("UTF-8"));
def postRC = post.getResponseCode();
if (postRC.equals(200)) {
   println("**Vielen Dank für Ihre Anfrage! Wie setzen uns kurzfristig mit Ihnen in Verbindung!**")
   println("\n\nID Ihrer Anfrage:" + post.getInputStream().getText());
} else {
 println("**Beim Speichern Ihrer Anfrage ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut!**");
}  
}
{{/groovy}}


{{velocity}}
#if(!$request.formid)

{{html}}

<form method="POST" name="dform" onsubmit="if(document.forms['dform']['email'].value=='' && document.forms['dform']['phone'].value==''){  alert('Bitte geben Sie eine E-Mail-Adresse oder Rufnummer an!'); return false;} else {  return true;}">
<input name="formid" value="5645425" type="hidden"/>
<table>
<tr>
<td>Name:</td><td><input name="name" type="text" size="50"/></td>
</tr>
<tr>
<td>Firma:</td><td><input name="company"  type="text" size="50"/></td>
</tr>
<tr>
<td>E-Mail:</td><td><input name="email" type="text" size="50"/></td>
</tr>
<tr>
<td>Rufnummer:</td><td><input name="phone" type="text" size="50"/></td>
</tr>

<tr>
<td></td><td><input type="submit" value="Absenden" /></td>
</tr>
</table>
</form>
{{/html}}
#end

{{/velocity}}

Wenn Sie zusätzlich ein Formular befüllen möchten, ändern Sie die "Nutzlast" wie in diesem Beispiel. Hier wird das Formular mit der ID 213 mit Werten befüllt:

...  
def company = request.getParameter("company")
def email = request.getParameter("email")
def phone = request.getParameter("phone")

def post = new URL("https://YOURTODOSERVER/todo4teams/rest/tasks").openConnection();
 
def message = groovy.json.JsonOutput.toJson(
 [addressedGroupId:17,
   description:"Demo-Anfrage:\n"+name+"\n"+company+"\n"+email+"\n"+phone,
   minutes:180,
   priority:2,
   title:"Demo-Anfrage",
   forms : [
    [
       id:213,
       fields : [
        Nachname: name,
        Firma: company,
        Telefon: phone,
       "E-Mail": email
      ]
     ]
   ]
  ]
 )