Patch by Marius BALTEANU. git-svn-id: http://svn.redmine.org/redmine/trunk@16196 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/3.4.0
@@ -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 |
@@ -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 |