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