|
# -*- coding: utf-8 -*-
|
|
|
|
# redmine本家のチケット内容を、指定したRedmine上にコピーする。
|
|
|
|
# カスタムフィールド、
|
|
# +1,コメント数をカウントし、カスタムフィールドとして設定する。
|
|
# コメントはまとめて一つのカスタムフィールドに設定する。
|
|
|
|
# Python-Redmine ライブラリを利用している。
|
|
|
|
from redminelib import Redmine
|
|
from redminelib.exceptions import ResourceNotFoundError
|
|
from redminelib.exceptions import ServerError
|
|
|
|
import datetime
|
|
import time
|
|
|
|
# 認証情報と共通定義は別ファイルから読み込む
|
|
import authinfo
|
|
|
|
redmine_org_url=authinfo.redmine_org_url
|
|
redmine_copy_url=authinfo.redmine_copy_url
|
|
# redmine_tokyo_url=authinfo.redmine_tokyo_url
|
|
|
|
redmine_org_id =authinfo.redmine_org_id
|
|
redmine_org_pass=authinfo.redmine_org_pass
|
|
redmine_copy_key=authinfo.redmine_copy_key
|
|
#redmine_tokyo_key=authinfo.redmine_tokyo_key
|
|
|
|
redmine_org_pjname=authinfo.redmine_org_pjname
|
|
redmine_copy_pjname=authinfo.redmine_copy_pjname
|
|
|
|
vote_tracker_id=authinfo.vote_tracker_id
|
|
|
|
# 関数を別ファイルに分けた
|
|
import redmineorg_copy_sub
|
|
|
|
# 一回で読込む最大チケット数
|
|
# コピー元サーバ負荷、処理中の削除/アクセス不可化も考慮し設定
|
|
limit_num=50
|
|
|
|
# 無限ループにならないようループ回数を設定した。
|
|
# 2018/12現在のredmineprgの件数からすれば十分(3万件、月200(即時削除多数))
|
|
max_loop_count=1000
|
|
|
|
offset_num=0
|
|
|
|
# 各redmineサーバに接続する
|
|
|
|
redmine_org = Redmine(redmine_org_url, username=redmine_org_id, password=redmine_org_pass)
|
|
redmine_copy = Redmine(redmine_copy_url , key=redmine_copy_key)
|
|
# redmine_tokyo = Redmine(authinfo.redmine_tokyo_url, key=redmine_tokyo_key)
|
|
|
|
|
|
# コピー先PJの現在のチケット数を確認し、offset=本PJのチケット数でコピー開始する。
|
|
# 再実行時は、この件数をオフセットとして処理を開始する。初回は0
|
|
#
|
|
# 厳密に行う場合は、チケット削除時を考慮し、最終チケット番号のチェック必要
|
|
# redmine本家では、今から古いチケットの削除は行わないから、この処理で十分と思う。
|
|
|
|
issues= redmine_copy.issue.filter(project_id=redmine_copy_pjname,status_id='*')
|
|
redmine_copy_issue_total=len(issues)
|
|
print (redmine_copy_issue_total)
|
|
|
|
offset_num=redmine_copy_issue_total
|
|
|
|
for i in range(max_loop_count):
|
|
issues= redmine_org.issue.filter(project_id=redmine_org_pjname,status_id='*',sort='id',offset=offset_num, limit=limit_num, include=['children', 'journals','watchers','relations'])
|
|
|
|
# 読み込んだチケットの件数が0なら、コピー終了とみなして終了する。
|
|
issues_len=len(issues)
|
|
if(issues_len==0):
|
|
break
|
|
|
|
for issue_org in issues:
|
|
print (issue_org.id)
|
|
|
|
redmineorg_copy_sub.issue_org_copy(issue_org,redmine_org,redmine_org_url,redmine_copy,redmine_copy_pjname,vote_tracker_id)
|
|
# time.sleep(1)
|
|
|
|
offset_num=offset_num+issues_len
|
|
|
|
# コピー元サーバの負荷考慮しsleep
|
|
time.sleep(10)
|
|
|
|
|