From 3e3315c103f232655ac8553fcd476792f7d24691 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Fri, 10 Dec 2010 10:48:16 +0000 Subject: [PATCH] Support for updating custom fields using the received custom_fields array (#6345, #6403). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4481 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/issue.rb | 1 + test/fixtures/issues.yml | 2 +- test/integration/api_test/issues_test.rb | 17 +++++++++++++++++ .../lib/acts_as_customizable.rb | 15 +++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/app/models/issue.rb b/app/models/issue.rb index 0b08f0c16..1cd1b92f0 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -229,6 +229,7 @@ class Issue < ActiveRecord::Base done_ratio estimated_hours custom_field_values + custom_fields lock_version ) unless const_defined?(:SAFE_ATTRIBUTES) diff --git a/test/fixtures/issues.yml b/test/fixtures/issues.yml index eec014ff4..15fb5b271 100644 --- a/test/fixtures/issues.yml +++ b/test/fixtures/issues.yml @@ -54,7 +54,7 @@ issues_003: author_id: 2 status_id: 1 start_date: <%= 1.day.from_now.to_date.to_s(:db) %> - due_date: <%= 40.day.ago.to_date.to_s(:db) %> + due_date: <%= 40.day.from_now.to_date.to_s(:db) %> root_id: 3 lft: 1 rgt: 2 diff --git a/test/integration/api_test/issues_test.rb b/test/integration/api_test/issues_test.rb index c57b51eea..a5281e5eb 100644 --- a/test/integration/api_test/issues_test.rb +++ b/test/integration/api_test/issues_test.rb @@ -284,6 +284,23 @@ class ApiTest::IssuesTest < ActionController::IntegrationTest end + context "PUT /issues/3.xml with custom fields" do + setup do + @parameters = {:issue => {:custom_fields => [{'id' => '1', 'value' => 'PostgreSQL' }, {'id' => '2', 'value' => '150'}]}} + @headers = { :authorization => credentials('jsmith') } + end + + should "update custom fields" do + assert_no_difference('Issue.count') do + put '/issues/3.xml', @parameters, @headers + end + + issue = Issue.find(3) + assert_equal '150', issue.custom_value_for(2).value + assert_equal 'PostgreSQL', issue.custom_value_for(1).value + end + end + context "PUT /issues/6.xml with failed update" do setup do @parameters = {:issue => {:subject => ''}} diff --git a/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb b/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb index 03b36f698..9ed9fe376 100644 --- a/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb +++ b/vendor/plugins/acts_as_customizable/lib/acts_as_customizable.rb @@ -50,6 +50,21 @@ module Redmine :order => 'position') end + # Sets the values of the object's custom fields + # values is an array like [{'id' => 1, 'value' => 'foo'}, {'id' => 2, 'value' => 'bar'}] + def custom_fields=(values) + values_to_hash = values.inject({}) do |hash, v| + v = v.stringify_keys + if v['id'] && v.has_key?('value') + hash[v['id']] = v['value'] + end + hash + end + self.custom_field_values = values_to_hash + end + + # Sets the values of the object's custom fields + # values is a hash like {'1' => 'foo', 2 => 'bar'} def custom_field_values=(values) @custom_field_values_changed = true values = values.stringify_keys