Defect #34297 » fixed-34297.patch
| app/models/query.rb | ||
|---|---|---|
| 897 | 897 |
end |
| 898 | 898 | |
| 899 | 899 |
def project_statement |
| 900 |
return nil unless project |
|
| 901 | ||
| 900 | 902 |
project_clauses = [] |
| 901 |
active_subprojects_ids = [] |
|
| 902 | ||
| 903 |
active_subprojects_ids = project.descendants.active.map(&:id) if project |
|
| 904 |
if active_subprojects_ids.any? |
|
| 905 |
if has_filter?("subproject_id")
|
|
| 906 |
case operator_for("subproject_id")
|
|
| 907 |
when '=' |
|
| 908 |
# include the selected subprojects |
|
| 909 |
ids = [project.id] + values_for("subproject_id").map(&:to_i)
|
|
| 910 |
project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',')
|
|
| 911 |
when '!' |
|
| 912 |
# exclude the selected subprojects |
|
| 913 |
ids = [project.id] + active_subprojects_ids - values_for("subproject_id").map(&:to_i)
|
|
| 914 |
project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',')
|
|
| 915 |
when '!*' |
|
| 916 |
# main project only |
|
| 917 |
project_clauses << "#{Project.table_name}.id = %d" % project.id
|
|
| 918 |
else |
|
| 919 |
# all subprojects |
|
| 920 |
project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}"
|
|
| 921 |
end |
|
| 922 |
elsif Setting.display_subprojects_issues? |
|
| 923 |
project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}"
|
|
| 924 |
else |
|
| 903 |
if has_filter?("subproject_id")
|
|
| 904 |
case operator_for("subproject_id")
|
|
| 905 |
when '=' |
|
| 906 |
# include the selected subprojects |
|
| 907 |
ids = [project.id] + values_for("subproject_id").map(&:to_i)
|
|
| 908 |
project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',')
|
|
| 909 |
when '!' |
|
| 910 |
# exclude the selected subprojects |
|
| 911 |
active_subprojects_ids = project.descendants.active.map(&:id) |
|
| 912 |
ids = [project.id] + active_subprojects_ids - values_for("subproject_id").map(&:to_i)
|
|
| 913 |
project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',')
|
|
| 914 |
when '!*' |
|
| 915 |
# main project only |
|
| 925 | 916 |
project_clauses << "#{Project.table_name}.id = %d" % project.id
|
| 917 |
else |
|
| 918 |
# all subprojects |
|
| 919 |
project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}"
|
|
| 926 | 920 |
end |
| 927 |
elsif project |
|
| 921 |
elsif Setting.display_subprojects_issues? |
|
| 922 |
project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}"
|
|
| 923 |
else |
|
| 928 | 924 |
project_clauses << "#{Project.table_name}.id = %d" % project.id
|
| 929 | 925 |
end |
| 930 | 926 |
project_clauses.any? ? project_clauses.join(' AND ') : nil
|
| test/functional/issues_controller_test.rb | ||
|---|---|---|
| 119 | 119 |
end |
| 120 | 120 |
end |
| 121 | 121 | |
| 122 |
def test_index_with_project_and_closed_subprojects_should_show_issues_for_closed_projects |
|
| 123 |
Project.update_all(:is_public => true) |
|
| 124 |
project = Project.find(1) |
|
| 125 |
assert_equal [3, 4, 5, 6], project.descendants.collect(&:id).sort |
|
| 126 | ||
| 127 |
with_settings :display_subprojects_issues => '1' do |
|
| 128 |
[ |
|
| 129 |
nil, |
|
| 130 |
[3], |
|
| 131 |
[3, 4, 5, 6] |
|
| 132 |
].each do |subproject_ids| |
|
| 133 |
project.reopen |
|
| 134 |
(subproject_ids || []).each do |subproject_id| |
|
| 135 |
Project.find(subproject_id).close |
|
| 136 |
end |
|
| 137 | ||
| 138 |
get(:index, :params => {:project_id => project.id})
|
|
| 139 |
assert_response :success |
|
| 140 | ||
| 141 |
assert_select 'td.id' do |
|
| 142 |
assert_select 'a[href="/issues/5"]', 1 |
|
| 143 |
assert_select 'a[href="/issues/6"]', 1 |
|
| 144 |
assert_select 'a[href="/issues/9"]', 1 |
|
| 145 |
assert_select 'a[href="/issues/10"]', 1 |
|
| 146 |
assert_select 'a[href="/issues/13"]', 1 |
|
| 147 |
assert_select 'a[href="/issues/14"]', 0 # private issue |
|
| 148 |
end |
|
| 149 |
end |
|
| 150 |
end |
|
| 151 |
end |
|
| 152 | ||
| 122 | 153 |
def test_index_with_project_and_subprojects_should_show_private_subprojects_with_permission |
| 123 | 154 |
@request.session[:user_id] = 2 |
| 124 | 155 |
with_settings :display_subprojects_issues => '1' do |
| test/unit/query_test.rb | ||
|---|---|---|
| 2503 | 2503 |
ActiveRecord::Base.default_timezone = :local # restore Redmine default |
| 2504 | 2504 |
end |
| 2505 | 2505 | |
| 2506 |
def test_project_statement_with_closed_subprojects |
|
| 2507 |
project = Project.find(1) |
|
| 2508 |
assert_equal [3, 4, 5, 6], project.descendants.collect(&:id).sort |
|
| 2509 | ||
| 2510 |
with_settings :display_subprojects_issues => '1' do |
|
| 2511 |
[ |
|
| 2512 |
nil, |
|
| 2513 |
[3], |
|
| 2514 |
[3, 4, 5, 6] |
|
| 2515 |
].each do |subproject_ids| |
|
| 2516 |
project.reopen |
|
| 2517 |
(subproject_ids || []).each do |subproject_id| |
|
| 2518 |
Project.find(subproject_id).close |
|
| 2519 |
end |
|
| 2520 | ||
| 2521 |
query = IssueQuery.new(:name => '_', :project => project) |
|
| 2522 |
statement = query.project_statement |
|
| 2523 |
assert_equal "projects.lft >= #{project.lft} AND projects.rgt <= #{project.rgt}", statement
|
|
| 2524 |
end |
|
| 2525 |
end |
|
| 2526 |
end |
|
| 2527 | ||
| 2506 | 2528 |
def test_filter_on_subprojects |
| 2507 | 2529 |
query = IssueQuery.new(:name => '_', :project => Project.find(1)) |
| 2508 | 2530 |
filter_name = "subproject_id" |