2012-10-08 2 views
10

Ich schreibe eine Anwendung mit PHP und der Jira REST API, die benötigt wird, um einen Bericht für einen bestimmten Zeitraum mit der Ansammlung von Stunden zu erstellen, die eine Person in einem bestimmten Projekt verbracht hat.Wie erhalten Sie alle Arbeitsprotokolle für einen bestimmten Zeitraum von der Jira REST API?

Dafür brauche ich einen Anruf, der so etwas geben wird.

z: For the period 01/01/2012 - 31/01/2012 give me the worklogs for project X.

Die Methode, die ich bisher gefunden, war die aktualisierten Ausgaben nach dem Startdatum zu erhalten und die Worklogs für jede Ausgabe von der Zeit wieder filtern.

Gibt es eine bessere Alternative?

+4

Es ist eine Schande Jira nicht so Grundzug durch API unterstützt. –

+0

Ich habe gerade festgestellt, dass Ihre Methode nicht funktionieren wird und es scheint tatsächlich keine praktikable Lösung zu geben (abgesehen davon, ALLE Probleme in der Geschichte durchzugehen, die nicht durchführbar sind). Das Problem ist, dass Ihre Lösung nur funktioniert, wenn Ihr TO_DATE jetzt ist. Sie können diese Methode nicht für den Zeitraum in der Vergangenheit verwenden, da Probleme, die nach Ihrem TO_DATE aktualisiert wurden, nicht gezählt werden, obwohl sie möglicherweise Worklogs haben.Ein weiteres Problem ist, dass Jira erlaubt, Arbeitszeiten zu anderen Daten als JETZT einzugeben. Eine Abfrage zum Filtern von Aufgaben, die in dem gegebenen Zeitraum aktualisiert wurden, wird dann nicht funktionieren. –

Antwort

3

Wenn Sie nicht finden können, die eine Out-of-the-Box-Funktion, das tut, was Sie gefragt habe, habe ich von drei anderen Lösungen anderer als Ihr denken kann:

  1. Query the DB directly so konnte man Holen Sie sich die Arbeitsprotokolle mit einer Abfrage. Stellen Sie sicher, dass Sie die Datenbank nicht direkt einfügen/löschen/aktualisieren, sondern nur, um sie abzufragen.
  2. Verwenden Sie etwas wie Jira Scripting Suite oder Behaviours Plugin, um Skripte hinzuzufügen, die die Arbeitsprotokolle irgendwo auf die Festplatte schreiben. Verwenden Sie dann eine andere App, um die geschriebenen Informationen von der Festplatte zu lesen und den Benutzern anzuzeigen.
  3. Verwenden Tempo plugin
+4

Man sollte beachten, dass es keine Möglichkeit gibt, direkt nach Arbeitsprotokollen mit der Jira API zu fragen. Sehr enttäuschend. –

0

Der Ansatz, den ich persönlich für die gleiche Art einer Anwendung verwendet haben, ist es, alle Datensätze aus JIRA auf einer wöchentlichen Basis zu bekommen und dann Berichte erstellen, aus der Datenbank sie in gespeichert sind.

Auf diese Weise werden Sie haben auch die Daten verfügbar, wenn ein großer JIRA-Absturz auftritt. Unser Unternehmen hat ein solches Problem mit einer OnDemand-Instanz durchgemacht, als ein RAID-Array gebrannt und die meisten Daten nicht wiederhergestellt werden konnten.

+0

Die Jira, die verwendet wird, ist eine gehostete. Daher ist es mein Interesse, nur die Arbeitsprotokolldaten für eine bestimmte Zeit für das Reporting zu bekommen und sie nicht nach Problemen abfragen zu müssen. Filter – Himeshi

3

Wie viele gesagt haben, gibt es keine direkte Möglichkeit. Wenn Sie jedoch den Suchraum effizient eingrenzen, ist es nicht so schlimm. Die folgenden PHP-Code läuft recht schnell auf meinem Setup, aber natürlich, die Leistung kann variieren:

<?php 
$server = 'jira.myserver.com'; 
$fromDate = '2012-01-01'; 
$toDate = '2012-01-31'; 
$project = 'X'; 
$assignee = 'bob'; 

$username = 'my_name'; 
$password = 'my_password'; 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password"); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); 

# Give me up to 1000 search results with the Key, where 
# assignee = $assignee AND project = $project 
# AND created < $toDate AND updated > $fromDate 
# AND timespent > 0 
curl_setopt($curl, CURLOPT_URL, 
      "https://$server/rest/api/2/search?startIndex=0&jql=". 
      "assignee+%3D+$assignee+and+project+%3D+$project+". 
      "and+created+%3C+$toDate+and+updated+%3E+$fromDate+". 
      "and+timespent+%3E+0&fields=key&maxResults=1000"); 

$issues = json_decode(curl_exec($curl), true); 
foreach ($issues['issues'] as $issue) { 
    $key = $issue['key']; 
    # for each issue in result, give me the full worklog for that issue 
    curl_setopt($curl, CURLOPT_URL, 
       "https://$server/rest/api/2/issue/$key/worklog"); 

    $worklog = json_decode(curl_exec($curl), true); 
    foreach ($worklog['worklogs'] as $entry) { 
     $shortDate = substr($entry['started'], 0, 10); 
     # keep a worklog entry on $key item, 
     # iff within the search time period 
     if ($shortDate >= $fromDate && $shortDate <= $toDate) 
      $periodLog[$key][] = $entry; 
    } 
} 
# Show Result: 
# echo json_encode($periodLog); 
# var_dump($periodLog); 
?> 
+0

Hatten fast die gleiche Idee mit MS-HTAs ... Sie haben mir gerade viel Dokumentation zu lesen. –

+1

Ein Problem dieses Skripts besteht darin, dass einige der Probleme, mit denen der Benutzer gearbeitet hat, bereits anderen Benutzern zugewiesen wurden und sie daher nicht im Ergebnis enthalten sind. – Sebastian

2

Es ist erwähnenswert, dass Jira-Abfragen haben eine expand Option, die Sie angeben können, welche Felder Sie angebracht werden sollen Ihre Suche:

// Javascript 
$jql = 'project = MyProject and updated > 2016-02-01 and updated < 2016-03-01'; 

// note this definition 
$fields = 'key,summary,worklog'; 

$query = "https://{server}/rest/api/2/search?maxResults=100&fields={fields}&jql={jql}" 
    .replace(/{server}/g,$server) 
    .replace(/{jql}/g,encodeURIComponent($jql)) 
    .replace(/{fields}/g,$fields) 
    ; 

Das zurückgegebene JSON-Objekt wird eine Liste von Tickets zurückgegeben, und jedes Ticket wird eine Sammlung von Arbeitselementen angebracht (möglicherweise Null Länge) haben.

Javascript statt PHP, aber die gleiche Idee gilt:

function getJql(params){ 
    $.ajax({ 
     url: getJiraUrl() 
      + "/rest/api/2/search?startIndex=0&fields=worklog,assignee,status,key,summary&maxResults=1000&jql=" 
      + encodeURI(params.jql), 
     success: function (resp) { 
      resp.issues.forEach(function(issue) { 
       issue.fields.worklog.worklogs.forEach(function(work){ 
        alert(JSON.stringify(work)); 
        db.AddWork(work); 
       }); 
      }); 
     } 
    }); 
} 

auf Gitlab posted: https://gitlab.com/jefferey-cave/ProductivityBlockers/blob/5c4cb33276e8403443d4d766fc94ab2f92292da6/plugin-data-jira.js