Tracのチケット一覧のCSV/TSVエクスポート
Tracでは、チケットの一覧を、CSV/TSV形式でエクスポートすることが可能です。
ただ、この出力は、以下のような問題があって多少使いづらい。
- 文字コードがUTF-8
- 日付が一加工を加える必要がある形式
- Trac0.11では秒をint値として出力したもの
- Trac0.11で「2008-08-30T10:00:00Z+0900」というISO 8601形式
国際化としては正しいと思うのですが、これでは、出力したものをExcelで読み込んでグラフ表示したりする際にも、一手間かかってしまいまいます。
ということで、この問題を解決するべく、以下のようなパッチを作ってみました。
Trac0.10とTrac0.11では、処理が大分異なっているようなので、それぞれのパッチを作成しました。
- 変更点
- 文字コードをcp932とする
- 日付の値はExcelの書式設定で言うところの「yyyy/mm/dd hh:mm:ss」という形式にする
Trac0.10
TracLightning 1.8.2を利用して確認しました。
Index: report.py =================================================================== --- report.py (revision 1) +++ report.py (working copy) @@ -491,11 +491,34 @@ def _render_csv(self, req, cols, rows, sep=',', mimetype='text/plain', filename=None): req.send_response(200) - req.send_header('Content-Type', mimetype + ';charset=utf-8') + req.send_header('Content-Type', mimetype + ';charset=cp932') if filename: req.send_header('Content-Disposition', 'filename=' + filename) req.end_headers() + def fmt_time(t): + return format_time(t) + + def fmt_datetime(dt): + return format_datetime(dt) + + col_conversions = { + 'time' : fmt_time, + 'datetime' : fmt_datetime, + 'changetime' : fmt_datetime, + 'date' : fmt_datetime, + 'created' : fmt_datetime, + 'modified' : fmt_datetime, + } + + converters = [col_conversions.get(c.strip('_'), unicode) for c in cols] + + for rowindex in xrange(len(rows)): + row = list(rows[rowindex]) + for colindex in xrange(len(row)): + row[colindex] = converters[colindex](row[colindex]).encode('utf-8') + rows[rowindex] = row + req.write(sep.join(cols) + '\r\n') for row in rows: req.write(sep.join(
Trac0.11
TracLightning 2.0.6を利用して確認しました。
Index: report.py =================================================================== --- report.py (revision 1) +++ report.py (working copy) @@ -639,34 +639,34 @@ def _send_csv(self, req, cols, rows, sep=',', mimetype='text/plain', filename=None): req.send_response(200) - req.send_header('Content-Type', mimetype + ';charset=utf-8') + req.send_header('Content-Type', mimetype + ';charset=cp932') if filename: req.send_header('Content-Disposition', 'filename=' + filename) req.end_headers() - def iso_time(t): - return format_time(t, 'iso8601') + def fmt_time(t): + return format_time(t) - def iso_datetime(dt): - return format_datetime(dt, 'iso8601') + def fmt_datetime(dt): + return format_datetime(dt) col_conversions = { - 'time': iso_time, - 'datetime': iso_datetime, - 'changetime': iso_datetime, - 'date': iso_datetime, - 'created': iso_datetime, - 'modified': iso_datetime, + 'time' : fmt_time, + 'datetime' : fmt_datetime, + 'changetime' : fmt_datetime, + 'date' : fmt_datetime, + 'created' : fmt_datetime, + 'modified' : fmt_datetime, } converters = [col_conversions.get(c.strip('_'), unicode) for c in cols] writer = csv.writer(req, delimiter=sep) - writer.writerow([unicode(c).encode('utf-8') for c in cols]) + writer.writerow([unicode(c).encode('cp932') for c in cols]) for row in rows: row = list(row) for i in xrange(len(row)): - row[i] = converters[i](row[i]).encode('utf-8') + row[i] = converters[i](row[i]).encode('cp932') writer.writerow(row) raise RequestDone
チケットの一覧だけでなく、チケット単体でもCSV/TSVエクスポートが可能なのですが、その場合は、web_ui.pyを修正することが必要となります。
TracLightning 2.0.6 Released
2.0.4→2.0.6の変更点はこちら。
- Hudson連携の不具合を修正
- マイチケット機能の追加
- usermanagerでdeveloperグループの設定ができるように修正
マイチケット機能というのは、TracのWikiで以下のように記述すると、ログインユーザのチケットが一覧できるというもの(おそらく)。
[[TicketQuery(owner=$USER,table)]]
Wikiのトップページなどに指定しておけば、ユーザが自分のチケットを確認することが可能になります。
Trac Lightning 2.0.0 リリース
何度かbeta版がリリースされていましたが、正式に2.0.0がリリースされました。
早速インストールしてみましたが、問題なく動作しました。
1.8.x --> 2.0.0での主な変更点は、以下のようになります。
- Subversion 1.5 の利用
- どこに何をマージしたのかを追跡するマージトラッキング(Merge Tracking)機能
- 特定箇所のみを取り出すのに、広大なる木構造を取り出さなくても済む(Sparse Checkout)機能
- update, switch, mergeによる競合発生時にその競合を対話的に解決する機能。
- 変更リスト(Changelist; 選択した名称に関連づけられたファイルのリスト)のサポート
- shardingを用いたFSFS(Subversionのファイルシステム実装)上の改善
- Trac 0.11-ja の利用
- ワークフローのカスタマイズ機能
- カスタムクエリーの保存機能
- リポジトリブラウザでツリー形式で展開できるようになった
- TracPluginの新規追加
Tracでは、0.11になって便利な機能が多く追加されましたね。
個人的には、これまでSQLを書かなければいけなかったTracチケットのクエリが、ブラウザから条件を選択して保存できるようになったのが特に便利だと感じています。
ワークフロー(チケットのステータス)も、カスタマイズできるようになって、これで、これまではできなかった承認などのステータスの管理もできますね(ブラウザからカスタマイズできないのが少し残念なところなのですが、これはTracPluginでも作るかな・・・)。
また、今回のリリースでは、私も、TracHudsonPluginやRepoSearchPluginのTrac0.11対応をしたものをcontributeさせて頂いたので、ぜひ利用してみてください(といっても、機能的な変更は0.10のときから何もないのですが・・・)。
EclipseでTracプラグイン開発
最近、Eclipse/Maven2/Hudsonといった開発ツールのプラグインの調査や開発を行っています。
それぞれ、プラグイン機構をベースとして構築されたツールですが、ユーザが自分でプラグインを開発し、組み込むことができるため、多くのプラグインがOSSとして提供されています。
今回、新たにTracについてもプラグインを開発する機会ができたので、開発の仕方についてまとめておきます。
準備
以下のものを用意しておきます。
プラグインの開発
今回は、Tracが0.10から0.11にバージョンアップされた影響で、動作しなくなってしまった以下のプラグインの修正を行います。
また、今回はTracHackからソースを取得して修正していますが、プラグイン自体の開発については、以下のあたりを参考にしてください。
プラグインのインストール
コマンドプロンプトから、開発したプラグインをTracの環境にインストールします。
>python setup.py develop
インストールが成功すると、
プラグインをインストールをしたら、trac.iniで、プラグインを有効にする設定をしておいてください。
プラグインのデバッグ設定
PyDevを使うと、tracdというTracのデバッグコンソールを立ち上げ、Eclipse上からデバッグすることが可能になります。
Eclipseのメニューで、「Run」→「Open Debug Dialog...」でデバッグ設定ウィンドウを立ち上げ、「Python Run」から設定を新規作成します。
設定は以下のようになります。
Project | デバッグ対象のプロジェクト |
---|---|
Main Module | ※手動で入力します。 |
Program arguments | -p 80 --auth=*, |
Working directory |
プラグインのデバッグ実行
ブラウザから、以下のURLにアクセスします。
http://localhost/SampleProject
後は、Eclipse上でブレークポイントをしかけておけば、デバッグが可能になります。
※追記
修正したRepoSearchPluginは、TracHackの方に投稿し、取り込みをお願いしました。