【Python】Redmine の projects.json、issue.json、user.json の全要素を読み出す

Python を使って Redmine の projects.json、issue.json、user.json の全要素を読み出す

概要

http://localhost/redmine/XXXX の「XXXX」部に projects.json, issues.json, users.json を指定してアクセスすると Redmine の情報が得られる。
そこで、python-redmineを使って、上記 json ファイルの情報を取得する。
なお、各 json ファイルの実例は本ページ末尾にキャプチャを添付している。

python-redmine のインストール手順

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

% pip3 install python-redmine

 

注意事項

users.json へのアクセスにはアクセス権が必要であり、権限が無い場合は以下のエラーが出る。

    raise exceptions.AuthError
redminelib.exceptions.AuthError: Invalid authentication details

 

コード

readRedmineAllElements.py

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

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

# http://localhost/redmine/issue.json にアクセスし情報を得る。
def view_issues_json(redmine):
    issues = redmine.issue.all()
    print("----------------------------------------------------")
    print("issues:")
    i = 0
    for issue in list(issues):
        print("  %d:" % i)
        print("    project:")
        print("      id: %d" % issue.project.id)
        print("      name: %s" % issue.project.name)
        print("    tracker:")
        print("      id: %d" % issue.tracker.id)
        print("      name: %s" % issue.tracker.name)
        print("    status:")
        print("      id: %d" % issue.status.id)
        print("      name: %s" % issue.status.name)
        print("    priority:")
        print("      id: %d" % issue.priority.id)
        print("      name: %s" % issue.priority.name)
        print("    author:")
        print("      id: %d" % issue.author.id)
        print("      name: %s" % issue.author.name)
        print("    assigned_to:")
        print("      id: %d" % issue.assigned_to.id)
        print("      name: %s" % issue.assigned_to.name)
        if hasattr(issue, 'parent'):
            print("    parent:")
            print("      id: %d" % issue.parent.id)
        print("    subject: %s" % issue.subject)
        print("    description: %s" % issue.description)
        print("    start_date: %s" % issue.start_date)
        print("    done_ratio: %s" % issue.done_ratio)
        print("    created_on: %s" % issue.created_on)
        print("    updated_on: %s" % issue.updated_on)
        i += 1
    print("  total_count: %d" % issues.total_count)
    print("  offset: %d" % issues.offset)
    print("  limit: %d" % issues.limit)


# http://localhost/redmine/users.json にアクセスし情報を得る。
# なお、http://localhost/redmine/users.json アクセスには admin 相当の権限が必要になる。
def view_users_json(redmine):
    users = redmine.user.all()
    print("----------------------------------------------------")
    print("users:")
    i = 0
    for user in list(users):
        #print("[{0}] {1}".format(user.id, user))
        print("  %d:" % i)
        print("    id: %d" % user.id)
        print("    login: %s" % user.login)
        print("    firstname: %s" % user.firstname)
        print("    mail: %s" % user.mail)
        print("    created_on: %s" % user.created_on)
        print("    last_login_on: %s" % user.last_login_on)
        i += 1


# http://localhost/redmine/projects.json にアクセスしたときの情報を得る。
# ['created_on', 'description', 'enabled_modules', 'id', 'identifier', 'is_public',
#  'issue_categories', 'issues', 'memberships', 'name', 'news', 'status', 'time_entries',
#  'trackers', 'updated_on', 'versions', 'wiki_pages']
def view_projects_json(redmine):
    projects = redmine.project.all()
    print("----------------------------------------------------")
    print("project:")
    for project in list(projects):
        ## [Debug] 要素一覧を見る場合は下記2行を有効にする
        #for p in dir(project):
        #   print("{0}: {1}".format(p, project[p]))
        print("  created_on: %s" % project.created_on )
        print("  description: %s" % project.description )
        print("  id: %s" % project.id )
        if hasattr(project, 'enabled_modules'):
            print("  enable_modules:") 
            if hasattr(project.enabled_modules, 'issue_tracking'):
                print("    issue_tracking: %s" % project.enabled_modules.issue_tracking)
            else:
                print("    issue_tracking:")
            if hasattr(project.enabled_modules, 'time_tracking'):
                print("    time_tracking: %s" % project.enabled_modules.time_tracking)
            else:
                print("    time_tracking:")
            if hasattr(project.enabled_modules, 'news'):
                print("    news: %s" % project.enabled_modules.news)
            else:
                print("    news:")
            if hasattr(project.enabled_modules, 'documents'):
                print("    documents: %s" % project.enabled_modules.documents)
            else:
                print("    documents")
            if hasattr(project.enabled_modules, 'files'):
                print("    files: %s" % project.enabled_modules.files)
            else:
                print("    files")
            if hasattr(project.enabled_modules, 'wiki'):
                print("    wiki: %s" % project.enabled_modules.wiki)
            else:
                print("    wiki:")
            if hasattr(project.enabled_modules, 'repository'):
                print("    repository: %s" % project.enabled_modules.repository)
            else:
                print("    repository:")
            if hasattr(project.enabled_modules, 'boards'):
                print("    boards: %s" % project.enabled_modules.boards)
            else:
                print("    boards:")
            if hasattr(project.enabled_modules, 'calendar'):
                print("    calendar: %s" % project.enabled_modules.calendar)
            else:
                print("    calendar:")
            if hasattr(project.enabled_modules, 'gantt'):
                print("    gantt: %s" % project.enabled_modules.gantt)
            else:
                print("    gantt:")
        #print("  enabled_modules: %s" % project.enabled_modules )
        print("  id: %s" % project.id)
        print("  identifier: %s" % project.identifier)
        print("  is_public: %s" % project.is_public)
        # issue_categories は print(project.issue_categories) とすると以下のように
        # ResourceSet と表示されるので、これ以上辿れないかと思われる。
        #「<redminelib.resultsets.ResourceSet object with IssueCategory resources>」
        print("  issue_categories:") 
        # issues も上記「issue_categories」と同じで ResourceSet object.
        print("  issues:") 
        # memberships も上記「issue_categories」と同じで ResourceSet object.
        print("  memberships:")
        print("  name: %s" % project.name)  
        # news も上記「issue_categories」と同じで ResourceSet object.
        print("  news:")
        print("  status: %s" % project.status)  
        # time_entries も上記「issue_categories」と同じで ResourceSet object.
        print("  time_entries:")
        # trackers も上記「issue_categories」と同じで ResourceSet object.
        print("  trackers:")
        print("  updated_on: %s" % project.updated_on)  
        # versions も上記「issue_categories」と同じで ResourceSet object.
        print("  versions: %s" % project.versions)
        # wiki_pages も上記「issue_categories」と同じで ResourceSet object.
        print("  wiki_pages: %s" % project.wiki_pages)


#[ref] https://python-redmine.com/resources/user.html?highlight=resources%20user#all
def main():
    # 一般ユーザの場合
    #redmine = Redmine('http://localhost/redmine', key='db87baa5c80c9fbaea3714439258aaf85f6f93b')

    # adminアカウントの場合
    redmine = Redmine('http://localhost/redmine', key='c25187c883205b3424e173c0f2d8e6f9f1a5221b')
    # projects.json
    view_projects_json(redmine)
    # issue.json
    view_issues_json(redmine)
    # user.json
    view_users_json(redmine)

if __name__ == '__main__':
    main()

 

Redmine のリソースファイル

projects.json

projects.json
f:id:dnkrnka:20171022000504p:plain

issues.json

issues.json
f:id:dnkrnka:20171022031215p:plain

users.json

user.json
f:id:dnkrnka:20171022040422p:plain