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..2b4d6da269 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 += users.sort_by(&:status).collect{|s| [s.name, s.id.to_s, l("status_#{User::LABEL_BY_STATUS[s.status]}")] } if User.current.allowed_to?(:view_issue_watchers, self.project) + 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..e2b5eab29d 100644 --- a/test/functional/queries_controller_test.rb +++ b/test/functional/queries_controller_test.rb @@ -685,4 +685,41 @@ 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_watchers_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_watchers_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 + # "me" value should not be grouped + assert_include ["<< me >>", "me"], json + assert_include ["Dave Lopper", "3", "active"], json + assert_include ["Dave2 Lopper2", "5", "locked"], json + end end