diff --git a/app/models/issue_query.rb b/app/models/issue_query.rb index 6bb2bc217a..d37f509132 100644 --- a/app/models/issue_query.rb +++ b/app/models/issue_query.rb @@ -148,7 +148,7 @@ class IssueQuery < Query if User.current.logged? add_available_filter "watcher_id", - :type => :list, :values => [["<< #{l(:label_me)} >>", "me"]] + :type => :list, :values => lambda { watcher_values } end add_available_filter("updated_by", diff --git a/app/models/query.rb b/app/models/query.rb index 115e1bb7ca..7f869b2a56 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -564,6 +564,12 @@ class Query < ActiveRecord::Base statuses.collect{|s| [s.name, s.id.to_s]} end + def watcher_values + watcher_values = [["<< #{l(:label_me)} >>", "me"]] + watcher_values += self.users.map{|s| [s.name, s.id.to_s] } if User.current.allowed_to?(:view_issue_watchers, nil, :global => true) + watcher_values + end + # Returns a scope of issue custom fields that are available as columns or filters def issue_custom_fields if project diff --git a/test/functional/queries_controller_test.rb b/test/functional/queries_controller_test.rb index 93229c423f..7ec15d5d8b 100644 --- a/test/functional/queries_controller_test.rb +++ b/test/functional/queries_controller_test.rb @@ -685,4 +685,40 @@ class QueriesControllerTest < Redmine::ControllerTest assert_include ["Dave Lopper", "3", "active"], json assert_include ["Dave2 Lopper2", "5", "locked"], json end + + def test_watcher_filter_without_view_issue_watcher_should_return_filter_values + # A user who does not belong to any project + # Don't have view_issue_watcher permission + @request.session[:user_id] = 7 + + get :filter, :params => { + :project_id => 1, + :type => 'IssueQuery', + :name => 'watcher_id' + } + assert_response :success + assert_equal 'application/json', response.content_type + json = ActiveSupport::JSON.decode(response.body) + + assert_equal [["<< me >>", "me"]], json + end + + def test_watcher_filter_with_view_issue_watcher_should_return_filter_values + # This user has view_issue_watcher permission + @request.session[:user_id] = 1 + + get :filter, :params => { + :project_id => 1, + :type => 'IssueQuery', + :name => 'watcher_id' + } + assert_response :success + assert_equal 'application/json', response.content_type + json = ActiveSupport::JSON.decode(response.body) + + assert_equal 6, json.count + assert_include ["<< me >>", "me"], json + assert_include ["Dave Lopper", "3"], json + assert_include ["Dave2 Lopper2", "5"], json + end end