2012-10-08 39 views
10

Estoy escribiendo una aplicación que usa PHP y la API REST de Jira que se requiere para generar un informe por un período de tiempo particular con la acumulación de horas invertidas por una persona en un proyecto en particular.¿Cómo obtener todos los registros de trabajo durante un período de tiempo desde la API REST de Jira?

Para esto necesitaré una llamada que dará algo como esto.

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

El método he encontrado hasta ahora, era conseguir los temas actualizados después de la fecha de inicio y filtrar los worklogs para cada tema por el periodo de nuevo.

¿Existe una mejor alternativa?

+4

Es una pena Jira no soporta dicha función básica a través de la API. –

+0

Me acabo de dar cuenta de que su método no funcionará y de hecho parece que no hay una solución viable (aparte de atravesar TODOS los problemas en la historia que no es viable). El problema es que su solución solo funcionará cuando su TO_DATE sea ahora. No puede usar este método para el período en el pasado ya que los problemas que se han actualizado después de su TO_DATE no contarán aunque puedan tener registros de trabajo.Otro problema es que Jira permite ingresar el tiempo trabajado en fechas diferentes a las de NOW, la consulta para filtrar tareas actualizadas en el período dado no funcionará en ese momento. –

Respuesta

3

Si no puede encontrar la una función fuera de la caja que hace lo que has pedido, puedo pensar en otras tres soluciones distintas de la suya:

  1. Query the DB directly por lo que podría obtener los registros de trabajo con una consulta. Asegúrese de no insertar/eliminar/actualizar el DB directamente, sino solo para consultarlo.
  2. Use algo como Jira Scripting Suite o Behaviours Plugin para agregar scripts que escribirán los registros de trabajo en algún lugar del disco. Luego, use otra aplicación para leer la información escrita del disco y mostrarla a los usuarios.
  3. Uso del Tempo plugin
+4

Debe observarse que no hay forma de consultar directamente los registros de trabajo utilizando la API Jira. Muy decepcionante. –

0

El enfoque que he utilizado personalmente por el mismo tipo de una aplicación es conseguir que todos los registros de JIRA sobre una base semanal y luego generar informes de la base de datos están almacenados en.

De esta manera se quiere también tienen los datos disponibles si ocurre una falla importante de JIRA. Nuestra compañía pasó por un problema de este tipo con una instancia OnDemand cuando se quemó una matriz RAID y la mayoría de los datos no se pudieron recuperar.

+0

El Jira que se está utilizando es hospedado. Así que mi interés es obtener solo los datos del registro de trabajo para un momento particular para informar y no tener que consultarlos por problemas y filtro. – Himeshi

3

Como muchos han dicho, no hay manera directa. Sin embargo, si reduce el espacio de búsqueda de manera eficiente, no es tan malo. El siguiente código PHP corre bastante rápido en mi configuración, pero por supuesto, esto puede variar según:

<?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

Tenía más o menos la misma idea de usar MS-HTA ... me has ahorrado mucha documentación leyendo. –

+1

Uno de los problemas de este script es que algunos de los problemas en los que el usuario trabajó pueden haber sido reasignados a otros usuarios, por lo que no se incluirán en el resultado. – Sebastian

2

Vale la pena señalar que las consultas de Jira tienen una opción expand que le permite especificar qué campos desea apegado a tu búsqueda:

// 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) 
    ; 

El objeto JSON devuelto devuelta será una lista de entradas, y cada boleto tendrán una colección de elementos de trabajo adjunta (potencialmente longitud cero).

Javascript en lugar de PHP, pero la misma idea sostiene:

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); 
       }); 
      }); 
     } 
    }); 
} 

publicado en GitLab: https://gitlab.com/jefferey-cave/ProductivityBlockers/blob/5c4cb33276e8403443d4d766fc94ab2f92292da6/plugin-data-jira.js

Cuestiones relacionadas