From: Marius Balteanu Date: Mon, 20 Jun 2022 05:53:43 +0000 (+0000) Subject: Respect group memberships when checking if an object is watched (#37065). X-Git-Tag: 5.1.0~548 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=6ffbd3c29e33b0396b825df3251f286af5c16644;p=redmine.git Respect group memberships when checking if an object is watched (#37065). Patch Holger Just. git-svn-id: https://svn.redmine.org/redmine/trunk@21661 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb b/lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb index bb71a2884..907535ec7 100644 --- a/lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb +++ b/lib/plugins/acts_as_watchable/lib/acts_as_watchable.rb @@ -15,9 +15,13 @@ module Redmine has_many :watchers, :as => :watchable, :dependent => :delete_all has_many :watcher_users, :through => :watchers, :source => :user, :validate => false - scope :watched_by, lambda { |user_id| + scope :watched_by, lambda { |principal| + user_ids = Array(principal.id) + user_ids |= principal.group_ids if principal.is_a?(User) + user_ids.compact! + joins(:watchers). - where("#{Watcher.table_name}.user_id = ?", user_id) + where("#{Watcher.table_name}.user_id IN (?)", user_ids) } end send :include, Redmine::Acts::Watchable::InstanceMethods @@ -66,9 +70,17 @@ module Redmine super user_ids end - # Returns true if object is watched by +user+ - def watched_by?(user) - !!(user && self.watcher_user_ids.detect {|uid| uid == user.id }) + # Returns true if object is watched by +principal+, that is + # either by a given group, + # or by a given user or any of their groups + def watched_by?(principal) + return false unless principal + + user_ids = Array(principal.id) + user_ids |= principal.group_ids if principal.is_a?(User) + user_ids.compact! + + (self.watcher_user_ids & user_ids).any? end def notified_watchers diff --git a/test/unit/watcher_test.rb b/test/unit/watcher_test.rb index 1638f4fcb..a2de4c192 100644 --- a/test/unit/watcher_test.rb +++ b/test/unit/watcher_test.rb @@ -20,7 +20,7 @@ require File.expand_path('../../test_helper', __FILE__) class WatcherTest < ActiveSupport::TestCase - fixtures :projects, :users, :email_addresses, :members, :member_roles, :roles, :enabled_modules, + fixtures :projects, :groups_users, :users, :email_addresses, :members, :member_roles, :roles, :enabled_modules, :issues, :issue_statuses, :enumerations, :trackers, :projects_trackers, :boards, :messages, :wikis, :wiki_pages, @@ -60,6 +60,19 @@ class WatcherTest < ActiveSupport::TestCase assert Issue.watched_by(@user).include?(@issue) end + def test_watched_by_group + group = Group.find(10) + user = User.find(8) + assert @issue.add_watcher(group) + @issue.reload + + assert @issue.watched_by?(group) + assert Issue.watched_by(group).include?(@issue) + + assert @issue.watched_by?(user) + assert Issue.watched_by(user).include?(@issue) + end + def test_watcher_users watcher_users = Issue.find(2).watcher_users assert_kind_of Array, watcher_users.collect{|w| w}