]> source.dussan.org Git - redmine.git/commitdiff
Use AR callbacks instead of observers (removed in Rails4) for notifications.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 14 Jul 2013 14:26:27 +0000 (14:26 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 14 Jul 2013 14:26:27 +0000 (14:26 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@12021 e93f8b46-1217-0410-a6f0-8f06a7374b81

16 files changed:
app/models/comment.rb
app/models/comment_observer.rb [deleted file]
app/models/document.rb
app/models/document_observer.rb [deleted file]
app/models/issue.rb
app/models/issue_observer.rb [deleted file]
app/models/journal.rb
app/models/journal_observer.rb [deleted file]
app/models/message.rb
app/models/message_observer.rb [deleted file]
app/models/news.rb
app/models/news_observer.rb [deleted file]
app/models/wiki_content.rb
app/models/wiki_content_observer.rb [deleted file]
config/application.rb
test/unit/wiki_content_test.rb

index 577afe9427d69a0ab68abed852e362e739c5a082..ac60e497ced45adbaf140aa70273ca4212029c47 100644 (file)
@@ -22,5 +22,15 @@ class Comment < ActiveRecord::Base
 
   validates_presence_of :commented, :author, :comments
 
+  after_create :send_notification
+
   safe_attributes 'comments'
+
+  private
+
+  def send_notification
+    if commented.is_a?(News) && Setting.notified_events.include?('news_comment_added')
+      Mailer.news_comment_added(self).deliver
+    end
+  end
 end
diff --git a/app/models/comment_observer.rb b/app/models/comment_observer.rb
deleted file mode 100644 (file)
index e7c12c4..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-# Redmine - project management software
-# Copyright (C) 2006-2013  Jean-Philippe Lang
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-class CommentObserver < ActiveRecord::Observer
-  def after_create(comment)
-    if comment.commented.is_a?(News) && Setting.notified_events.include?('news_comment_added')
-      Mailer.news_comment_added(comment).deliver
-    end
-  end
-end
index 0c2ce17369221c2d590fe9cef5cb91ba7da6d88c..ddf2a1f792433dce4f411746e2797f30fe632f0d 100644 (file)
@@ -30,6 +30,8 @@ class Document < ActiveRecord::Base
   validates_presence_of :project, :title, :category
   validates_length_of :title, :maximum => 60
 
+  after_create :send_notification
+
   scope :visible, lambda {|*args|
     includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_documents, *args))
   }
@@ -54,4 +56,12 @@ class Document < ActiveRecord::Base
     end
     @updated_on
   end
+
+  private
+
+  def send_notification
+    if Setting.notified_events.include?('document_added')
+      Mailer.document_added(self).deliver
+    end
+  end
 end
diff --git a/app/models/document_observer.rb b/app/models/document_observer.rb
deleted file mode 100644 (file)
index 4a61f11..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# Redmine - project management software
-# Copyright (C) 2006-2013  Jean-Philippe Lang
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-class DocumentObserver < ActiveRecord::Observer
-  def after_create(document)
-    Mailer.document_added(document).deliver if Setting.notified_events.include?('document_added')
-  end
-end
index a089f40675d7d0f6be811862e4f70b34186b19fb..5f54ce3bd2db7a15e40563f25d7d32238cc59cc5 100644 (file)
@@ -98,6 +98,7 @@ class Issue < ActiveRecord::Base
   # Should be after_create but would be called before previous after_save callbacks
   after_save :after_create_from_copy
   after_destroy :update_parent_attributes
+  after_create :send_notification
 
   # Returns a SQL conditions string used to find all issues visible by the specified user
   def self.visible_condition(user, options={})
@@ -1516,6 +1517,12 @@ class Issue < ActiveRecord::Base
     end
   end
 
+  def send_notification
+    if Setting.notified_events.include?('issue_added')
+      Mailer.deliver_issue_add(self)
+    end
+  end
+
   # Query generator for selecting groups of issue counts for a project
   # based on specific criteria
   #
diff --git a/app/models/issue_observer.rb b/app/models/issue_observer.rb
deleted file mode 100644 (file)
index 58b6360..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# Redmine - project management software
-# Copyright (C) 2006-2013  Jean-Philippe Lang
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-class IssueObserver < ActiveRecord::Observer
-  def after_create(issue)
-    Mailer.deliver_issue_add(issue) if Setting.notified_events.include?('issue_added')
-  end
-end
index 47ae123805823f429c7901e01d8ac1043a9ee6e1..2e3aa7f9f919534a7ac344113683f09adc0aa785 100644 (file)
@@ -39,6 +39,7 @@ class Journal < ActiveRecord::Base
                                                              " (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')"}
 
   before_create :split_private_notes
+  after_create :send_notification
 
   scope :visible, lambda {|*args|
     user = args.shift || User.current
@@ -165,4 +166,14 @@ class Journal < ActiveRecord::Base
     end
     true
   end
+
+  def send_notification
+    if notify? && (Setting.notified_events.include?('issue_updated') ||
+        (Setting.notified_events.include?('issue_note_added') && notes.present?) ||
+        (Setting.notified_events.include?('issue_status_updated') && new_status.present?) ||
+        (Setting.notified_events.include?('issue_priority_updated') && new_value_for('priority_id').present?)
+      )
+      Mailer.deliver_issue_edit(self)
+    end
+  end
 end
diff --git a/app/models/journal_observer.rb b/app/models/journal_observer.rb
deleted file mode 100644 (file)
index ff4b898..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-# Redmine - project management software
-# Copyright (C) 2006-2013  Jean-Philippe Lang
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-class JournalObserver < ActiveRecord::Observer
-  def after_create(journal)
-    if journal.notify? &&
-        (Setting.notified_events.include?('issue_updated') ||
-          (Setting.notified_events.include?('issue_note_added') && journal.notes.present?) ||
-          (Setting.notified_events.include?('issue_status_updated') && journal.new_status.present?) ||
-          (Setting.notified_events.include?('issue_priority_updated') && journal.new_value_for('priority_id').present?)
-        )
-      Mailer.deliver_issue_edit(journal)
-    end
-  end
-end
index 767223748467c9e27392308335c6e41c74bc7a1b..4335fefa9a23b9ca899caf4e4e3b7a52cf597aa8 100644 (file)
@@ -45,6 +45,7 @@ class Message < ActiveRecord::Base
   after_create :add_author_as_watcher, :reset_counters!
   after_update :update_messages_board
   after_destroy :reset_counters!
+  after_create :send_notification
 
   scope :visible, lambda {|*args|
     includes(:board => :project).where(Project.allowed_to_condition(args.shift || User.current, :view_messages, *args))
@@ -105,4 +106,10 @@ class Message < ActiveRecord::Base
   def add_author_as_watcher
     Watcher.create(:watchable => self.root, :user => author)
   end
+
+  def send_notification
+    if Setting.notified_events.include?('message_posted')
+      Mailer.message_posted(self).deliver
+    end
+  end
 end
diff --git a/app/models/message_observer.rb b/app/models/message_observer.rb
deleted file mode 100644 (file)
index 9ef52b6..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# Redmine - project management software
-# Copyright (C) 2006-2013  Jean-Philippe Lang
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-class MessageObserver < ActiveRecord::Observer
-  def after_create(message)
-    Mailer.message_posted(message).deliver if Setting.notified_events.include?('message_posted')
-  end
-end
index c8a4112cc1cda7b3b41bd38581dca082c19dd651..2186beaeded811a6ef43f0c6144574ba269f7e60 100644 (file)
@@ -33,6 +33,7 @@ class News < ActiveRecord::Base
   acts_as_watchable
 
   after_create :add_author_as_watcher
+  after_create :send_notification
 
   scope :visible, lambda {|*args|
     includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_news, *args))
@@ -63,4 +64,10 @@ class News < ActiveRecord::Base
   def add_author_as_watcher
     Watcher.create(:watchable => self, :user => author)
   end
+
+  def send_notification
+    if Setting.notified_events.include?('news_added')
+      Mailer.news_added(self).deliver
+    end
+  end
 end
diff --git a/app/models/news_observer.rb b/app/models/news_observer.rb
deleted file mode 100644 (file)
index 8ba3894..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# Redmine - project management software
-# Copyright (C) 2006-2013  Jean-Philippe Lang
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-class NewsObserver < ActiveRecord::Observer
-  def after_create(news)
-    Mailer.news_added(news).deliver if Setting.notified_events.include?('news_added')
-  end
-end
index a9ed005bc3b6b06ddd0d43db5324107b399cdefa..20295e9d53674f0b4a496353fcb3bf55cfd688ed 100644 (file)
@@ -26,6 +26,8 @@ class WikiContent < ActiveRecord::Base
 
   acts_as_versioned
 
+  after_save :send_notification
+
   def visible?(user=User.current)
     page.visible?(user)
   end
@@ -145,4 +147,19 @@ class WikiContent < ActiveRecord::Base
       end
     end
   end
+
+  private
+
+  def send_notification
+    # new_record? returns false in after_save callbacks
+    if id_changed?
+      if Setting.notified_events.include?('wiki_content_added')
+        Mailer.wiki_content_added(self).deliver
+      end
+    elsif text_changed?
+      if Setting.notified_events.include?('wiki_content_updated')
+        Mailer.wiki_content_updated(self).deliver
+      end
+    end
+  end
 end
diff --git a/app/models/wiki_content_observer.rb b/app/models/wiki_content_observer.rb
deleted file mode 100644 (file)
index 6219f40..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-# Redmine - project management software
-# Copyright (C) 2006-2013  Jean-Philippe Lang
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-class WikiContentObserver < ActiveRecord::Observer
-  def after_create(wiki_content)
-    Mailer.wiki_content_added(wiki_content).deliver if Setting.notified_events.include?('wiki_content_added')
-  end
-
-  def after_update(wiki_content)
-    if wiki_content.text_changed?
-      Mailer.wiki_content_updated(wiki_content).deliver if Setting.notified_events.include?('wiki_content_updated')
-    end
-  end
-end
index e434bd2a3fb89b372aae93300801f0fa701bccca..e18447fa469ffaae1258791387cee4252ee888ec 100644 (file)
@@ -22,9 +22,6 @@ module RedmineApp
     # :all can be used as a placeholder for all plugins not explicitly named.
     # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
 
-    # Activate observers that should always be running.
-    config.active_record.observers = :message_observer, :issue_observer, :journal_observer, :news_observer, :document_observer, :wiki_content_observer, :comment_observer
-
     config.active_record.store_full_sti_class = true
     config.active_record.default_timezone = :local
 
index 5956da9635dc698e073722befb7c69a6a561fdc6..e06b416f9c40d358b2af7e1fa39648f7af609e96 100644 (file)
@@ -48,11 +48,12 @@ class WikiContentTest < ActiveSupport::TestCase
     page = WikiPage.new(:wiki => @wiki, :title => "A new page")
     page.content = WikiContent.new(:text => "Content text", :author => User.find(1), :comments => "My comment")
 
-    with_settings :notified_events => %w(wiki_content_added) do
+    with_settings :default_language => 'en', :notified_events => %w(wiki_content_added) do
       assert page.save
     end
 
     assert_equal 1, ActionMailer::Base.deliveries.size
+    assert_include 'wiki page has been added', mail_body(ActionMailer::Base.deliveries.last)
   end
 
   def test_update_should_be_versioned
@@ -99,6 +100,7 @@ class WikiContentTest < ActiveSupport::TestCase
     end
 
     assert_equal 1, ActionMailer::Base.deliveries.size
+    assert_include 'wiki page has been updated', mail_body(ActionMailer::Base.deliveries.last)
   end
 
   def test_fetch_history