summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2017-01-14 12:26:13 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2017-01-14 12:26:13 +0000
commite808c62253235f4635de314dd1f42231dc608e62 (patch)
tree181e4f4e6fc6d6ed02d3d7002a9800ecf314e337
parent69d7f920f525f68355213c313be23b404d0384c6 (diff)
downloadredmine-e808c62253235f4635de314dd1f42231dc608e62.tar.gz
redmine-e808c62253235f4635de314dd1f42231dc608e62.zip
Filtering out specific subprojects (using 'is not' operator) (#15773).
Patch by Marius BALTEANU. git-svn-id: http://svn.redmine.org/redmine/trunk@16196 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/models/query.rb13
-rw-r--r--test/unit/query_test.rb23
2 files changed, 30 insertions, 6 deletions
diff --git a/app/models/query.rb b/app/models/query.rb
index 1fe405deb..640db190d 100644
--- a/app/models/query.rb
+++ b/app/models/query.rb
@@ -269,7 +269,7 @@ class Query < ActiveRecord::Base
:list => [ "=", "!" ],
:list_status => [ "o", "=", "!", "c", "*" ],
:list_optional => [ "=", "!", "!*", "*" ],
- :list_subprojects => [ "*", "!*", "=" ],
+ :list_subprojects => [ "*", "!*", "=", "!" ],
:date => [ "=", ">=", "<=", "><", "<t+", ">t+", "><t+", "t+", "t", "ld", "w", "lw", "l2w", "m", "lm", "y", ">t-", "<t-", "><t-", "t-", "!*", "*" ],
:date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "><t-", "t-", "t", "ld", "w", "lw", "l2w", "m", "lm", "y", "!*", "*" ],
:string => [ "=", "~", "!", "!~", "!*", "*" ],
@@ -756,12 +756,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
index f559756f8..6b555b94a 100644
--- a/test/unit/query_test.rb
+++ b/test/unit/query_test.rb
@@ -704,15 +704,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)
@@ -1875,4 +1875,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