« 2008年01月 | メイン | 2008年03月 »

2008年02月28日

[Trac] チケットを階層化したい。

こんにちわ。ばたっちです。

tracのチケット便利なんだけど、階層化できないのが不便。

TracMasterTicketsというプラグインがあるようですが、バージョン0.11以上で対応。
現在、インタアクト社提供の日本語版(0.10.4)を使っているのでダメなようです。。orz

redMineはこの辺の問題を最初から考慮して作られているみたいですね。


とりあえず、カスタムチケットで関連チケットへのリンクを追加して、レポートで関連の閲覧をできるようにしてみました。

まずは、ticket-customに関連チケットのフィールドを追加します。


trac.ini
----
[ticket-custom]
related_tickets = text
related_tickets.label = 関連チケット

追加したら Apache再起動して設定を反映させます。

チケット編集画面にて「チケット属性を変更する」に「関連チケット」の項目が追加されるので、「#999」のようにチケット番号を記入します。複数ある場合は半角スペースで区切って記入します。

次に新規レポートを作成します。SQLはこんなカンジ。


SELECT t.id AS ticket, t.summary,
       (CASE t.status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner,
       t.resolution,
       t.time AS created, t.changetime AS modified,
       r.value AS description
  FROM ticket t
       LEFT OUTER JOIN ticket_custom r ON (t.id = r.ticket AND r.name = 'related_tickets')
  WHERE t.status IN ('new', 'assigned', 'reopened', 'closed')
  ORDER BY t.id DESC

ticket_customを JOIN して、値(チケット番号)を「description」に AS して表示しています。

こうしておくと、一覧表示で関連チケットのチケット番号が Wikiフォーマット扱いになって、リンクにしてくれます。

あとは相互リンクにしたり、チケット編集画面で関連チケットへのリンクを表示したりできるといいんだけどなぁ。(^^;


さっそく追記:

編集画面でリンク表示は簡単にできそうなのでいじってみました。
tracのソースにある web_ui.pyというファイルを以下のように変更します。


/path/to/python/lib/python2.?/site-packages/trac/ticket/web_ui.py
----
--- web_ui.py.orig      2007-05-01 18:00:28.000000000 +0900
+++ web_ui.py   2008-02-28 12:57:06.000000000 +0900
@@ -600,9 +600,11 @@
                 field['skip'] = True
             req.hdf['ticket.fields.' + name] = field
 
+        relation = "\n\nrelated " + ticket.values.get('related_tickets')
+
         req.hdf['ticket.reporter_id'] = reporter_id
         req.hdf['ticket.description.formatted'] = wiki_to_html(
-            ticket['description'], self.env, req, db)
+            ticket['description'] + relation, self.env, req, db)
 
         req.hdf['ticket.opened'] = format_datetime(ticket.time_created)
         req.hdf['ticket.opened_delta'] = pretty_timedelta(ticket.time_created)

Apache再起動すれば、チケット編集画面の「チケットの概要」に「related #999」のようにリンクが出るようになりました。

かなりやっつけ(しかもPython素人)ですが、できたのでまあいいか。A^^;

2008年02月13日

[Ruby][Rails] CGI.escapeとURI.escape。

こんにちわ。ばたっちです。

WikiのようにURLに日本語のエスケープを使いたいと思いまして。。
CGI.escapeを使っていたのですが、他にも URI.escapeというのがありました。

URI - Rubyリファレンスマニュアル
http://www.ruby-lang.org/ja/man/html/URI.html

CGI - Rubyリファレンスマニュアル
http://www.ruby-lang.org/ja/man/html/cgi.html

若干、振る舞いが違うようで、たとえば CGI.escapeでは半角スペースが「+」に
変換されてしまうのですが、URI.escapeだと「%20」に変換してくれます。

ちなみに、Railsの link_toでも半角スペースは「%20」に変換されてますね。


ちょっと比較してみました。
URI.escapeでは、さらに第二引数でエスケープしない文字列を正規表現で指定できるようですね。

「aA1あ安 ^-_.!~*'();/?:@&=+$,[]"#%|\{}<>」という文字列を変換すると、以下のようになりました。


CGI.escape(str)
=> aA1%E3%81%82%E5%AE%89+%5E-_.%21%7E%2A%27%28%29%3B%2F%3F%3A%40%26%3D%2B%24%2C%5B%5D%22%23%25%7C%5C%7B%7D%3C%3E
URI.escape(str)
=> aA1%E3%81%82%E5%AE%89%20%5E-_.!~*'();/?:@&=+$,[]%22%23%25%7C%5C%7B%7D%3C%3E
URI.escape(str, /[^-_!~*'()a-zA-Z\d;\/?:@&=+$,\[\]]/n) (*1)
=> aA1%E3%81%82%E5%AE%89%20%5E-_%2E!~*'();/?:@&=+$,[]%22%23%25%7C%5C%7B%7D%3C%3E
url_for (Rails)
=> aA1%E3%81%82%E5%AE%89%20%5E-_.!~*'();%2F%3F:@&amp;=+$,%5B%5D%22%23%25%7C%7B%7D%3C%3E

3つ目のエスケープパターンは、デフォルトのURI::UNSAFEから「.」を除去した場合です。


さらに、unescapeで逆変換した場合の結果。
(cescは CGI.escape、uescは URI.escape、mescは URI.escape(str, pattern)でそれぞれエスケープした文字列)


CGI.unescape(cesc)
=> aA1あ安 ^-_.!~*'();/?:@&=+$,[]"#%|\{}<>
CGI.unescape(uesc)
=> aA1あ安 ^-_.!~*'();/?:@&= $,[]"#%|\{}<>
CGI.unescape(mesc)
=> aA1あ安 ^-_.!~*'();/?:@&= $,[]"#%|\{}<>
URI.unescape(cesc)
=> aA1あ安+^-_.!~*'();/?:@&=+$,[]"#%|\{}<>
URI.unescape(uesc)
=> aA1あ安 ^-_.!~*'();/?:@&=+$,[]"#%|\{}<>
URI.unescape(mesc)
=> aA1あ安 ^-_.!~*'();/?:@&=+$,[]"#%|\{}<>

URI.escapeで変換したものは、URI.unescapeで変換しないと「+」が半角スペースに変換されてしまいます。

Railsの URLに「+」があった場合は半角スペースには直してくれないので、URI.unescapeに近い動きのようですね。