0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Backlog の残課題の個数を人ごと(+プロジェクトごと)に出すスクリプト

Last updated at Posted at 2021-07-01

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}")
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?