カスタムフィールドに「トラッカー文字列+チケット番号」を自動設定したい

1,612 views
Skip to first unread message

MooMooDance

unread,
Mar 7, 2014, 9:23:55 PM3/7/14
to redmine-...@googlegroups.com
こんにちは
宜しくお願いします。

諸事情で、あるカスタムフィールドに 「トラッカーに対応する文字列 + チケット番号」 を自動設定したいと思っています。
具体的には 「新しいチケット」 作成時に、以下の値を あるテキストのカスタムフィールドに自動設定したいです。

※ 仮に 「新しいチケット」作成時のチケット番号を 「12345」 とします。

トラッカー 期待値
-----------------------------
開発 dev12345
不具合 bug12345  
サポート sup12345

これを実現するプラグインも見つけられない為、ソースを直接修正したいと考えています。
この実現方法をご存知の方がいらっしゃいましたら、是非とも お知恵を拝借したいです。

当方の環境は Windows + Bitnami redmine 2.3.1 です。
宜しくお願いいたします。

nobu_toyofuku

unread,
Mar 13, 2014, 4:37:47 AM3/13/14
to redmine-...@googlegroups.com
  豊福です。

2014年3月8日土曜日 11時23分55秒 UTC+9 MooMooDance:
諸事情で、あるカスタムフィールドに 「トラッカーに対応する文字列 + チケット番号」 を自動設定したいと思っています。
具体的には 「新しいチケット」 作成時に、以下の値を あるテキストのカスタムフィールドに自動設定したいです。
  ...
これを実現するプラグインも見つけられない為、ソースを直接修正したいと考えています。
この実現方法をご存知の方がいらっしゃいましたら、是非とも お知恵を拝借したいです。

自分では使ったことはないのですが

「Redmine copy category plugin」
 チケットを作成/更新した時にカテゴリを指定したカスタムフィールドにコピーするプラグインです。
https://github.com/gozuk16/redmine_copy_category

というのを見つけました。
これを元に作るのはどうでしょうか。
---



MooMooDance

unread,
Mar 14, 2014, 7:49:23 PM3/14/14
to redmine-...@googlegroups.com
豊福様

プラグインのご紹介、本当にありがとうございます。
私の所で試したのですが、なぜかプラグインの設定画面で 404 エラーが出てしまい、現在、中断しております。

見よう見まねで↓こちらの関数に
issues_controller.rb の build_new_issue_from_params 

↓こちらを入れたら、
cfname = "CaseID"
cv = @issue.custom_field_values.detect {|c| c.custom_field.name == cfname}
cv.value = @issue.tracker

新しいチケット作成時に [CaseID] カスタムフィールドに 「開発」 と入ることが確認できました。
これを (変更も含む) チケット保存時に実行できれば、リーチが掛かりそうなのですが、肝心の保存する関数名が分かりません。

もし、ご存知の方がいらっしゃいましたらご教授下さい。
宜しくお願いいたします。

MooMooDance

unread,
Mar 14, 2014, 8:08:00 PM3/14/14
to redmine-...@googlegroups.com
すみません、↓ こちらの部分で補足します。

>これを (変更も含む) チケット保存時に実行できれば、リーチが掛かりそうなのですが、肝心の保存する関数名が分かりません。

変更を含む新しいチケット作成時 プラス 「チケット番号が確定した後」 の場所がわかったら、はじめてリーチでした。
ご存じの方がいらっしゃいましたら、宜しくお願いいたします。

hiro

unread,
Mar 14, 2014, 10:10:32 PM3/14/14
to redmine-...@googlegroups.com
> 変更を含む新しいチケット作成時 プラス 「チケット番号が確定した後」 の場所がわかったら、はじめてリーチでした。

多分Issueモデルのafter_saveコールバックあたりを使うと良いかと思います。
試してないですがこんな感じです。

class Issue < ActiveRecord::Base
  after_save :update_case_id

  def update_case_id
    cv = custom_field_values.detect {|c| c.custom_field.name == "CaseID"}
    cv.value = ...  # tracker.nameを変換した文字列 + id.to_s
    cv.save!
  end
end

2014年3月15日土曜日 9時08分00秒 UTC+9 MooMooDance:
Message has been deleted

MooMooDance

unread,
Mar 15, 2014, 7:22:49 PM3/15/14
to redmine-...@googlegroups.com
hiro 様

>多分Issueモデルのafter_saveコールバックあたりを使うと良いかと思います。

うわ! Redmine は良く出来てますね~!
Redmine のダンジョンを深堀りしていきたいと思います。

>試してないですがこんな感じです。

具体的コードまで、本当にありがとうございます!!
速報ですが、以下のようにコードを組んだのですが、Internal error が出てしまいました。

今日は出張で、まだ調査は手付かず状態です。 まずはご報告まで。
環境は bitnami redmine 2.3.1 になります。

---
issue.rb
 :
  after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal, :update_case_id # <-- update が多かったのでここに追加
 :
  def update_case_id
    logger.debug("[INFO] BGN update_case_id"); 
    cv = custom_field_values.detect {|c| c.custom_field.name == "CaseID"}
    cv.value = id.to_s
    cv.save!
    logger.debug("[INFO] END update_case_id"); 
  end

---
production.log
 :
[INFO] BGN update_case_id   # !!! 関数コールはされている
 :
NoMethodError (undefined method `save!' for 12:CustomFieldValue):  # !!! save! が無い。ちなみに save でもダメでした。
  app/models/issue.rb:1147:in `update_case_id'
  app/models/issue.rb:159:in `create_or_update'
  app/controllers/issues_controller.rb:143:in `create'

hiro

unread,
Mar 16, 2014, 10:24:37 AM3/16/14
to redmine-...@googlegroups.com
> うわ! Redmine は良く出来てますね~!

RedmineというかRailsですね。

> 速報ですが、以下のようにコードを組んだのですが、Internal error が出てしまいました。

すみません、適当すぎました。
確かにソースを見たらCustomFieldValueモデルにsaveメソッドはなかったですね。
cv.save! のところを save_custom_field_values に変えれば多分動くと思います。

2014年3月16日日曜日 8時22分49秒 UTC+9 MooMooDance:

MooMooDance

unread,
Mar 16, 2014, 11:38:49 AM3/16/14
to redmine-...@googlegroups.com
hiro 様

>cv.save! のところを save_custom_field_values に変えれば多分動くと思います。

キターー!  動きました!!! 
なるほどー、こういう仕組みなのですね。 多分リーチがかかりました。

後は頑張って組んでみます
本当にありがとうございました!

>RedmineというかRailsですね。

なるほど~ Rails のフレームワークがよく出来ているんですね。
次々に勉強ネタが広がって嬉しいです。

情報、ありがとうございました!!

nobu_toyofuku

unread,
Mar 17, 2014, 3:12:28 AM3/17/14
to redmine-...@googlegroups.com

2014年3月15日土曜日 8時49分23秒 UTC+9 MooMooDance:
私の所で試したのですが、なぜかプラグインの設定画面で 404 エラーが出てしまい、現在、中断しております。

多分 README.md に書かれている
「 HAMLを使っているのでredmineのGemfileに gem "haml" を追加して bundle install してください。」
を実行していないからだと思います。
ですが以下の作業をすれば HAML をインストールしなくても動きます。

新規に plugins/redmine_copy_category/app/views/settings/_plugin_settings.html.erb というファイルを作り
(拡張子が .html.haml のものがすでにあります。これを表示させるために HAML が必要とされています)
内容を以下にようにしてください。

<h2><%= l(:label_plugin_settings) %></h2>

<p>
  <label><%= l(:label_setting_copy_category) %></label>
  <%= select_tag('settings[copy_category]', ('<option value=""> </option>' + options_from_collection_for_select(IssueCustomField.find(:all), :id, :name, @settings['copy_category'].to_i)).html_safe) %>
</p>

その後 redmine を再起動すればプラグインの設定画面で 404 エラーはでなくなると思います。
---

MooMooDance

unread,
Mar 17, 2014, 10:11:19 AM3/17/14
to redmine-...@googlegroups.com
hiro 様

> 多分リーチがかかりました。

完成しました!!
project_id と tracker_id、custom_field.id をやりくりして、期待通りの動きになりました。

皆様、本当にありがとうございました!!

p.s

実は人生初の Ruby プログラムになったのですが  elsif を elseif と書いて、
エラーが出て、最初 原因が全く分かりませんでした (^^

else は els ではないのに、なぜこうしたのだろう。??
皆様、ありがとうございました!

Reply all
Reply to author
Forward
0 new messages