##// END OF EJS Templates
Merged r3705 from trunk....
Jean-Philippe Lang -
r3601:b26d0fe0411c
parent child
Show More
@@ -1,105 +1,111
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2009 Jean-Philippe Lang
2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19
19
20 class WatcherTest < ActiveSupport::TestCase
20 class WatcherTest < ActiveSupport::TestCase
21 fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules,
21 fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules,
22 :issues,
22 :issues,
23 :boards, :messages,
23 :boards, :messages,
24 :wikis, :wiki_pages,
24 :wikis, :wiki_pages,
25 :watchers
25 :watchers
26
26
27 def setup
27 def setup
28 @user = User.find(1)
28 @user = User.find(1)
29 @issue = Issue.find(1)
29 @issue = Issue.find(1)
30 end
30 end
31
31
32 def test_watch
32 def test_watch
33 assert @issue.add_watcher(@user)
33 assert @issue.add_watcher(@user)
34 @issue.reload
34 @issue.reload
35 assert @issue.watchers.detect { |w| w.user == @user }
35 assert @issue.watchers.detect { |w| w.user == @user }
36 end
36 end
37
37
38 def test_cant_watch_twice
38 def test_cant_watch_twice
39 assert @issue.add_watcher(@user)
39 assert @issue.add_watcher(@user)
40 assert !@issue.add_watcher(@user)
40 assert !@issue.add_watcher(@user)
41 end
41 end
42
42
43 def test_watched_by
43 def test_watched_by
44 assert @issue.add_watcher(@user)
44 assert @issue.add_watcher(@user)
45 @issue.reload
45 @issue.reload
46 assert @issue.watched_by?(@user)
46 assert @issue.watched_by?(@user)
47 assert Issue.watched_by(@user).include?(@issue)
47 assert Issue.watched_by(@user).include?(@issue)
48 end
48 end
49
49
50 def test_watcher_user_ids
51 issue = Issue.new
52 issue.watcher_user_ids = ['1', '3']
53 assert issue.watched_by?(User.find(1))
54 end
55
50 def test_recipients
56 def test_recipients
51 @issue.watchers.delete_all
57 @issue.watchers.delete_all
52 @issue.reload
58 @issue.reload
53
59
54 assert @issue.watcher_recipients.empty?
60 assert @issue.watcher_recipients.empty?
55 assert @issue.add_watcher(@user)
61 assert @issue.add_watcher(@user)
56
62
57 @user.mail_notification = true
63 @user.mail_notification = true
58 @user.save
64 @user.save
59 @issue.reload
65 @issue.reload
60 assert @issue.watcher_recipients.include?(@user.mail)
66 assert @issue.watcher_recipients.include?(@user.mail)
61
67
62 @user.mail_notification = false
68 @user.mail_notification = false
63 @user.save
69 @user.save
64 @issue.reload
70 @issue.reload
65 assert @issue.watcher_recipients.include?(@user.mail)
71 assert @issue.watcher_recipients.include?(@user.mail)
66 end
72 end
67
73
68 def test_unwatch
74 def test_unwatch
69 assert @issue.add_watcher(@user)
75 assert @issue.add_watcher(@user)
70 @issue.reload
76 @issue.reload
71 assert_equal 1, @issue.remove_watcher(@user)
77 assert_equal 1, @issue.remove_watcher(@user)
72 end
78 end
73
79
74 def test_prune
80 def test_prune
75 Watcher.delete_all("user_id = 9")
81 Watcher.delete_all("user_id = 9")
76 user = User.find(9)
82 user = User.find(9)
77
83
78 # public
84 # public
79 Watcher.create!(:watchable => Issue.find(1), :user => user)
85 Watcher.create!(:watchable => Issue.find(1), :user => user)
80 Watcher.create!(:watchable => Issue.find(2), :user => user)
86 Watcher.create!(:watchable => Issue.find(2), :user => user)
81 Watcher.create!(:watchable => Message.find(1), :user => user)
87 Watcher.create!(:watchable => Message.find(1), :user => user)
82 Watcher.create!(:watchable => Wiki.find(1), :user => user)
88 Watcher.create!(:watchable => Wiki.find(1), :user => user)
83 Watcher.create!(:watchable => WikiPage.find(2), :user => user)
89 Watcher.create!(:watchable => WikiPage.find(2), :user => user)
84
90
85 # private project (id: 2)
91 # private project (id: 2)
86 Member.create!(:project => Project.find(2), :principal => user, :role_ids => [1])
92 Member.create!(:project => Project.find(2), :principal => user, :role_ids => [1])
87 Watcher.create!(:watchable => Issue.find(4), :user => user)
93 Watcher.create!(:watchable => Issue.find(4), :user => user)
88 Watcher.create!(:watchable => Message.find(7), :user => user)
94 Watcher.create!(:watchable => Message.find(7), :user => user)
89 Watcher.create!(:watchable => Wiki.find(2), :user => user)
95 Watcher.create!(:watchable => Wiki.find(2), :user => user)
90 Watcher.create!(:watchable => WikiPage.find(3), :user => user)
96 Watcher.create!(:watchable => WikiPage.find(3), :user => user)
91
97
92 assert_no_difference 'Watcher.count' do
98 assert_no_difference 'Watcher.count' do
93 Watcher.prune(:user => User.find(9))
99 Watcher.prune(:user => User.find(9))
94 end
100 end
95
101
96 Member.delete_all
102 Member.delete_all
97
103
98 assert_difference 'Watcher.count', -4 do
104 assert_difference 'Watcher.count', -4 do
99 Watcher.prune(:user => User.find(9))
105 Watcher.prune(:user => User.find(9))
100 end
106 end
101
107
102 assert Issue.find(1).watched_by?(user)
108 assert Issue.find(1).watched_by?(user)
103 assert !Issue.find(4).watched_by?(user)
109 assert !Issue.find(4).watched_by?(user)
104 end
110 end
105 end
111 end
@@ -1,74 +1,74
1 # ActsAsWatchable
1 # ActsAsWatchable
2 module Redmine
2 module Redmine
3 module Acts
3 module Acts
4 module Watchable
4 module Watchable
5 def self.included(base)
5 def self.included(base)
6 base.extend ClassMethods
6 base.extend ClassMethods
7 end
7 end
8
8
9 module ClassMethods
9 module ClassMethods
10 def acts_as_watchable(options = {})
10 def acts_as_watchable(options = {})
11 return if self.included_modules.include?(Redmine::Acts::Watchable::InstanceMethods)
11 return if self.included_modules.include?(Redmine::Acts::Watchable::InstanceMethods)
12 send :include, Redmine::Acts::Watchable::InstanceMethods
12 send :include, Redmine::Acts::Watchable::InstanceMethods
13
13
14 class_eval do
14 class_eval do
15 has_many :watchers, :as => :watchable, :dependent => :delete_all
15 has_many :watchers, :as => :watchable, :dependent => :delete_all
16 has_many :watcher_users, :through => :watchers, :source => :user
16 has_many :watcher_users, :through => :watchers, :source => :user
17
17
18 attr_protected :watcher_ids, :watcher_user_ids
18 attr_protected :watcher_ids, :watcher_user_ids
19 end
19 end
20 end
20 end
21 end
21 end
22
22
23 module InstanceMethods
23 module InstanceMethods
24 def self.included(base)
24 def self.included(base)
25 base.extend ClassMethods
25 base.extend ClassMethods
26 end
26 end
27
27
28 # Returns an array of users that are proposed as watchers
28 # Returns an array of users that are proposed as watchers
29 def addable_watcher_users
29 def addable_watcher_users
30 self.project.users.sort - self.watcher_users
30 self.project.users.sort - self.watcher_users
31 end
31 end
32
32
33 # Adds user as a watcher
33 # Adds user as a watcher
34 def add_watcher(user)
34 def add_watcher(user)
35 self.watchers << Watcher.new(:user => user)
35 self.watchers << Watcher.new(:user => user)
36 end
36 end
37
37
38 # Removes user from the watchers list
38 # Removes user from the watchers list
39 def remove_watcher(user)
39 def remove_watcher(user)
40 return nil unless user && user.is_a?(User)
40 return nil unless user && user.is_a?(User)
41 Watcher.delete_all "watchable_type = '#{self.class}' AND watchable_id = #{self.id} AND user_id = #{user.id}"
41 Watcher.delete_all "watchable_type = '#{self.class}' AND watchable_id = #{self.id} AND user_id = #{user.id}"
42 end
42 end
43
43
44 # Adds/removes watcher
44 # Adds/removes watcher
45 def set_watcher(user, watching=true)
45 def set_watcher(user, watching=true)
46 watching ? add_watcher(user) : remove_watcher(user)
46 watching ? add_watcher(user) : remove_watcher(user)
47 end
47 end
48
48
49 # Returns true if object is watched by user
49 # Returns true if object is watched by +user+
50 def watched_by?(user)
50 def watched_by?(user)
51 !!(user && self.watchers.detect {|w| w.user_id == user.id })
51 !!(user && self.watcher_user_ids.detect {|uid| uid == user.id })
52 end
52 end
53
53
54 # Returns an array of watchers' email addresses
54 # Returns an array of watchers' email addresses
55 def watcher_recipients
55 def watcher_recipients
56 notified = watchers.collect(&:user).select(&:active?)
56 notified = watchers.collect(&:user).select(&:active?)
57 if respond_to?(:visible?)
57 if respond_to?(:visible?)
58 notified.reject! {|user| !visible?(user)}
58 notified.reject! {|user| !visible?(user)}
59 end
59 end
60 notified.collect(&:mail).compact
60 notified.collect(&:mail).compact
61 end
61 end
62
62
63 module ClassMethods
63 module ClassMethods
64 # Returns the objects that are watched by user
64 # Returns the objects that are watched by user
65 def watched_by(user)
65 def watched_by(user)
66 find(:all,
66 find(:all,
67 :include => :watchers,
67 :include => :watchers,
68 :conditions => ["#{Watcher.table_name}.user_id = ?", user.id])
68 :conditions => ["#{Watcher.table_name}.user_id = ?", user.id])
69 end
69 end
70 end
70 end
71 end
71 end
72 end
72 end
73 end
73 end
74 end
74 end
General Comments 0
You need to be logged in to leave comments. Login now