summaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2009-04-05 10:08:11 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2009-04-05 10:08:11 +0000
commitca166b30e1b223c7f3aba3befc894a8597362592 (patch)
tree42d3a97b4d38db99ba3ff6a91aa23e75db44b5c4 /app/models
parent3d65ed7aa0b6892ca76160a89694acc4efa79f27 (diff)
downloadredmine-ca166b30e1b223c7f3aba3befc894a8597362592.tar.gz
redmine-ca166b30e1b223c7f3aba3befc894a8597362592.zip
Adds the ability to move threads between project forums (#2452). 'Edit message' permission is required.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2649 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models')
-rw-r--r--app/models/board.rb13
-rw-r--r--app/models/message.rb21
2 files changed, 24 insertions, 10 deletions
diff --git a/app/models/board.rb b/app/models/board.rb
index 26e2004d3..3bc18efec 100644
--- a/app/models/board.rb
+++ b/app/models/board.rb
@@ -26,4 +26,17 @@ class Board < ActiveRecord::Base
validates_presence_of :name, :description
validates_length_of :name, :maximum => 30
validates_length_of :description, :maximum => 255
+
+ def reset_counters!
+ self.class.reset_counters!(id)
+ end
+
+ # Updates topics_count, messages_count and last_message_id attributes for +board_id+
+ def self.reset_counters!(board_id)
+ board_id = board_id.to_i
+ update_all("topics_count = (SELECT COUNT(*) FROM #{Message.table_name} WHERE board_id=#{board_id} AND parent_id IS NULL)," +
+ " messages_count = (SELECT COUNT(*) FROM #{Message.table_name} WHERE board_id=#{board_id})," +
+ " last_message_id = (SELECT MAX(id) FROM #{Message.table_name} WHERE board_id=#{board_id})",
+ ["id = ?", board_id])
+ end
end
diff --git a/app/models/message.rb b/app/models/message.rb
index 716c53b0b..92bcb1275 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -37,7 +37,7 @@ class Message < ActiveRecord::Base
acts_as_watchable
attr_protected :locked, :sticky
- validates_presence_of :subject, :content
+ validates_presence_of :board, :subject, :content
validates_length_of :subject, :maximum => 255
after_create :add_author_as_watcher
@@ -48,21 +48,22 @@ class Message < ActiveRecord::Base
end
def after_create
- board.update_attribute(:last_message_id, self.id)
- board.increment! :messages_count
if parent
parent.reload.update_attribute(:last_reply_id, self.id)
- else
- board.increment! :topics_count
+ end
+ board.reset_counters!
+ end
+
+ def after_update
+ if board_id_changed?
+ Message.update_all("board_id = #{board_id}", ["id = ? OR parent_id = ?", root.id, root.id])
+ Board.reset_counters!(board_id_was)
+ Board.reset_counters!(board_id)
end
end
def after_destroy
- # The following line is required so that the previous counter
- # updates (due to children removal) are not overwritten
- board.reload
- board.decrement! :messages_count
- board.decrement! :topics_count unless parent
+ board.reset_counters!
end
def sticky?