チケット複製プラグインにちょっと機能追加

Edgewallがサンプルとして公開しているチケット複製プラグインのticket_clone.pyにちょっと機能追加してみた。元々のticket_clone.pyは、チケットの詳細画面に"Clone"ボタンを追加し、クリックすると複製元のチケットデータが入力された状態で新規チケット作成のPreview画面に遷移するだけの、シンプルなプラグインです。Trac Lightningにも最初から入っていますね。

自分のプロジェクトでもticket_clone.pyを使っていたんですが、いつも複製した後に、複製元のチケットに「#○○として複製したよ」的なコメントを手動で書き込むのが若干面倒でした。複製したチケットには、「Cloned from #複製元のチケットID」と自動的に書かれるんですがおしい。これだと、複製元からはこのチケットに辿れないんですよね。

ということで、自動的に複製元チケットにリンクを記述するようにカスタマイズしてみました。

  • チケットの作成画面。"Clone"ボタンは同じです。

http://sourceforge.jp/projects/shibuya-trac/wiki/plugins%2FTicketClonePlugin/attach/ticketclone1.png

  • Preview画面で、画面下部にチェックボックスを追加しています。ここにチェックを付けると、複製元にコメントを自動的に付けます。現在のところコメントは固定(チケットを複製しました。 #作成したチケットID)ですが、好きなコメントを追加できるようにした方が良いかな? 複製の理由はチケット次第な気もしますし。

http://sourceforge.jp/projects/shibuya-trac/wiki/plugins%2FTicketClonePlugin/attach/ticketclone2.png

  • チケット作成後、複製元のチケットを参照するとこのようにコメントが付くようになっています。これで自動的に相互リンクになるので便利!

http://sourceforge.jp/projects/shibuya-trac/wiki/plugins%2FTicketClonePlugin/attach/ticketclone3.png

実装で悩んだのが、コメントの記述をITicketChangeListener#ticket_createdメソッドで実装しているんですが、複製元のチケットIDをどうやって渡すかという所。リクエストパラメータとしてPOSTされて来ている値ですが、Requestオブジェクトが渡ってこないので簡単にとれない。
仕方ないので、IRequestFilter#pre_process_requestメソッドで、事前にカレントスレッドの属性に複製元のチケットIDを設定して渡す事に。JavaのThreadLocalみたいな物ですね。

作成したPluginは、Shibuya.tracに上げておきました。