]> source.dussan.org Git - redmine.git/commitdiff
Extend Issue Summary to include subprojects (#2529).
authorGo MAEDA <maeda@farend.jp>
Wed, 3 Oct 2018 07:16:47 +0000 (07:16 +0000)
committerGo MAEDA <maeda@farend.jp>
Wed, 3 Oct 2018 07:16:47 +0000 (07:16 +0000)
Patch by Mizuki ISHIKAWA.

git-svn-id: http://svn.redmine.org/redmine/trunk@17563 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/reports_controller.rb
app/models/issue.rb
app/views/reports/_details.html.erb
app/views/reports/_simple.html.erb
test/functional/reports_controller_test.rb
test/unit/issue_test.rb

index 6f75b56527073e99d51eb938c1755e7b98fecb56..cfef2f2001a3b2a24456b90b000a9a0237a0660f 100644 (file)
@@ -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"
index b9d8355ecc5ec7684717f3b0b6c9d981f09b2de2..aa2c08b332fb3a5476eb6797853dddb218292617 100644 (file)
@@ -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)
index 998089cafc929c6c1f0d7142b9552ba46d1c4992..d9d9a3614b877e4ed1f197cdecfa330ca732eca5 100644 (file)
 <tbody>
 <% for row in rows %>
 <tr>
-  <td class="name"><%= link_to row.name, aggregate_path(@project, field_name, row) %></td>
+  <td class="name"><%= link_to row.name, aggregate_path(@project, field_name, row, :subproject_id => nil) %></td>
   <% for status in @statuses %>
-    <td><%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, aggregate_path(@project, field_name, row, :status_id => status.id) %></td>
+    <td><%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, aggregate_path(@project, field_name, row, :status_id => status.id, :subproject_id => nil) %></td>
   <% end %>
-  <td><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %></td>
-  <td><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %></td>
-  <td><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %></td>
+  <td><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o", :subproject_id => nil) %></td>
+  <td><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c", :subproject_id => nil) %></td>
+  <td><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*", :subproject_id => nil) %></td>
 </tr>
 <% end %>
 </tbody>
index d6f51ad19feaa08f76b60e7b9928828fe9aa3db0..754b1f21d08d3d0d8b5ef2b0cb698aefb8034c8b 100644 (file)
 <tbody>
 <% for row in rows %>
 <tr>
-  <td class="name"><%= link_to row.name, aggregate_path(@project, field_name, row) %></td>
-  <td><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %></td>
-  <td><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %></td>
-  <td><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %></td>
+  <td class="name"><%= link_to row.name, aggregate_path(@project, field_name, row, :subproject_id => nil) %></td>
+  <td><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o", :subproject_id => nil) %></td>
+  <td><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c", :subproject_id => nil) %></td>
+  <td><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*", :subproject_id => nil) %></td>
 </tr>
 <% end %>
 </tbody>
index 63a882a8d587ba5737d32777f75ec81b67699493..0b922f288fa05d10a52eab78c8286441956b6849 100644 (file)
@@ -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)
index 4d2b6866336af289b02bf8016236681bee959039..a6ace2fa038f19384c3af05ebf21226151c3e916 100644 (file)
@@ -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