From 3952c4d2642e275c1b1b04135596265b04548a13 Mon Sep 17 00:00:00 2001 From: Go MAEDA Date: Wed, 3 Oct 2018 07:16:47 +0000 Subject: [PATCH] Extend Issue Summary to include subprojects (#2529). Patch by Mizuki ISHIKAWA. git-svn-id: http://svn.redmine.org/redmine/trunk@17563 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/reports_controller.rb | 27 ++++---- app/models/issue.rb | 24 +++---- app/views/reports/_details.html.erb | 10 +-- app/views/reports/_simple.html.erb | 8 +-- test/functional/reports_controller_test.rb | 79 ++++++++++++++++++++++ test/unit/issue_test.rb | 52 +++++++++----- 6 files changed, 149 insertions(+), 51 deletions(-) diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb index 6f75b5652..cfef2f200 100644 --- a/app/controllers/reports_controller.rb +++ b/app/controllers/reports_controller.rb @@ -27,49 +27,50 @@ class ReportsController < ApplicationController @assignees = (Setting.issue_group_assignment? ? @project.principals : @project.users).sort @authors = @project.users.sort @subprojects = @project.descendants.visible - - @issues_by_tracker = Issue.by_tracker(@project) - @issues_by_version = Issue.by_version(@project) - @issues_by_priority = Issue.by_priority(@project) - @issues_by_category = Issue.by_category(@project) - @issues_by_assigned_to = Issue.by_assigned_to(@project) - @issues_by_author = Issue.by_author(@project) + with_subprojects = Setting.display_subprojects_issues? + @issues_by_tracker = Issue.by_tracker(@project, with_subprojects) + @issues_by_version = Issue.by_version(@project, with_subprojects) + @issues_by_priority = Issue.by_priority(@project, with_subprojects) + @issues_by_category = Issue.by_category(@project, with_subprojects) + @issues_by_assigned_to = Issue.by_assigned_to(@project, with_subprojects) + @issues_by_author = Issue.by_author(@project, with_subprojects) @issues_by_subproject = Issue.by_subproject(@project) || [] render :template => "reports/issue_report" end def issue_report_details + with_subprojects = Setting.display_subprojects_issues? case params[:detail] when "tracker" @field = "tracker_id" @rows = @project.rolled_up_trackers(false).visible - @data = Issue.by_tracker(@project) + @data = Issue.by_tracker(@project, with_subprojects) @report_title = l(:field_tracker) when "version" @field = "fixed_version_id" @rows = @project.shared_versions.sort - @data = Issue.by_version(@project) + @data = Issue.by_version(@project, with_subprojects) @report_title = l(:field_version) when "priority" @field = "priority_id" @rows = IssuePriority.all.reverse - @data = Issue.by_priority(@project) + @data = Issue.by_priority(@project, with_subprojects) @report_title = l(:field_priority) when "category" @field = "category_id" @rows = @project.issue_categories - @data = Issue.by_category(@project) + @data = Issue.by_category(@project, with_subprojects) @report_title = l(:field_category) when "assigned_to" @field = "assigned_to_id" @rows = (Setting.issue_group_assignment? ? @project.principals : @project.users).sort - @data = Issue.by_assigned_to(@project) + @data = Issue.by_assigned_to(@project, with_subprojects) @report_title = l(:field_assigned_to) when "author" @field = "author_id" @rows = @project.users.sort - @data = Issue.by_author(@project) + @data = Issue.by_author(@project, with_subprojects) @report_title = l(:field_author) when "subproject" @field = "project_id" diff --git a/app/models/issue.rb b/app/models/issue.rb index b9d8355ec..aa2c08b33 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -1464,28 +1464,28 @@ class Issue < ActiveRecord::Base end end - def self.by_tracker(project) - count_and_group_by(:project => project, :association => :tracker) + def self.by_tracker(project, with_subprojects=false) + count_and_group_by(:project => project, :association => :tracker, :with_subprojects => with_subprojects) end - def self.by_version(project) - count_and_group_by(:project => project, :association => :fixed_version) + def self.by_version(project, with_subprojects=false) + count_and_group_by(:project => project, :association => :fixed_version, :with_subprojects => with_subprojects) end - def self.by_priority(project) - count_and_group_by(:project => project, :association => :priority) + def self.by_priority(project, with_subprojects=false) + count_and_group_by(:project => project, :association => :priority, :with_subprojects => with_subprojects) end - def self.by_category(project) - count_and_group_by(:project => project, :association => :category) + def self.by_category(project, with_subprojects=false) + count_and_group_by(:project => project, :association => :category, :with_subprojects => with_subprojects) end - def self.by_assigned_to(project) - count_and_group_by(:project => project, :association => :assigned_to) + def self.by_assigned_to(project, with_subprojects=false) + count_and_group_by(:project => project, :association => :assigned_to, :with_subprojects => with_subprojects) end - def self.by_author(project) - count_and_group_by(:project => project, :association => :author) + def self.by_author(project, with_subprojects=false) + count_and_group_by(:project => project, :association => :author, :with_subprojects => with_subprojects) end def self.by_subproject(project) diff --git a/app/views/reports/_details.html.erb b/app/views/reports/_details.html.erb index 998089caf..d9d9a3614 100644 --- a/app/views/reports/_details.html.erb +++ b/app/views/reports/_details.html.erb @@ -14,13 +14,13 @@ <% for row in rows %> - <%= link_to row.name, aggregate_path(@project, field_name, row) %> + <%= link_to row.name, aggregate_path(@project, field_name, row, :subproject_id => nil) %> <% for status in @statuses %> - <%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, aggregate_path(@project, field_name, row, :status_id => status.id) %> + <%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, aggregate_path(@project, field_name, row, :status_id => status.id, :subproject_id => nil) %> <% end %> - <%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %> - <%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %> - <%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %> + <%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o", :subproject_id => nil) %> + <%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c", :subproject_id => nil) %> + <%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*", :subproject_id => nil) %> <% end %> diff --git a/app/views/reports/_simple.html.erb b/app/views/reports/_simple.html.erb index d6f51ad19..754b1f21d 100644 --- a/app/views/reports/_simple.html.erb +++ b/app/views/reports/_simple.html.erb @@ -11,10 +11,10 @@ <% for row in rows %> - <%= link_to row.name, aggregate_path(@project, field_name, row) %> - <%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %> - <%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %> - <%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %> + <%= link_to row.name, aggregate_path(@project, field_name, row, :subproject_id => nil) %> + <%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o", :subproject_id => nil) %> + <%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c", :subproject_id => nil) %> + <%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*", :subproject_id => nil) %> <% end %> diff --git a/test/functional/reports_controller_test.rb b/test/functional/reports_controller_test.rb index 63a882a8d..0b922f288 100644 --- a/test/functional/reports_controller_test.rb +++ b/test/functional/reports_controller_test.rb @@ -34,6 +34,38 @@ class ReportsControllerTest < Redmine::ControllerTest assert_response :success end + def test_issue_report_with_subprojects_issues + Setting.stubs(:display_subprojects_issues?).returns(true) + get :issue_report, :params => { + :id => 1 + } + + assert_response :success + # Count subprojects issues + assert_select 'table.list tbody :nth-child(1):first' do + assert_select 'td', :text => 'Bug' + assert_select ':nth-child(2)', :text => '5' # open + assert_select ':nth-child(3)', :text => '3' # closed + assert_select ':nth-child(4)', :text => '8' # total + end + end + + def test_issue_report_without_subprojects_issues + Setting.stubs(:display_subprojects_issues?).returns(false) + get :issue_report, :params => { + :id => 1 + } + + assert_response :success + # Do not count subprojects issues + assert_select 'table.list tbody :nth-child(1):first' do + assert_select 'td', :text => 'Bug' + assert_select ':nth-child(2)', :text => '3' # open + assert_select ':nth-child(3)', :text => '3' # closed + assert_select ':nth-child(4)', :text => '6' # total + end + end + def test_get_issue_report_details %w(tracker version priority category assigned_to author subproject).each do |detail| get :issue_report_details, :params => { @@ -45,6 +77,7 @@ class ReportsControllerTest < Redmine::ControllerTest end def test_get_issue_report_details_by_tracker_should_show_only_statuses_used_by_the_project + Setting.stubs(:display_subprojects_issues?).returns(false) WorkflowTransition.delete_all WorkflowTransition.create(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5) WorkflowTransition.create(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4) @@ -70,6 +103,52 @@ class ReportsControllerTest < Redmine::ControllerTest end end + def test_get_issue_report_details_by_tracker_with_subprojects_issues + Setting.stubs(:display_subprojects_issues?).returns(true) + get :issue_report_details, :params => { + :id => 1, + :detail => 'tracker' + } + + assert_response :success + # Count subprojects issues + assert_select 'table.list tbody :nth-child(1)' do + assert_select 'td', :text => 'Bug' + assert_select ':nth-child(2)', :text => '5' # status:1 + assert_select ':nth-child(3)', :text => '-' # status:2 + assert_select ':nth-child(4)', :text => '-' # status:3 + assert_select ':nth-child(5)', :text => '-' # status:4 + assert_select ':nth-child(6)', :text => '3' # status:5 + assert_select ':nth-child(7)', :text => '-' # status:6 + assert_select ':nth-child(8)', :text => '5' # open + assert_select ':nth-child(9)', :text => '3' # closed + assert_select ':nth-child(10)', :text => '8' # total + end + end + + def test_get_issue_report_details_by_tracker_without_subprojects_issues + Setting.stubs(:display_subprojects_issues?).returns(false) + get :issue_report_details, :params => { + :id => 1, + :detail => 'tracker' + } + + assert_response :success + # Do not count subprojects issues + assert_select 'table.list tbody :nth-child(1)' do + assert_select 'td', :text => 'Bug' + assert_select ':nth-child(2)', :text => '3' # status:1 + assert_select ':nth-child(3)', :text => '-' # status:2 + assert_select ':nth-child(4)', :text => '-' # status:3 + assert_select ':nth-child(5)', :text => '-' # status:4 + assert_select ':nth-child(6)', :text => '3' # status:5 + assert_select ':nth-child(7)', :text => '-' # status:6 + assert_select ':nth-child(8)', :text => '3' # open + assert_select ':nth-child(9)', :text => '3' # closed + assert_select ':nth-child(10)', :text => '6' # total + end + end + def test_get_issue_report_details_by_tracker_should_show_issue_count Issue.delete_all Issue.generate!(:tracker_id => 1) diff --git a/test/unit/issue_test.rb b/test/unit/issue_test.rb index 4d2b68663..a6ace2fa0 100644 --- a/test/unit/issue_test.rb +++ b/test/unit/issue_test.rb @@ -2756,45 +2756,63 @@ class IssueTest < ActiveSupport::TestCase end test "#by_tracker" do - User.current = User.anonymous + User.current = User.find(2) groups = Issue.by_tracker(Project.find(1)) - assert_equal 3, groups.count + groups_containing_subprojects = Issue.by_tracker(Project.find(1), true) assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i} + assert_equal 13, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_version" do - User.current = User.anonymous - groups = Issue.by_version(Project.find(1)) - assert_equal 3, groups.count + User.current = User.find(2) + project = Project.find(1) + Issue.generate!(:project_id => project.descendants.visible.first, :fixed_version_id => project.shared_versions.find_by(:sharing => 'tree').id) + + groups = Issue.by_version(project) + groups_containing_subprojects = Issue.by_version(project, true) assert_equal 3, groups.inject(0) {|sum, group| sum + group['total'].to_i} + assert_equal 4, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_priority" do - User.current = User.anonymous - groups = Issue.by_priority(Project.find(1)) - assert_equal 4, groups.count + User.current = User.find(2) + project = Project.find(1) + groups = Issue.by_priority(project) + groups_containing_subprojects = Issue.by_priority(project, true) assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i} + assert_equal 13, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_category" do - User.current = User.anonymous - groups = Issue.by_category(Project.find(1)) - assert_equal 2, groups.count + User.current = User.find(2) + project = Project.find(1) + issue_category = IssueCategory.create(:project => project.descendants.visible.first, :name => 'test category') + Issue.generate!(:project_id => project.descendants.visible.first, :category_id => issue_category.id) + + groups = Issue.by_category(project) + groups_containing_subprojects = Issue.by_category(project, true) assert_equal 3, groups.inject(0) {|sum, group| sum + group['total'].to_i} + assert_equal 4, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_assigned_to" do - User.current = User.anonymous - groups = Issue.by_assigned_to(Project.find(1)) - assert_equal 2, groups.count + User.current = User.find(2) + project = Project.find(1) + Issue.generate!(:project_id => project.descendants.visible.first, :assigned_to => User.current) + + groups = Issue.by_assigned_to(project) + groups_containing_subprojects = Issue.by_assigned_to(project, true) assert_equal 2, groups.inject(0) {|sum, group| sum + group['total'].to_i} + assert_equal 3, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_author" do - User.current = User.anonymous - groups = Issue.by_author(Project.find(1)) - assert_equal 4, groups.count + User.current = User.find(2) + project = Project.find(1) + groups = Issue.by_author(project) + groups_containing_subprojects = Issue.by_author(project, true) assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i} + assert_equal 13, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i} end test "#by_subproject" do -- 2.39.5