Project

General

Profile

Feature #2529 » feature_2629_v3.patch

Mizuki ISHIKAWA, 2018-10-03 03:00

View differences:

app/controllers/reports_controller.rb
27 27
    @assignees = (Setting.issue_group_assignment? ? @project.principals : @project.users).sort
28 28
    @authors = @project.users.sort
29 29
    @subprojects = @project.descendants.visible
30

  
31
    @issues_by_tracker = Issue.by_tracker(@project)
32
    @issues_by_version = Issue.by_version(@project)
33
    @issues_by_priority = Issue.by_priority(@project)
34
    @issues_by_category = Issue.by_category(@project)
35
    @issues_by_assigned_to = Issue.by_assigned_to(@project)
36
    @issues_by_author = Issue.by_author(@project)
30
    with_subprojects = Setting.display_subprojects_issues?
31
    @issues_by_tracker = Issue.by_tracker(@project, with_subprojects)
32
    @issues_by_version = Issue.by_version(@project, with_subprojects)
33
    @issues_by_priority = Issue.by_priority(@project, with_subprojects)
34
    @issues_by_category = Issue.by_category(@project, with_subprojects)
35
    @issues_by_assigned_to = Issue.by_assigned_to(@project, with_subprojects)
36
    @issues_by_author = Issue.by_author(@project, with_subprojects)
37 37
    @issues_by_subproject = Issue.by_subproject(@project) || []
38 38

  
39 39
    render :template => "reports/issue_report"
40 40
  end
41 41

  
42 42
  def issue_report_details
43
    with_subprojects = Setting.display_subprojects_issues?
43 44
    case params[:detail]
44 45
    when "tracker"
45 46
      @field = "tracker_id"
46 47
      @rows = @project.rolled_up_trackers(false).visible
47
      @data = Issue.by_tracker(@project)
48
      @data = Issue.by_tracker(@project, with_subprojects)
48 49
      @report_title = l(:field_tracker)
49 50
    when "version"
50 51
      @field = "fixed_version_id"
51 52
      @rows = @project.shared_versions.sort
52
      @data = Issue.by_version(@project)
53
      @data = Issue.by_version(@project, with_subprojects)
53 54
      @report_title = l(:field_version)
54 55
    when "priority"
55 56
      @field = "priority_id"
56 57
      @rows = IssuePriority.all.reverse
57
      @data = Issue.by_priority(@project)
58
      @data = Issue.by_priority(@project, with_subprojects)
58 59
      @report_title = l(:field_priority)
59 60
    when "category"
60 61
      @field = "category_id"
61 62
      @rows = @project.issue_categories
62
      @data = Issue.by_category(@project)
63
      @data = Issue.by_category(@project, with_subprojects)
63 64
      @report_title = l(:field_category)
64 65
    when "assigned_to"
65 66
      @field = "assigned_to_id"
66 67
      @rows = (Setting.issue_group_assignment? ? @project.principals : @project.users).sort
67
      @data = Issue.by_assigned_to(@project)
68
      @data = Issue.by_assigned_to(@project, with_subprojects)
68 69
      @report_title = l(:field_assigned_to)
69 70
    when "author"
70 71
      @field = "author_id"
71 72
      @rows = @project.users.sort
72
      @data = Issue.by_author(@project)
73
      @data = Issue.by_author(@project, with_subprojects)
73 74
      @report_title = l(:field_author)
74 75
    when "subproject"
75 76
      @field = "project_id"
app/models/issue.rb
1464 1464
    end
1465 1465
  end
1466 1466

  
1467
  def self.by_tracker(project)
1468
    count_and_group_by(:project => project, :association => :tracker)
1467
  def self.by_tracker(project, with_subprojects=false)
1468
    count_and_group_by(:project => project, :association => :tracker, :with_subprojects => with_subprojects)
1469 1469
  end
1470 1470

  
1471
  def self.by_version(project)
1472
    count_and_group_by(:project => project, :association => :fixed_version)
1471
  def self.by_version(project, with_subprojects=false)
1472
    count_and_group_by(:project => project, :association => :fixed_version, :with_subprojects => with_subprojects)
1473 1473
  end
1474 1474

  
1475
  def self.by_priority(project)
1476
    count_and_group_by(:project => project, :association => :priority)
1475
  def self.by_priority(project, with_subprojects=false)
1476
    count_and_group_by(:project => project, :association => :priority, :with_subprojects => with_subprojects)
1477 1477
  end
1478 1478

  
1479
  def self.by_category(project)
1480
    count_and_group_by(:project => project, :association => :category)
1479
  def self.by_category(project, with_subprojects=false)
1480
    count_and_group_by(:project => project, :association => :category, :with_subprojects => with_subprojects)
1481 1481
  end
1482 1482

  
1483
  def self.by_assigned_to(project)
1484
    count_and_group_by(:project => project, :association => :assigned_to)
1483
  def self.by_assigned_to(project, with_subprojects=false)
1484
    count_and_group_by(:project => project, :association => :assigned_to, :with_subprojects => with_subprojects)
1485 1485
  end
1486 1486

  
1487
  def self.by_author(project)
1488
    count_and_group_by(:project => project, :association => :author)
1487
  def self.by_author(project, with_subprojects=false)
1488
    count_and_group_by(:project => project, :association => :author, :with_subprojects => with_subprojects)
1489 1489
  end
1490 1490

  
1491 1491
  def self.by_subproject(project)
app/views/reports/_details.html.erb
14 14
<tbody>
15 15
<% for row in rows %>
16 16
<tr>
17
  <td class="name"><%= link_to row.name, aggregate_path(@project, field_name, row) %></td>
17
  <td class="name"><%= link_to row.name, aggregate_path(@project, field_name, row, :subproject_id => nil) %></td>
18 18
  <% for status in @statuses %>
19
    <td><%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, aggregate_path(@project, field_name, row, :status_id => status.id) %></td>
19
    <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>
20 20
  <% end %>
21
  <td><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %></td>
22
  <td><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %></td>
23
  <td><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %></td>
21
  <td><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o", :subproject_id => nil) %></td>
22
  <td><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c", :subproject_id => nil) %></td>
23
  <td><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*", :subproject_id => nil) %></td>
24 24
</tr>
25 25
<% end %>
26 26
</tbody>
app/views/reports/_simple.html.erb
11 11
<tbody>
12 12
<% for row in rows %>
13 13
<tr>
14
  <td class="name"><%= link_to row.name, aggregate_path(@project, field_name, row) %></td>
15
  <td><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o") %></td>
16
  <td><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c") %></td>
17
  <td><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*") %></td>
14
  <td class="name"><%= link_to row.name, aggregate_path(@project, field_name, row, :subproject_id => nil) %></td>
15
  <td><%= aggregate_link data, { field_name => row.id, "closed" => 0 }, aggregate_path(@project, field_name, row, :status_id => "o", :subproject_id => nil) %></td>
16
  <td><%= aggregate_link data, { field_name => row.id, "closed" => 1 }, aggregate_path(@project, field_name, row, :status_id => "c", :subproject_id => nil) %></td>
17
  <td><%= aggregate_link data, { field_name => row.id }, aggregate_path(@project, field_name, row, :status_id => "*", :subproject_id => nil) %></td>
18 18
</tr>
19 19
<% end %>
20 20
</tbody>
test/functional/reports_controller_test.rb
34 34
    assert_response :success
35 35
  end
36 36

  
37
  def test_issue_report_when_displaying_subprojects_issues
38
    Setting.stubs(:display_subprojects_issues?).returns(true)
39
    get :issue_report, :params => {
40
        :id => 1
41
      }
42

  
43
    assert_response :success
44
    # Count subprojects issues
45
    assert_select 'table.list tbody :nth-child(1):first' do
46
      assert_select 'td', :text => 'Bug'
47
      assert_select ':nth-child(2)', :text => '5' # open
48
      assert_select ':nth-child(3)', :text => '3' # closed
49
      assert_select ':nth-child(4)', :text => '8' # total
50
    end
51
  end
52

  
53
  def test_issue_report_when_not_displaying_subprojects_issues
54
    Setting.stubs(:display_subprojects_issues?).returns(false)
55
    get :issue_report, :params => {
56
        :id => 1
57
      }
58

  
59
    assert_response :success
60
    # Do not count subprojects issues
61
    assert_select 'table.list tbody :nth-child(1):first' do
62
      assert_select 'td', :text => 'Bug'
63
      assert_select ':nth-child(2)', :text => '3' # open
64
      assert_select ':nth-child(3)', :text => '3' # closed
65
      assert_select ':nth-child(4)', :text => '6' # total
66
    end
67
  end
68

  
37 69
  def test_get_issue_report_details
38 70
    %w(tracker version priority category assigned_to author subproject).each do |detail|
39 71
      get :issue_report_details, :params => {
......
45 77
  end
46 78

  
47 79
  def test_get_issue_report_details_by_tracker_should_show_only_statuses_used_by_the_project
80
    Setting.stubs(:display_subprojects_issues?).returns(false)
48 81
    WorkflowTransition.delete_all
49 82
    WorkflowTransition.create(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5)
50 83
    WorkflowTransition.create(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4)
......
70 103
    end
71 104
  end
72 105

  
106
  def test_get_issue_report_details_by_tracker_when_displaying_subprojects_issues
107
    Setting.stubs(:display_subprojects_issues?).returns(true)
108
    get :issue_report_details, :params => {
109
        :id => 1,
110
        :detail => 'tracker'
111
      }
112

  
113
    assert_response :success
114
    # Count subprojects issues
115
    assert_select 'table.list tbody :nth-child(1)' do
116
      assert_select 'td', :text => 'Bug'
117
      assert_select ':nth-child(2)', :text => '5' # status:1
118
      assert_select ':nth-child(3)', :text => '-' # status:2
119
      assert_select ':nth-child(4)', :text => '-' # status:3
120
      assert_select ':nth-child(5)', :text => '-' # status:4
121
      assert_select ':nth-child(6)', :text => '3' # status:5
122
      assert_select ':nth-child(7)', :text => '-' # status:6
123
      assert_select ':nth-child(8)', :text => '5' # open
124
      assert_select ':nth-child(9)', :text => '3' # closed
125
      assert_select ':nth-child(10)', :text => '8' # total
126
    end
127
  end
128

  
129
  def test_get_issue_report_details_by_tracker_when_not_displaying_subprojects_issues
130
    Setting.stubs(:display_subprojects_issues?).returns(false)
131
    get :issue_report_details, :params => {
132
      :id => 1,
133
      :detail => 'tracker'
134
    }
135

  
136
    assert_response :success
137
    # Do not count subprojects issues
138
    assert_select 'table.list tbody :nth-child(1)' do
139
      assert_select 'td', :text => 'Bug'
140
      assert_select ':nth-child(2)', :text => '3' # status:1
141
      assert_select ':nth-child(3)', :text => '-' # status:2
142
      assert_select ':nth-child(4)', :text => '-' # status:3
143
      assert_select ':nth-child(5)', :text => '-' # status:4
144
      assert_select ':nth-child(6)', :text => '3' # status:5
145
      assert_select ':nth-child(7)', :text => '-' # status:6
146
      assert_select ':nth-child(8)', :text => '3' # open
147
      assert_select ':nth-child(9)', :text => '3' # closed
148
      assert_select ':nth-child(10)', :text => '6' # total
149
    end
150
  end
151

  
73 152
  def test_get_issue_report_details_by_tracker_should_show_issue_count
74 153
    Issue.delete_all
75 154
    Issue.generate!(:tracker_id => 1)
test/unit/issue_test.rb
2756 2756
  end
2757 2757

  
2758 2758
  test "#by_tracker" do
2759
    User.current = User.anonymous
2759
    User.current = User.find(2)
2760 2760
    groups = Issue.by_tracker(Project.find(1))
2761
    assert_equal 3, groups.count
2761
    groups_containing_subprojects = Issue.by_tracker(Project.find(1), true)
2762 2762
    assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i}
2763
    assert_equal 13, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i}
2763 2764
  end
2764 2765

  
2765 2766
  test "#by_version" do
2766
    User.current = User.anonymous
2767
    groups = Issue.by_version(Project.find(1))
2768
    assert_equal 3, groups.count
2767
    User.current = User.find(2)
2768
    project = Project.find(1)
2769
    Issue.generate!(:project_id => project.descendants.visible.first, :fixed_version_id => project.shared_versions.find_by(:sharing => 'tree').id)
2770

  
2771
    groups = Issue.by_version(project)
2772
    groups_containing_subprojects = Issue.by_version(project, true)
2769 2773
    assert_equal 3, groups.inject(0) {|sum, group| sum + group['total'].to_i}
2774
    assert_equal 4, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i}
2770 2775
  end
2771 2776

  
2772 2777
  test "#by_priority" do
2773
    User.current = User.anonymous
2774
    groups = Issue.by_priority(Project.find(1))
2775
    assert_equal 4, groups.count
2778
    User.current = User.find(2)
2779
    project = Project.find(1)
2780
    groups = Issue.by_priority(project)
2781
    groups_containing_subprojects = Issue.by_priority(project, true)
2776 2782
    assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i}
2783
    assert_equal 13, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i}
2777 2784
  end
2778 2785

  
2779 2786
  test "#by_category" do
2780
    User.current = User.anonymous
2781
    groups = Issue.by_category(Project.find(1))
2782
    assert_equal 2, groups.count
2787
    User.current = User.find(2)
2788
    project = Project.find(1)
2789
    issue_category = IssueCategory.create(:project => project.descendants.visible.first, :name => 'test category')
2790
    Issue.generate!(:project_id => project.descendants.visible.first, :category_id => issue_category.id)
2791

  
2792
    groups = Issue.by_category(project)
2793
    groups_containing_subprojects = Issue.by_category(project, true)
2783 2794
    assert_equal 3, groups.inject(0) {|sum, group| sum + group['total'].to_i}
2795
    assert_equal 4, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i}
2784 2796
  end
2785 2797

  
2786 2798
  test "#by_assigned_to" do
2787
    User.current = User.anonymous
2788
    groups = Issue.by_assigned_to(Project.find(1))
2789
    assert_equal 2, groups.count
2799
    User.current = User.find(2)
2800
    project = Project.find(1)
2801
    Issue.generate!(:project_id => project.descendants.visible.first, :assigned_to => User.current)
2802

  
2803
    groups = Issue.by_assigned_to(project)
2804
    groups_containing_subprojects = Issue.by_assigned_to(project, true)
2790 2805
    assert_equal 2, groups.inject(0) {|sum, group| sum + group['total'].to_i}
2806
    assert_equal 3, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i}
2791 2807
  end
2792 2808

  
2793 2809
  test "#by_author" do
2794
    User.current = User.anonymous
2795
    groups = Issue.by_author(Project.find(1))
2796
    assert_equal 4, groups.count
2810
    User.current = User.find(2)
2811
    project = Project.find(1)
2812
    groups = Issue.by_author(project)
2813
    groups_containing_subprojects = Issue.by_author(project, true)
2797 2814
    assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i}
2815
    assert_equal 13, groups_containing_subprojects.inject(0) {|sum, group| sum + group['total'].to_i}
2798 2816
  end
2799 2817

  
2800 2818
  test "#by_subproject" do
(4-4/4)