【Python】Redmine の1チケットを読み出す

Redmineの1チケットを読み出す

概要

Redmine の各チケットへの URL の末尾に「.json」と付けると JSON 形式でアクセスできる。
本プログラムではこの情報全てをプログラムから読み出す。
以下はチケット 2 に対して「.json」を付与した場面である。
f:id:dnkrnka:20171021163741p:plain:w400

python-redmine

python-redmineを使う。
pip3 を使って python-redmine をインストールする。

% pip3 install python-redmine

下記プログラムは、こちらのサイト様を参考にした。

readRedmineTicket3.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*- 

from redminelib import Redmine
from redminelib.exceptions import ResourceNotFoundError
import sys

def view_ticket_detail(tid):
    try: 
        redmine = Redmine('http://localhost/redmine', key='db87baa5c80c9fbaea3714439258aaf85f6f93b')
        issue = redmine.issue.get(tid)
#       print (dir(issue))
        print ('id:%d' % issue.id)
        print ('project:%s' % issue.project.name)
        print ('project_id:%d' % issue.project.id)
        print ('subject:%s' % issue.subject)
        print ('tracker:%s' % issue.tracker.name)
        print ('tracker_id:%d' % issue.tracker.id)
        print ('description:%s' % issue.description)
        print ('status:%s' % issue.status.name)
        print ('status:%d' % issue.status.id)
        print ('author:%s' % issue.author.name)
        print ('author_id:%d' % issue.author.id)
        if hasattr(issue, 'assigned'):
            print ('assigned:%s' % issue.assigned_to.name)
            print ('assigned_id:%d' % issue.assigned_to.id)
        print ('watcher--------')
        for u in issue.watchers:
            print (' %d:%s' % (u.id, u.name))
        print ('作成日:%s' % issue.created_on)
        print ('更新日:%s' % issue.updated_on)
        if hasattr(issue, 'start_date'):
            print ('start_date:%s' % issue.start_date)
        if hasattr(issue, 'due_date'):
            print ('issue_date:%s' % issue.due_date)
        if hasattr(issue, 'issue.estimated_hours'):
            print ('estimated_hours:%d' % issue.estimated_hours)
        print ('作業時間:%d' % issue.spent_hours)
        print ('作業時間の記録----------')
        for t in issue.time_entries:
            print('  ID:%d' % t.id)
            print('  活動:%s' % t.activity)
            print('  コメント:%s' % str(t.comments))
            print('  作成日:%s' % t.created_on)
            print('  時間:%s' %t.hours)
            print('  チケットID:%s' % t.issue)
            print('  プロジェクトID:%s' % t.project)
            print('  日付:%s' % t.spent_on)
            print('  更新日:%s' % t.updated_on)
            print('  user:%d %s' % (t.user.id,t.user.name)) 
        print ('done_ratio:%d' % issue.done_ratio) 
        print ('priority:%s' % issue.priority.name)
        print ('priority_id:%d' % issue.priority.id)
        print ('attachements---')
        for f in issue.attachments:
            print ('  id:%d' % (f.id))
            print ('  author:%s' % (f.author)) 
            print ('  content_url:%s' % (f.content_url))
            print ('  created_on:%s' % (f.created_on))
            print ('  description:%s' % (f.description))
            print ('  filename:%s' % (f.filename))
            print ('  filesize:%d' % (f.filesize))
            print ('  ---------------')
        print ('changeset---')
        for c in issue.changesets:
            #コミットログがディクショナリ型として格納
            print ('  %s' % c)
        if hasattr(issue, 'parent'):
            print ('parent:%s' % issue.parent)
        print ('children----------')
        for c in issue.children:
            print ('  %s:%s' % (c.id, c.subject))
    except (ResourceNotFoundError):
        print("Not found [{0}]".format(tid))

#
def main():
    argv  = sys.argv
    argc  = len(argv)
    if(argc == 1):
        print("Usage: {0} [TicketID]".format(argv[0]))
        return
    else:
        tickets = argv[1]

    for i in range(1,argc):
        view_ticket_detail(argv[i])

if __name__ == '__main__':
    main()