Status変更時にカスタムフィールドに値を自動入力する方法

3,971 views
Skip to first unread message

JU MA

unread,
Apr 25, 2014, 4:23:49 AM4/25/14
to redmine-...@googlegroups.com
こんにちは。どなたか方法を教えていただけると大変助かります。

Status変更時にカスタムフィールドに値を自動入力する方法を知りたいです。
特にカスタムフィールドに値を代入する方法が分かりません。

例えばissue.rbで

    if !new_record? && status_id_changed? && status_id == 7
       cf_name="解決日"
       cfvs = issue.custom_field_values
       #cv = cfvs.detect {|c| c.custom_field.id == 0}
       cv = cfvs.detect {|c| c.custom_field.name == cf_name}
       cv.value = updated_on
    end

と書いてもチケット保存時にInernal Errorになってしまいます。
これはステータスが7番("解決")になったら、カスタムフィールド[解決日]に現在時刻を入力したいために書いたコードです。


どうぞよろしくお願いいたします!

simo

unread,
Apr 25, 2014, 11:36:23 AM4/25/14
to redmine-...@googlegroups.com
カスタムフィールドではないですが、issuesテーブルに追加した項目に、
statusに応じた日時を自動入力する方法なら、
ただし、Redmineのバージョンが古い(v.1.4)ですが。

2014年4月25日金曜日 17時23分49秒 UTC+9 JU MA:

JU MA

unread,
Apr 29, 2014, 11:08:48 PM4/29/14
to redmine-...@googlegroups.com
simoさん、

ご返信ありがとうございます!外出していたため返信が遅れました。

下記URLは実は以前参照させてもらい、試したのですが上手く行きませんでした。
RedmineのVersionは2.4です。

最新のVersionでは終了日が自動記録される機能がDefaultですでに入っており(issue.rbのupdate_closed_on関数:下記参考)、
それをまねてupdate_resolved_on関数を作り、今回最初に書いたif分を入れています。
そのif分の中で
self.due_date = updated_on
と記述すると、期日フィールドにきちんと更新日が代入されるので、関数自体は機能していると思います。

ただカスタムフィールドへの代入だけが上手く行っていない状況です。
よってその記述方法を教えていただけると大変助かります。(もしかしたら基本中の基本の話かもしれません…)

参考)  issue.rb
# Callback for setting closed_on when the issue is closed.
  # The closed_on attribute stores the time of the last closing
  # and is preserved when the issue is reopened.
  def update_closed_on
    if closing? || (new_record? && closed?)
      self.closed_on = updated_on
    end
  end

今回の自作の関数)
  def update_resolved_on

    if !new_record? && status_id_changed? && status_id == 7
       cf_name="解決日"
       cfvs = issue.custom_field_values
       #cv = cfvs.detect {|c| c.custom_field.id == 0}
       cv = cfvs.detect {|c| c.custom_field.name == cf_name}
       cv.value = updated_on ←カスタムフィールドに対しては上手く行かない。
   
   self.due_date = updated_on ←既存フィールドに対しては上手く行く。
    end

2014年4月26日土曜日 0時36分23秒 UTC+9 simo:

nobu_toyofuku

unread,
Apr 30, 2014, 7:49:01 AM4/30/14
to redmine-...@googlegroups.com

2014年4月30日水曜日 12時08分48秒 UTC+9 JU MA:
       cfvs = issue.custom_field_values

issue.rb の中に書くなら「issue.」の部分なしの

  cfvs = custom_field_values

ではどうですか。

それでもエラーが起きるようでしたら logs/production.log というログファイルに
エラーの詳細が時刻とともに記録されていますのでどのようなログが書かれているか
教えてもらえるとありがたいです。
---

JU MA

unread,
May 1, 2014, 2:43:20 AM5/1/14
to redmine-...@googlegroups.com
toyofukuさん

アドバイスありがとうございます。
ご指摘の通りにやってみましたが、やはりInternal Errorになってしまいました。

こちらがlogを添付しました。

どうぞよろしくお願いいたします。

2014年4月30日水曜日 20時49分01秒 UTC+9 nobu_toyofuku:
production.log

nobu_toyofuku

unread,
May 7, 2014, 5:47:02 AM5/7/14
to redmine-...@googlegroups.com

2014年5月1日木曜日 15時43分20秒 UTC+9 JU MA:
ご指摘の通りにやってみましたが、やはりInternal Errorになってしまいました。
こちらがlogを添付しました。

ログに

> ActionView::Template::Error (undefined method `empty?' for 2014-05-01 06:34:37 UTC:Time):

と時間に対して empty? してエラーになっているっぽいので

> cv.value = updated_on ←カスタムフィールドに対しては上手く行かない。

のところを

  cv.value = updated_on.to_s

と文字列にして入れてみてはどうでしょうか。
---

JU MA

unread,
May 13, 2014, 3:28:33 AM5/13/14
to redmine-...@googlegroups.com
とよふくさん、

お返事が遅くなって大変すみません。
ご提示していただいたやり方で無事解決することができました!!
大変助かりました。ありがとうございました〜!

JU MA

unread,
May 20, 2014, 1:48:33 AM5/20/14
to redmine-...@googlegroups.com
すみません、実は解決していませんでした><。
 
解決日に日付は入るようになりましたが、
再度チケットをOpenし、保存しようとするとエラーが出てきます。
 
エラーメッセージ:解決日 は日付を入力してください。
 
解決日の中身を見ると、"2014-05-20 05:38:30 UTC"
が入力されていました。
 
解決日フィールドには
cv.value = updated_on.to_s
で文字列を入れているのですが、フィールド属性(書式)が日付になっているのが原因ではないかと思っています。
 
日付を入れる方法はないでしょうか?
 
よろしくお願いいたします。

nobu_toyofuku

unread,
May 20, 2014, 2:37:22 AM5/20/14
to redmine-...@googlegroups.com

2014年5月20日火曜日 14時48分33秒 UTC+9 JU MA:
再度チケットをOpenし、保存しようとするとエラーが出てきます。
エラーメッセージ:解決日 は日付を入力してください。
解決日の中身を見ると、"2014-05-20 05:38:30 UTC"
が入力されていました。
 
解決日フィールドには
cv.value = updated_on.to_s
で文字列を入れているのですが、フィールド属性(書式)が日付になっているのが原因ではないかと思っています。

カスタムフィールドの日付は時刻の付かない YYYY-MM-DD 形式しか許さないようなので
  cv.value = updated_on.strftime("%Y-%m-%d")
としたらどうでしょう。

一つ気になるのが
> 解決日の中身を見ると、"2014-05-20 05:38:30 UTC"
と UTC表示になってますね。時差大丈夫なのだろうか?
もし時差で日付がずれて問題になるようでしたらまたご相談ください。
---

JU MA

unread,
May 20, 2014, 10:37:54 PM5/20/14
to redmine-...@googlegroups.com
toyofukuさん
 
ご教授ありがとうございます!入力はばっちり成功しました。
ただやはり、
 
>と UTC表示になってますね。時差大丈夫なのだろうか?
>もし時差で日付がずれて問題になるようでしたらまたご相談ください。
が問題になってしまいました。
解決方法はありますでしょうか?
 
よろしくお願いいたします。
 

2014年5月20日火曜日 15時37分22秒 UTC+9 nobu_toyofuku:

nobu_toyofuku

unread,
May 21, 2014, 1:08:55 AM5/21/14
to redmine-...@googlegroups.com

2014年5月21日水曜日 11時37分54秒 UTC+9 JU MA:
>と UTC表示になってますね。時差大丈夫なのだろうか?
>もし時差で日付がずれて問題になるようでしたらまたご相談ください。
が問題になってしまいました。

  cv.value = updated_on.getlocal.strftime("%Y-%m-%d")

でシステムのタイムゾーンに合わせた日付になると思います。
redmineの各アカウントごとにタイムゾーンを設定できますがそれに合わせると
アカウントごとに日付がずれるのでシステムの方のでいいんですよね。
---

JU MA

unread,
May 21, 2014, 2:47:18 AM5/21/14
to redmine-...@googlegroups.com
おお、出来ました!!
はい、システムの方で大丈夫だと思います。
素早いご回答で大変助かりました。
ありがとうございました!
 
#参考までにチケット画面を添付します。(解決日(テキスト)フィールドは中身を確認したいだけのテストフィールドで、解決日フィールドにきちんと時刻抜きの日付が入りました。)
解決日挿入.png
Reply all
Reply to author
Forward
0 new messages