py-trelloことはじめ

うちのチーム内ではメンバーのタスク管理にTrelloを使っているのですが、Trello APIをPythonで良い感じに叩けるライブラリがないか探したところ、py-trelloが良い感じだったので、基本的な使い方をメモがてら残します。
また簡単なテストとして作った、完了リストにたまったカードを自動的に削除するスクリプトを文末に記載しましたのでご参考にどうぞ。

## インストール
pipでインストールできます。

```bash
$ sudo pip3 install py-trello
```

## 接続
各種認証情報を使ってTrelloへ接続します。
Clientオブジェクトを作成して、そこから認証元のユーザに紐付くボードやカードを参照したり操作したりできます。
※各認証情報は[ここ](https://trello.com/1/appKey/generate)から生成できます。

```python
from trello import TrelloClient

client = TrelloClient(
    api_key='xxxxxxxxxxxxxxxxxxxxxxxxxx',
    api_secret='xxxxxxxxxxxxxxxxxxxxxxxxxx',
    token='xxxxxxxxxxxxxxxxxxxxxxxxxx',
)
```

## Trelloの操作
[ソースコード](https://github.com/sarumont/py-trello)を眺めるとだいたい書き方はわかりますが、代表的な操作について下記に残します。

### ボードの操作

・ボードの一覧の取得(ボードオブジェクトのリスト)

```python
>>> client.list_boards()
[<Board Elegantt User Data>, <Board Test>]
```

・ボードメンバーのidの一覧の取得

```python
>>> test_board = client.list_boards()[1] # <Board Test>を変数化
>>> test_board.all_members()
[<Member 5a3c63ad96a0b625d13ede3e>]
```

・ボードの追加

```python
>>> client.add_board("Test2", permission_level='private')
<Board Test2>
```

・ラベル一覧の取得

```python
>>> test_board.get_labels()
[<Label test>, <Label test4>, <Label test3>, <Label test2>, <Label test5>, <Label test6>]
```

・ラベルのidの取得

```python
>>> test_label = test_board.get_labels()[0] # <Label test>を変数化
>>> test_label.id
'5aee9e93841642c2a88e7ca1'
```

### リストの操作

・リストの一覧の取得(リストオブジェクトのリスト)

```python
>>> test_board.list_lists()
[<List 作業中>, <List ToDo>, <List 完了>, <List Test>]
```

・リストの追加

```python
>>> test_board.add_list("Test2")
<List Test2>
```

・オープン状態のリスト一覧

```python
>>> test_board.open_lists()
[<List Test2>, <List 作業中>, <List ToDo>, <List 完了>]
```

・クローズしたリスト一覧

```python
>>> test_board.closed_lists()
[<List Test>]
```



### カードの操作
・ボード単位のカード一覧(カードオブジェクトのリスト)

```python
>>> test_board.all_cards()
[<Card task1>, <Card test1>, <Card test3>, <Card task2>, <Card task3>, <Card test2>]
```

・リスト単位のカード一覧

```python
>>> completed_list = test_board.list_lists()[3] # <List 完了>を変数化
>>> completed_list.list_cards()
[<Card task3>, <Card task2>]
```


・カードの追加

```python
>>> todo_list = test_board.list_lists()[2] # <List ToDo>を変数化
>>> todo_list.add_card("Task4")
<Card Task4>
```


・メンバーアサイン

```python
>>> test_card = todo_list.list_cards()[0] # <Card Task4>を変数化
>>> test_card.assign("5a3c63ad96a0b625d13ede3e")
```

・ラベルの追加

```python
>>> test_card.add_label(test_label)
```


・チェックリストの追加

```python
>>> test_card.add_checklist("test_check_list", ["item1", "item2", "item3"])
<Checklist 5af3f003448004cfdeeb486b>
```

・異なるリストへのカードの移動

```python
>>> todo_list.id # <List ToDo> のidを取得
'5aee9e93a37534946c5f5e0b'
>>> test_card.change_list('5aee9e93a37534946c5f5e0b')
```

・カードのアーカイブ

```python
>>> test_card.set_closed(True)
```


・カード削除

```python
>>> test_card.delete()
```

## テストスクリプト
汚いコードですが、完了リストに1週間以上溜まっているカードをアーカイブするPythonスクリプトを書きました。
これをcronで毎日17時まわして、自動的にカードを削除し、完了リストが膨れ上がるのを防止します。

```python:trello_delete_old_complete_cards.py
#!/usr/bin/env python3
# coding:utf-8

from trello import TrelloClient
from datetime import datetime,timezone,timedelta

client = TrelloClient(
    api_key='xxxxxxxxxxxxxxxxxxxxxxxxxx',
    api_secret='xxxxxxxxxxxxxxxxxxxxxxxxxx',
    token='xxxxxxxxxxxxxxxxxxxxxxxxxx',
)

board_list = client.list_boards()
for board in board_list:
    if board.name == "Test":
        for list in board.list_lists():
            if list.name == "完了":
                for card in list.list_cards():
                    one_week_before = datetime.now(timezone.utc) - timedelta(days=7)
                    if card.dateLastActivity < one_week_before:
                        card.set_closed(True)
```