diff --git a/app/models/issue.rb b/app/models/issue.rb index fd7cc0b50..e01dcc95a 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -155,6 +155,13 @@ class Issue < ActiveRecord::Base end end + def create_or_update + super + ensure + @status_was = nil + end + private :create_or_update + # AR#Persistence#destroy would raise and RecordNotFound exception # if the issue was already deleted or updated (non matching lock_version). # This is a problem when bulk deleting issues or deleting a project @@ -637,6 +644,14 @@ class Issue < ActiveRecord::Base scope end + # Returns the initial status of the issue + # Returns nil for a new issue + def status_was + if status_id_was && status_id_was.to_i > 0 + @status_was ||= IssueStatus.find_by_id(status_id_was) + end + end + # Return true if the issue is closed, otherwise false def closed? self.status.is_closed? @@ -657,9 +672,7 @@ class Issue < ActiveRecord::Base # Return true if the issue is being closed def closing? if !new_record? && status_id_changed? - status_was = IssueStatus.find_by_id(status_id_was) - status_new = IssueStatus.find_by_id(status_id) - if status_was && status_new && !status_was.is_closed? && status_new.is_closed? + if status_was && status && !status_was.is_closed? && status.is_closed? return true end end diff --git a/test/unit/issue_test.rb b/test/unit/issue_test.rb index ad88933e5..8e3f8bfba 100644 --- a/test/unit/issue_test.rb +++ b/test/unit/issue_test.rb @@ -1971,4 +1971,23 @@ class IssueTest < ActiveSupport::TestCase assert !issue.closed? assert_equal was_closed_on, issue.closed_on end + + def test_status_was_should_return_nil_for_new_issue + issue = Issue.new + assert_nil issue.status_was + end + + def test_status_was_should_return_status_before_change + issue = Issue.find(1) + issue.status = IssueStatus.find(2) + assert_equal IssueStatus.find(1), issue.status_was + end + + def test_status_was_should_be_reset_on_save + issue = Issue.find(1) + issue.status = IssueStatus.find(2) + assert_equal IssueStatus.find(1), issue.status_was + assert issue.save! + assert_equal IssueStatus.find(2), issue.status_was + end end