プログラミング言語を使ってRedmineから情報を取得する
コマンドラインからシンプルなREST操作 (GET) を試してみたところで、次に、プログラミング言語を使ってRedmineにアクセスをしてみましょう。
Redmineには、Redmine REST APIを経由してRuby、Python、Javaなどの各種言語から容易にアクセスできます。今回は例として、Pythonを使ってアクセスしてみます。
事前準備として、サンプルコードで利用するライブラリPython Redmineを次のコマンドでインストールします。
$ easy_install python-redmine
python-redmineのインストールが済んだら、Pythonを対話モードで起動し、Redmineサイトに接続してみます。
>>> from redmine import Redmine
>>> redmine = Redmine('http://redmine-server', key='API_ACCESS_KEY')
アクセスキーではなく、ユーザ名とパスワードでアクセスするには次のようにします。
>>> redmine = Redmine('http://redmine-server', username='USERNAME', password='PASSWORD')
では、プロジェクトのリストを取得してみましょう。次のようにコマンドを実行します。
>>> projects = redmine.project.all()
>>> for project in projects:
... print("%d %s" % (project.id, project.name))
すると、次のように結果が表示されます。
3 サークル活動 1 ビジネス 4 執筆 5 開発案件 2 ホーム
どのオブジェクトがどのattributeを持つのかは、RedmineのDeveloper Guide をご覧ください。例えば、Projects なら name や id をはじめ、identifier や description などのattributeがあることが分かります。
チケット (Issues) についても同じように、次のコマンドで取得できます。
>>> issues = redmine.issue.all()
特定のプロジェクトに含まれるチケットのみを取得するには、次のようにProject IDを指定します。
>>> issues = redmine.issue.all(project_id=1)
ここまで示したように、たった数行のコードでRedmineへの接続と、プロジェクト一式、チケット一式の取得ができてしまいました。
接続先のURLとAPIアクセスキーを複数用意し、それぞれについて、プロジェクトやチケットの情報を取得することで、複数Redmineサイトからの情報集約が実現できそうですね。
プラグインにするか独立したツールに仕立てるか
Redmineは、Ruby on Railsフレームワークの流儀でプラグインを作成し追加する仕組みが提供されています。また、RubyのAPIライブラリも提供されているため、Rubyを用いてプラグインを作成することも可能です。
今回取り組んでいる、情報収集ツールの利用想定として、週次や月次の打合わせでの進捗確認が考えられ、バッチ処理で実行して結果が見られればよいと判断します。また、出力結果をレポートとして履歴を残しておくことで、過去のどの時期にどんな状況であったかのスナップショットをアルバムのように残すことも可能です。
これらの理由から、今回はRedmineに依存せずに、情報のみを集約することができる独立したツールとして作成することとします。
複数のRedmineサイトのURLとAPIアクセスキーの管理
複数のURLとAPIアクセスキーを簡単に管理できる方法としては、設定ファイルを利用する手が考えられます。今回は、JSON形式で記述することとします。
{
"site_a": {
"site": "http://site_a/redmine/"
},
"site_b": {
"site": "http://site_b/redmine/",
"key": "API_KEY"
}
}
このJSONデータをPythonで読み取るには、次のように記述します。このコードでは、conf.json というファイルを読み取っています。
>>> import json
>>> f = open('conf.json')
>>> conf = json.load(f)
>>> f.close()
>>> conf['site_b']
{u'site': u'http://site_b/redmine/', u'key': u'API_KEY'}
ただし、設定ファイルにはAPIアクセスキーを記載することになるので、読み取り権限を適切に設定するなど、保管には注意を払ってください。
プロジェクトやチケットの親子関係
Redmine上のプロジェクトやチケットは親子関係を持つことができます。親と子の間には、次の図に示すように1対多の関係にあります。
この図では、Project 2、Project 3はProject 1のサブプロジェクト(子)であり、Ticket 4、Ticket 5はTicket 3の子チケット、Ticket 10、Ticket 11、Ticket 12は、Ticket 8の子チケットです。
REST API経由で、Project(プロジェクト)やIssue(チケット)の情報を取得すると、すべての要素がフラットな状態で返されます。
ProjectもIssueも親は parent 属性で指定されているので、親子の依存関係を集約した情報に反映するには、この関係を解釈する必要があります。今回はこれを、親と子の関係を親から子への一方向リスト (1対多) で表し、できあがったツリー構造をバックトラックで辿るという方法で解釈します。
