diff --git a/app/models/query.rb b/app/models/query.rb old mode 100644 new mode 100755 index b0b39da..84d5b20 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -235,7 +235,7 @@ class Query < ActiveRecord::Base :list => [ "=", "!" ], :list_status => [ "o", "=", "!", "c", "*" ], :list_optional => [ "=", "!", "!*", "*" ], - :list_subprojects => [ "*", "!*", "=" ], + :list_subprojects => [ "*", "!*", "=", "!" ], :date => [ "=", ">=", "<=", "><", "t+", ">t-", " [ "=", ">=", "<=", "><", ">t-", " [ "=", "~", "!", "!~", "!*", "*" ], @@ -661,12 +661,19 @@ class Query < ActiveRecord::Base def project_statement project_clauses = [] - if project && !project.descendants.active.empty? + active_subprojects_ids = [] + + active_subprojects_ids = project.descendants.active.map(&:id) if project + if active_subprojects_ids.any? if has_filter?("subproject_id") case operator_for("subproject_id") when '=' # include the selected subprojects - ids = [project.id] + values_for("subproject_id").each(&:to_i) + ids = [project.id] + values_for("subproject_id").map(&:to_i) + project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',') + when '!' + # exclude the selected subprojects + ids = [project.id] + active_subprojects_ids - values_for("subproject_id").map(&:to_i) project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',') when '!*' # main project only diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb old mode 100644 new mode 100755 index 6d27106..6db72d6 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -682,15 +682,15 @@ class QueryTest < ActiveSupport::TestCase Member.create!(:project_id => 1, :principal => other_group, :role_ids => [1]) User.current = user - with_settings :issue_group_assignment => '1' do + with_settings :issue_group_assignment => '1' do i1 = Issue.generate!(:project_id => 1, :tracker_id => 1, :assigned_to => user) i2 = Issue.generate!(:project_id => 1, :tracker_id => 1, :assigned_to => group) i3 = Issue.generate!(:project_id => 1, :tracker_id => 1, :assigned_to => other_group) - + query = IssueQuery.new(:name => '_', :filters => { 'assigned_to_id' => {:operator => '=', :values => ['me']}}) result = query.issues assert_equal Issue.visible.where(:assigned_to_id => ([2] + user.reload.group_ids)).sort_by(&:id), result.sort_by(&:id) - + assert result.include?(i1) assert result.include?(i2) assert !result.include?(i3) @@ -1810,4 +1810,21 @@ class QueryTest < ActiveSupport::TestCase ActiveRecord::Base.default_timezone = :local # restore Redmine default end + def test_filter_on_subprojects + query = IssueQuery.new(:name => '_', :project => Project.find(1)) + filter_name = "subproject_id" + assert_include filter_name, query.available_filters.keys + + # "is" operator should include issues of parent project + issues of the selected subproject + query.filters = {filter_name => {:operator => '=', :values => ['3']}} + issues = find_issues_with_query(query) + assert_equal [1, 2, 3, 5, 7, 8, 11, 12, 13, 14], issues.map(&:id).sort + + # "is not" operator should include issues of parent project + issues of all active subprojects - issues of the selected subprojects + query = IssueQuery.new(:name => '_', :project => Project.find(1)) + query.filters = {filter_name => {:operator => '!', :values => ['3']}} + issues = find_issues_with_query(query) + assert_equal [1, 2, 3, 6, 7, 8, 9, 10, 11, 12], issues.map(&:id).sort + end + end