diff --git a/app/models/query.rb b/app/models/query.rb index 44b3adca3..f72988d38 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -897,34 +897,30 @@ class Query < ActiveRecord::Base end def project_statement + return nil unless project + project_clauses = [] - 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").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 - project_clauses << "#{Project.table_name}.id = %d" % project.id - else - # all subprojects - project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}" - end - elsif Setting.display_subprojects_issues? - project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}" - else + if has_filter?("subproject_id") + case operator_for("subproject_id") + when '=' + # include the selected subprojects + 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 + active_subprojects_ids = project.descendants.active.map(&:id) + 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 project_clauses << "#{Project.table_name}.id = %d" % project.id + else + # all subprojects + project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}" end - elsif project + elsif Setting.display_subprojects_issues? + project_clauses << "#{Project.table_name}.lft >= #{project.lft} AND #{Project.table_name}.rgt <= #{project.rgt}" + else project_clauses << "#{Project.table_name}.id = %d" % project.id end project_clauses.any? ? project_clauses.join(' AND ') : nil diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 07533a854..61b3487e7 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -119,6 +119,37 @@ class IssuesControllerTest < Redmine::ControllerTest end end + def test_index_with_project_and_closed_subprojects_should_show_issues_for_closed_projects + Project.update_all(:is_public => true) + project = Project.find(1) + assert_equal [3, 4, 5, 6], project.descendants.collect(&:id).sort + + with_settings :display_subprojects_issues => '1' do + [ + nil, + [3], + [3, 4, 5, 6] + ].each do |subproject_ids| + project.reopen + (subproject_ids || []).each do |subproject_id| + Project.find(subproject_id).close + end + + get(:index, :params => {:project_id => project.id}) + assert_response :success + + assert_select 'td.id' do + assert_select 'a[href="/issues/5"]', 1 + assert_select 'a[href="/issues/6"]', 1 + assert_select 'a[href="/issues/9"]', 1 + assert_select 'a[href="/issues/10"]', 1 + assert_select 'a[href="/issues/13"]', 1 + assert_select 'a[href="/issues/14"]', 0 # private issue + end + end + end + end + def test_index_with_project_and_subprojects_should_show_private_subprojects_with_permission @request.session[:user_id] = 2 with_settings :display_subprojects_issues => '1' do diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index 70141a87e..696283166 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -2503,6 +2503,28 @@ class QueryTest < ActiveSupport::TestCase ActiveRecord::Base.default_timezone = :local # restore Redmine default end + def test_project_statement_with_closed_subprojects + project = Project.find(1) + assert_equal [3, 4, 5, 6], project.descendants.collect(&:id).sort + + with_settings :display_subprojects_issues => '1' do + [ + nil, + [3], + [3, 4, 5, 6] + ].each do |subproject_ids| + project.reopen + (subproject_ids || []).each do |subproject_id| + Project.find(subproject_id).close + end + + query = IssueQuery.new(:name => '_', :project => project) + statement = query.project_statement + assert_equal "projects.lft >= #{project.lft} AND projects.rgt <= #{project.rgt}", statement + end + end + end + def test_filter_on_subprojects query = IssueQuery.new(:name => '_', :project => Project.find(1)) filter_name = "subproject_id"