2012年8月12日日曜日

【Redmine】チケットの題名を正規表現でフィルタリング

目的
チケットの題名にて、
プレフィックスとして、□や、■など、意味を持たせた場合に、
□及び、■を含むチケットのフィルタリングを行いたい。
現状題名の操作にある、『含む』では、
正規表現での□.*というフィルタリングしか行えないため、
汎用性を持たせるため、
題名の操作に正規表現を追加し、
正規表現による題名のフィルタリングを行えるようにする。


作業手順
Ruby on Rails自体、詳細に把握しているわけではないので、
出力されたhtmlからボトムアップ的に調査する。

チケット一覧ページのhtmlには、
<legend onclick="toggleFieldset(this);">フィルタ</legend>
とある。 




まずは、issuesによるページに含まれるので、
app/models/index.html.erbを見る。
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
という行があり、config\locales\ja.ymlにて、
label_filter_pluralをみるとフィルタと関連付けられているため、

ここが当該箇所だと断定。
 
その下の行を見てみると、
div内でrenderで'queries/filters'を呼んでいる箇所がある。

 
app\views\queries\_filters.html.erbを見ると、
query.available_filtersに含まれるフィルタ分、GUIを追加している。
題名のフィルタ操作に正規表現を追加したいので、
題名のタイプを見るとテキストになっているため、
テキストの操作に正規表現を追加してやればよい。
そのため、@@operatorsに、
"r"   => :label_regexp
を追加、
@@operators_by_filter_typeの:textを
:text => [  "~", "!~", "!*", "*", "r" ]
に変更。

:label_regexpのため、config\locales\ja.ymlに、
label_regexp: 正規表現
を追加。

最終的にSQL文が発行されるので、
sql_for_field関数に以下を追加。
when "r"
  sql = "LOWER(#{db_table}.#{db_field}) REGEXP '#{connection.quote_string(value.first.to_s.downcase)}'"

変更前、変更後のソースコードは以下にアップされている。
『チケットの題名を正規表現でフィルタリング』のフォルダにある。

ソースコード


結果
無事追加されている模様。


動作に関しても、それっぽく動作している。






と思いきや、REGEXPがマルチバイト対応されていないために、
日本語が含まれている場合に不具合が発生する。
後ほど、マルチバイト対応も記す。

1 件のコメント:

  1. これは素晴らしい機能ですね!マルチバイト対応は、UTF-8ベースで行うことになるのでしょうか?参考になるサイトがあれば、ご紹介いただきたいです。

    返信削除