]> source.dussan.org Git - redmine.git/commitdiff
Fixed that previous assignee is not notified on issue update (#15714).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 17 Dec 2013 20:48:18 +0000 (20:48 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 17 Dec 2013 20:48:18 +0000 (20:48 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@12419 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/issue.rb
test/unit/issue_test.rb

index 07d09d69407bf0001d6c4bd09addc865e803495f..0101abf00287c99853f7115c43a3e303ee9069f8 100644 (file)
@@ -93,7 +93,7 @@ class Issue < ActiveRecord::Base
 
   before_create :default_assign
   before_save :close_duplicates, :update_done_ratio_from_issue_status,
-              :force_updated_on_change, :update_closed_on
+              :force_updated_on_change, :update_closed_on, :set_assigned_to_was
   after_save {|issue| issue.send :after_project_change if !issue.id_changed? && issue.project_id_changed?} 
   after_save :reschedule_following_issues, :update_nested_set_attributes,
              :update_parent_attributes, :create_journal
@@ -101,6 +101,8 @@ class Issue < ActiveRecord::Base
   after_save :after_create_from_copy
   after_destroy :update_parent_attributes
   after_create :send_notification
+  # Keep it at the end of after_save callbacks
+  after_save :clear_assigned_to_was
 
   # Returns a SQL conditions string used to find all issues visible by the specified user
   def self.visible_condition(user, options={})
@@ -776,9 +778,12 @@ class Issue < ActiveRecord::Base
     end
   end
 
+  # Returns the previous assignee if changed
   def assigned_to_was
-    if assigned_to_id_changed? && assigned_to_id_was.present?
-      @assigned_to_was ||= User.find_by_id(assigned_to_id_was)
+    # assigned_to_id_was is reset before after_save callbacks
+    user_id = @previous_assigned_to_id || assigned_to_id_was
+    if user_id && user_id != assigned_to_id
+      @assigned_to_was ||= User.find_by_id(user_id)
     end
   end
 
@@ -1515,6 +1520,18 @@ class Issue < ActiveRecord::Base
     end
   end
 
+  # Stores the previous assignee so we can still have access
+  # to it during after_save callbacks (assigned_to_id_was is reset)
+  def set_assigned_to_was
+    @previous_assigned_to_id = assigned_to_id_was
+  end
+
+  # Clears the previous assignee at the end of after_save callbacks
+  def clear_assigned_to_was
+    @assigned_to_was = nil
+    @previous_assigned_to_id = nil
+  end
+
   # Query generator for selecting groups of issue counts for a project
   # based on specific criteria
   #
index cf98cb1c3d39ed4bf15c1040d473ba148950599e..4e82aa00724a4b5c4151a8627b6291449e8d3bbc 100644 (file)
@@ -1725,6 +1725,19 @@ class IssueTest < ActiveSupport::TestCase
     end
   end
 
+  def test_update_should_notify_previous_assignee
+    ActionMailer::Base.deliveries.clear
+    user = User.find(3)
+    user.members.update_all ["mail_notification = ?", false]
+    user.update_attribute :mail_notification, 'only_assigned'
+
+    issue = Issue.find(2)
+    issue.init_journal User.find(1)
+    issue.assigned_to = nil
+    issue.save!
+    assert_include user.mail, ActionMailer::Base.deliveries.last.bcc
+  end
+
   def test_stale_issue_should_not_send_email_notification
     ActionMailer::Base.deliveries.clear
     issue = Issue.find(1)