¿Es posible enumerar toda la actividad para un rango de fechas dado en Trello?

11

He estado usando Trello durante varios meses y rutinariamente publico actividad en las tarjetas mientras trabajo en ellas y luego las muevo de izquierda a derecha a la lista 'Completa'. No aprovecho las fechas de vencimiento. ¿Existe un mecanismo para enumerar el texto de la actividad en todas las tarjetas para un rango determinado? Estoy tratando de obtener algunos datos sin procesar para alimentar un informe de estado durante un período determinado.

Ejemplo: si el día de hoy es el 15 de mayo de 2013. Quiero producir una lista de todo el texto de actividad en cada tarjeta que tenía entradas de 'actividad' para el período del 29 de abril al 3 de mayo.

Brian
fuente
Esto se puede hacer, pero solo mediante el uso de la API de Trello. ¿Te sientes cómodo haciendo una programación ligera para obtener los datos que deseas?
Ian Henry
@IanHenry Sí, estoy cómodo.
Brian

Respuestas:

14

Sí, lo es, usando la API de Trello y algunas otras herramientas.

Esta respuesta se basa en HTTPie y jq , dos herramientas disponibles gratuitamente que se pueden instalar a través de pip y Homebrew si está utilizando una Mac:

$ pip install httpie
$ brew install jq

Usando HTTPiepodemos consultar la API de Trello para obtener la fuente de acción sin procesar para un tablero, luego podemos usar jqpara convertir esos datos en algo útil.

Comencemos con algo "simple". El siguiente comando nos dará todos los comentarios hechos en la Junta de Desarrollo de Trello en el mes de abril de 2013. Explicaré esto en un segundo:

http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard" |  jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'

Si todo salió según lo planeado, deberíamos ver algo como esto:

{
  "Embed All The Things (516fcff9b998572923008fb2)": [
    {
      "comment": "Embed.ly now supports https better, so maybe we can upgrade to that version. http://embed.ly/embed/security/ssl",
      "member": "Brett Kiefer",
      "date": "2013-04-26T16:15:21.408Z"
    },
    {
      "comment": "Embedding a Google Map would be nice.",
      "member": "Michael Warkentin",
      "date": "2013-04-24T18:39:12.155Z"
    },
    {
      "comment": "Github issues / pull requests",
      "member": "Michael Warkentin",
      ...

Frio. Es un objeto JSON único y razonable que podemos analizar fácilmente en cualquier cantidad de otros formatos. Ahora veamos eso para que podamos entenderlo lo suficientemente bien como para modificarlo y adaptarlo a nuestras necesidades.

http GET "https://api.trello.com/1/boards/4d5ea62fd76aa1136000000c/actions" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard"

Esta es la única parte que depende de Trello. Hacemos una solicitud contra la API pública para el tablero con id 4d5ea62fd76aa1136000000c. Lo obtuve yendo a https://trello.com/dev y mirando el id. Trello se agrega a la URL completa ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c).

Los campos sincey beforese explican por sí mismos. Especifico una limitde 1000porque esa es la respuesta más grande que Trello permitirá. Si su placa tiene más de mil comentarios en el intervalo de fechas relevante, se requeriría una solución de paginación más complicada aquí. Especifico un filterde commentCardporque solo estoy interesado en aquellos para los fines de esta respuesta. Si desea más tipos de acción, especifique una lista separada por comas como filter==commentCard,updateCard:idList,createCard. Los tipos de acción válidos se pueden encontrar en la referencia de la API de Trello .

Si corremos eso solo, obtendremos mucha información que es relativamente difícil de entender. Así que lo canalizamos jqpara masajearlo en algo un poco más útil.

jq 'group_by(.data.card.id) | map({key: (.[0].data.card | "\(.name) (\(.id))"), value: map({date, member: .memberCreator.fullName, comment: .data.text}) }) | from_entries'

Pieza por pieza, nuestro jqscript está haciendo las siguientes transformaciones, cada una canalizando su resultado al siguiente operador:

  • group_by(.data.card.id)
    • Trello simplemente nos da una serie de acciones. Lo convertimos en un conjunto de conjuntos, donde cada subconjunto contiene solo acciones para una tarjeta determinada. Básicamente[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
  • map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
    • No queremos una matriz de matrices; solo queremos un objeto de la forma { card1: [action1, action2, ...], card2: [action1, action2, ...], ...}. Al convertir la matriz en una matriz de pares clave-valor, podemos usarla from_entriespara convertirla en un objeto. Frio.
  • Ahora veamos lo que llamé KEY_EXPRESSIONarriba:(.[0].data.card | "\(.name) (\(.id))")
    • Esto es bastante simple. Tomamos la entrada de la tarjeta de la primera acción (ya que debería ser la misma para todas las acciones, podríamos haber elegido cualquiera, pero la primera parece ser la opción correcta). Luego usamos string interpolation ( \(...)) para construir algo que se parezca "name (id)".
  • VALUE_EXPRESSION es map({date, member: .memberCreator.fullName, comment: .data.text})
    • Podríamos haber utilizado .para mantener la matriz de todas las acciones sin cambios. Pero dado que las acciones son un poco feas, las estamos dando masajes en algo útil haciendo mapping sobre la matriz y aplicando {date, member: .memberCreator.fullName, comment: .data.text}a cada objeto de acción individual.
      • {date}es el mismo que {date: date}para jq.
      • Todo lo demás se explica por sí mismo. Ahora tenemos la fecha, el miembro (solo su nombre, pero sería fácil obtener más) y el texto del comentario.

Entonces ahí lo tienes. Er, con suerte. Podríamos haber hecho este masaje de datos en cualquier lenguaje de script, pero esto es exactamente para lo que jqfue creado, por lo que es una buena excusa para aprender una nueva herramienta genial. Consulte el manual de jq para obtener más información.

Ahora, esto funciona porque la Junta de Desarrollo de Trello es pública. Pero, ¿y si queremos datos privados?

La forma correcta de hacer esto es generar un token API. La Guía de inicio de la API de Trello tiene un resumen detallado de cómo hacerlo. Pero tenemos prisa, así que lo haremos a la manera del hombre perezoso ...

Inicie sesión en http://trello.com en Chrome y abra la consola (Ver> Desarrollador> Consola de JavaScript). Escribe $.cookie('token')en la ventana. Esto escupirá algo como "uniquememberid/somegarbledstring". Copie la parte entre comillas y modifique la solicitud para que sea algo así:

http GET "https://api.trello.com/1/boards/THE_ID_OF_THE_PRIVATE_BOARD_YOU_WANT/actions" "Cookie:token=uniquememberid/somegarbledstring" "since==Apr 1 2013 EDT" "before==May 1 2013 EDT" "limit==1000" "filter==commentCard" | jq ...

Lo único que hemos cambiado es agregar el "Cookie:token=uniquememberid/somegarbledstring"encabezado. Esto hará que Trello use el token. TEN EN CUENTA que ese token es muy privado ... si se lo das a otra persona, básicamente pueden iniciar sesión como tú hasta que lo revoques en la página de la cuenta de Trello . Entonces, ya sabes, ten cuidado. O siga el paso de generación de clave / token API.

Ahora modifique para obtener los datos precisos que necesita en el formato que desee.

Ian Henry
fuente
3

Creé una herramienta llamada reportsfortrello.com que le mostrará cuánto tiempo estuvo una tarjeta en una lista durante un período de tiempo.

Es gratis y te permite mirar 1000 acciones por tablero. También puede rastrear membresías de tarjetas.

Brendan
fuente