From 42d2bf0bafcec34c54dbadfdc3136c674c826962 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Thu, 8 Dec 2011 20:37:12 +0000 Subject: [PATCH] Makes project and tracker assigned first in #attributes= git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@8131 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/issue.rb | 18 +++++++++++------- test/unit/issue_test.rb | 16 +++++++++++----- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/app/models/issue.rb b/app/models/issue.rb index 9eb567c9e..7a580737c 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -238,17 +238,21 @@ class Issue < ActiveRecord::Base write_attribute(:description, arg) end - # Overrides attributes= so that tracker_id gets assigned first - def attributes_with_tracker_first=(new_attributes, *args) + # Overrides attributes= so that project and tracker get assigned first + def attributes_with_project_and_tracker_first=(new_attributes, *args) return if new_attributes.nil? - new_tracker_id = new_attributes['tracker_id'] || new_attributes[:tracker_id] - if new_tracker_id - self.tracker_id = new_tracker_id + attrs = new_attributes.dup + attrs.stringify_keys! + + %w(project project_id tracker tracker_id).each do |attr| + if attrs.has_key?(attr) + send "#{attr}=", attrs.delete(attr) + end end - send :attributes_without_tracker_first=, new_attributes, *args + send :attributes_without_project_and_tracker_first=, attrs, *args end # Do not redefine alias chain on reload (see #4838) - alias_method_chain(:attributes=, :tracker_first) unless method_defined?(:attributes_without_tracker_first=) + alias_method_chain(:attributes=, :project_and_tracker_first) unless method_defined?(:attributes_without_project_and_tracker_first=) def estimated_hours=(h) write_attribute :estimated_hours, (h.is_a?(String) ? h.to_hours : h) diff --git a/test/unit/issue_test.rb b/test/unit/issue_test.rb index d006d7b42..b2e243835 100644 --- a/test/unit/issue_test.rb +++ b/test/unit/issue_test.rb @@ -279,10 +279,7 @@ class IssueTest < ActiveSupport::TestCase end def test_should_not_update_custom_fields_on_changing_tracker_with_different_custom_fields - issue = Issue.new(:project_id => 1) - issue.attributes = {:tracker_id => 1, :author_id => 1, :status_id => 1, :subject => 'Test', :custom_field_values => {'2' => 'Test'}} - issue.save! - + issue = Issue.create!(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :subject => 'Test', :custom_field_values => {'2' => 'Test'}) assert !Tracker.find(2).custom_field_ids.include?(2) issue = Issue.find(issue.id) @@ -301,7 +298,16 @@ class IssueTest < ActiveSupport::TestCase assert issue.custom_field_values.any? end - def test_assigning_attributes_should_assign_tracker_id_first + def test_assigning_attributes_should_assign_project_and_tracker_first + seq = sequence('seq') + issue = Issue.new + issue.expects(:project_id=).in_sequence(seq) + issue.expects(:tracker_id=).in_sequence(seq) + issue.expects(:subject=).in_sequence(seq) + issue.attributes = {:tracker_id => 2, :project_id => 1, :subject => 'Test'} + end + + def test_assigning_tracker_and_custom_fields_should_assign_custom_fields attributes = ActiveSupport::OrderedHash.new attributes['custom_field_values'] = { '1' => 'MySQL' } attributes['tracker_id'] = '1'