É possível listar todas as atividades para um determinado período no Trello?

11

Uso o Trello há vários meses e costumo postar atividades nos cartões enquanto trabalho com eles e os movo da esquerda para a direita na lista 'Concluído'. Não aproveito as datas de vencimento. Existe um mecanismo para listar o texto da atividade em todos os cartões para um determinado intervalo. Estou tentando extrair alguns dados brutos para alimentar um relatório de status por um determinado período.

Exemplo: se o dia atual for 15 de maio de 2013. Desejo produzir uma lista de todo o texto da atividade em cada cartão que tenha entradas de 'atividade' para o período de 29 de abril a 3 de maio.

Brian
fonte
Isso pode ser feito, mas apenas usando a API do Trello. Você se sente confortável fazendo alguma programação leve para obter os dados que deseja?
Ian Henry
@IanHenry Sim, eu estou confortável.
27413 Brian

Respostas:

14

Sim, é, usando a API do Trello e algumas outras ferramentas.

Esta resposta depende do HTTPie e do jq , duas ferramentas disponíveis gratuitamente que podem ser instaladas via pip e Homebrew se você estiver usando um Mac:

$ pip install httpie
$ brew install jq

Usando HTTPiepodemos consultar a API do Trello para obter o feed de ações brutas de um quadro, podemos usar jqpara transformar esses dados em algo útil.

Vamos começar com algo "simples". O comando a seguir nos fornecerá todos os comentários feitos no Trello Dev Board no mês de abril de 2013. Vou explicar isso em um 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'

Se tudo correu conforme o planejado, deveríamos ver algo assim:

{
  "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",
      ...

Legal. Esse é um objeto JSON único e razoável que podemos analisar facilmente em qualquer número de outros formatos. Agora vamos passar por isso para que possamos entendê-lo bem o suficiente para modificá-lo para atender às nossas necessidades.

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

Essa é a única parte que depende do Trello. Nós fazemos uma solicitação contra a API pública para o quadro com o ID 4d5ea62fd76aa1136000000c- eu consegui isso em https://trello.com/dev e olhando o ID que o Trello anexa ao URL completo ( https://trello.com/board/trello-development/4d5ea62fd76aa1136000000c).

Os campos sincee beforesão auto-explicativos. Especifiquei um limitde 1000porque essa é a maior resposta que o Trello permitirá. Se seu quadro tiver mais de mil comentários no período relevante, uma solução de paginação mais complicada seria necessária aqui. Especifiquei um filterde commentCardporque só estou interessado naqueles para os fins desta resposta. Se você quiser mais tipos de ação, especifique uma lista separada por vírgula como filter==commentCard,updateCard:idList,createCard. Tipos de ação válidos podem ser encontrados na referência da API do Trello .

Se executarmos isso sozinhos, obteremos muitas informações relativamente difíceis de entender. Então nós o colocamos jqpara massagear em algo um pouco mais ú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'

Peça por peça, nosso jqscript está fazendo as seguintes transformações, cada uma canalizando seu resultado para o próximo operador:

  • group_by(.data.card.id)
    • O Trello nos fornece uma série de ações. Transformamos isso em uma matriz de matrizes, onde cada sub-matriz contém apenas ações para um determinado cartão. Basicamente[[card1_action1, card1_action2...], [card2_action1, card2_action2...], ...]
  • map({key: KEY_EXPRESSION, value: VALUE_EXPRESSION}) | from_entries
    • Não queremos uma matriz de matrizes; nós apenas queremos um objeto do formulário { card1: [action1, action2, ...], card2: [action1, action2, ...], ...}. Ao transformar a matriz em uma matriz de pares de valores-chave, podemos usá-la from_entriespara transformá-la em um objeto. Legal.
  • Agora vamos ver o que eu chamei KEY_EXPRESSIONacima:(.[0].data.card | "\(.name) (\(.id))")
    • Isto é bastante simples. Tomamos a entrada do cartão desde a primeira ação (já que deve ser a mesma para todas as ações, poderíamos ter escolhido qualquer, mas a primeira parece ser a escolha sensata). Em seguida, usamos a interpolação de strings ( \(...)) para construir algo parecido "name (id)".
  • VALUE_EXPRESSION é map({date, member: .memberCreator.fullName, comment: .data.text})
    • Poderíamos ter usado apenas .para manter inalterada a matriz de todas as ações. Mas, como as ações são meio feias, estamos massageando-as em algo útil, mapexecutando ping sobre o array e aplicando-o {date, member: .memberCreator.fullName, comment: .data.text}a cada objeto de ação individual.
      • {date}é o mesmo que {date: date}para jq.
      • Tudo o resto é bastante auto-explicativo. Agora temos a data, o membro (apenas o nome, mas seria fácil obter mais) e o texto do comentário.

Então aí está. Er, espero. Poderíamos ter feito essa massagem de dados em qualquer linguagem de script, mas é exatamente para isso que jqfoi criado, por isso é uma boa desculpa para aprender uma nova ferramenta interessante. Confira o manual do jq para obter mais informações.

Agora, isso funciona porque o Trello Dev Board é público. Mas e se quisermos dados particulares?

A maneira correta de fazer isso é gerar um token de API. O Guia de introdução da API do Trello apresenta uma explicação detalhada de como fazer isso. Mas estamos com pressa, então vamos fazer do jeito do preguiçoso ...

Faça login no http://trello.com no Chrome e abra o console (Exibir> Desenvolvedor> JavaScript Console). Digite $.cookie('token')na janela. Isso cuspirá algo como "uniquememberid/somegarbledstring". Copie a parte entre as aspas e modifique a solicitação para algo como isto:

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

A única coisa que mudamos é adicionar o "Cookie:token=uniquememberid/somegarbledstring"cabeçalho. Isso fará com que o Trello use o token. Observe que esse token é muito particular ... se você o der a outra pessoa, ele poderá efetuar login como você até você revogá-lo na página da conta do Trello . Então, tome cuidado. Ou siga a etapa de geração de chave / token da API.

Agora modifique para obter os dados precisos necessários no formato desejado.

Ian Henry
fonte
3

Criei uma ferramenta chamada reportsfortrello.com que mostrará quanto tempo um cartão estava em uma lista durante um período de tempo.

É gratuito e permite que você analise 1000 ações por quadro. Também pode rastrear associações de cartões.

Brendan
fonte