nulab Backlog で人ごと、プロエクトごとの残課題数を出すスクリプトを作りました。担当者別、担当者とプロジェクト別で数値を出します。参考になれば幸いです。
集計例
Sample Name : 261
Sample Name : Project A : 77
Sample Name : Project B : 4
Sample Name : Project C : 7S
Sample Name : Project D : 8
Sample Name : Project E : 1
Sample Name : Project F : 1
Sample Name : Project G : 1
Sample Name : Project H : 1
Sample Name : Project I : 161
目的
- 自分の持っている残課題数を確認したい。
- 多すぎるなら整理が必要だし、忘れられている課題もあるかもしれないが、全てのプロジェクトで画面を開いて検索するのは辛い。
環境
- Python 3.9.0
コード
まずは、データを取得するための準備です。
Backlog の時間を集計するスクリプトのように課題をすべて取得して計算してもよいのですが、全課題を取得するとデータ量がとても大きくなるので、人ごと・プロジェクトごとに集計値のみ取得する方針で作りました。
未完了の課題数は、全ての課題数から完了済みの課題数を引くことで計算するようにしました。
(未完了のステータスを列挙するやり方だと、ステータスをカスタマイズしている場合に、コードの変更が必要になるので。)
import json
import urllib
class BacklogUrl:
base = 'https://xxxxx.backlog.xxx'
key = '__API_KEY__'
def __init__(self, path, param = {}):
self.path = path
self.param = param
def url(self):
return BacklogUrl.base + self.path
def get(self):
try:
req = urllib.request.Request(
'{}?{}'.format(
self.url(),
urllib.parse.urlencode(
self.param | {'apiKey': BacklogUrl.key}
)
)
)
with urllib.request.urlopen(req) as res:
body = res.read()
return json.loads(body)
except e:
print(e.message)
raise e
class Backlog:
def get_users():
return BacklogUrl('/api/v2/users').get()
def get_unclosed_issue_count(param = {}):
all_count = BacklogUrl('/api/v2/issues/count', {} | param).get()['count']
closed_count = BacklogUrl('/api/v2/issues/count', {'statusId[]': 4} | param).get()['count']
return all_count - closed_count
def get_projects():
return BacklogUrl('/api/v2/projects').get()
ユーザIDが必要なので、まずはユーザを全て取得し、該当ユーザに絞り込みます。
今回は1人だけに絞り込んでありますが、コード自体は複数人でも実行可能です。
users = Backlog.get_users()
filtered_users = [x for x in users if 'Sample' in x['userId']]
絞り込まれた全てのユーザに対して、未完了の課題数を取得して表示します。
for user in filtered_users:
count = Backlog.get_unclosed_issue_count({'assigneeId[]': user['id']})
print(f"{user['name']} : {count}")
プロジェクトをアクティブなものに絞り込みます。
これはリクエスト回数を減らすためですが、アーカイブされたものについても出力したい場合は、フィルタ条件を除外してください。
filtered_projects = [x for x in Backlog.get_projects() if not x['archived']]
絞り込まれた全てのユーザに対して、それぞれのプロジェクトについて未完了の課題数を取得して表示します。
ただし未完了の課題数が0なら表示しません。
for user in filtered_users:
for project in Backlog.get_projects():
count = Backlog.get_unclosed_issue_count({'assigneeId[]': user['id'], 'projectId[]': project['id']})
if count == 0:
continue
print(f"{user['name']} : {project['name']} : {count}")