Patch #37065 » 0001-Respect-group-memberships-when-checking-if-an-object.patch
| lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb | ||
|---|---|---|
| 15 | 15 |
has_many :watchers, :as => :watchable, :dependent => :delete_all |
| 16 | 16 |
has_many :watcher_users, :through => :watchers, :source => :user, :validate => false |
| 17 | 17 | |
| 18 |
scope :watched_by, lambda { |user_id|
|
|
| 18 |
scope :watched_by, lambda { |principal|
|
|
| 19 |
user_ids = Array(principal.id) |
|
| 20 |
user_ids |= principal.group_ids if principal.is_a?(User) |
|
| 21 |
user_ids.compact! |
|
| 22 | ||
| 19 | 23 |
joins(:watchers). |
| 20 |
where("#{Watcher.table_name}.user_id = ?", user_id)
|
|
| 24 |
where("#{Watcher.table_name}.user_id IN (?)", user_ids)
|
|
| 21 | 25 |
} |
| 22 | 26 |
end |
| 23 | 27 |
send :include, Redmine::Acts::Watchable::InstanceMethods |
| ... | ... | |
| 66 | 70 |
super user_ids |
| 67 | 71 |
end |
| 68 | 72 | |
| 69 |
# Returns true if object is watched by +user+ |
|
| 70 |
def watched_by?(user) |
|
| 71 |
!!(user && self.watcher_user_ids.detect {|uid| uid == user.id })
|
|
| 73 |
# Returns true if object is watched by +principal+, that is |
|
| 74 |
# either by a given group, |
|
| 75 |
# or by a given user or any of their groups |
|
| 76 |
def watched_by?(principal) |
|
| 77 |
return false unless principal |
|
| 78 | ||
| 79 |
user_ids = Array(principal.id) |
|
| 80 |
user_ids |= principal.group_ids if principal.is_a?(User) |
|
| 81 |
user_ids.compact! |
|
| 82 | ||
| 83 |
(self.watcher_user_ids & user_ids).any? |
|
| 72 | 84 |
end |
| 73 | 85 | |
| 74 | 86 |
def notified_watchers |
| test/unit/watcher_test.rb | ||
|---|---|---|
| 20 | 20 |
require File.expand_path('../../test_helper', __FILE__)
|
| 21 | 21 | |
| 22 | 22 |
class WatcherTest < ActiveSupport::TestCase |
| 23 |
fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles, :enabled_modules, |
|
| 23 |
fixtures :projects, :groups_users, :users, :email_addresses, :members, :member_roles, :roles, :enabled_modules,
|
|
| 24 | 24 |
:issues, :issue_statuses, :enumerations, :trackers, :projects_trackers, |
| 25 | 25 |
:boards, :messages, |
| 26 | 26 |
:wikis, :wiki_pages, |
| ... | ... | |
| 60 | 60 |
assert Issue.watched_by(@user).include?(@issue) |
| 61 | 61 |
end |
| 62 | 62 | |
| 63 |
def test_watched_by_group |
|
| 64 |
group = Group.find(10) |
|
| 65 |
user = User.find(8) |
|
| 66 |
assert @issue.add_watcher(group) |
|
| 67 |
@issue.reload |
|
| 68 | ||
| 69 |
assert @issue.watched_by?(group) |
|
| 70 |
assert Issue.watched_by(group).include?(@issue) |
|
| 71 | ||
| 72 |
assert @issue.watched_by?(user) |
|
| 73 |
assert Issue.watched_by(user).include?(@issue) |
|
| 74 |
end |
|
| 75 | ||
| 63 | 76 |
def test_watcher_users |
| 64 | 77 |
watcher_users = Issue.find(2).watcher_users |
| 65 | 78 |
assert_kind_of Array, watcher_users.collect{|w| w}
|
- « Previous
- 1
- 2
- 3
- Next »