Feature #2595 » 2595-without-tests.patch
app/controllers/reports_controller.rb | ||
---|---|---|
17 | 17 | |
18 | 18 |
class ReportsController < ApplicationController |
19 | 19 |
menu_item :issues |
20 |
before_action :find_project, :authorize, :find_issue_statuses |
|
20 |
before_action :find_project, :authorize, :if => proc { params[:id].present? } |
|
21 |
before_action :find_issue_statuses |
|
21 | 22 | |
22 | 23 |
def issue_report |
23 |
@trackers = @project.rolled_up_trackers(false).visible |
|
24 |
@versions = @project.shared_versions.sort |
|
25 |
@priorities = IssuePriority.all.reverse |
|
26 |
@categories = @project.issue_categories |
|
27 |
@assignees = (Setting.issue_group_assignment? ? @project.principals : @project.users).sort |
|
28 |
@authors = @project.users.sort |
|
29 |
@subprojects = @project.descendants.visible |
|
24 |
if @project |
|
25 |
@trackers = @project.rolled_up_trackers(false).visible |
|
26 |
@versions = @project.shared_versions.sort |
|
27 |
@priorities = IssuePriority.all.reverse |
|
28 |
@categories = @project.issue_categories |
|
29 |
@assignees = (Setting.issue_group_assignment? ? @project.principals : @project.users).sort |
|
30 |
@authors = @project.users.sort |
|
31 |
@subprojects = @project.descendants.visible |
|
32 | ||
33 |
@issues_by_subproject = Issue.by_subproject(@project) || [] |
|
34 |
else |
|
35 |
@trackers = Tracker.visible.sorted |
|
36 |
@versions = [] |
|
37 |
@priorities = IssuePriority.all.reverse |
|
38 |
@categories = [] |
|
39 |
@assignees = (Setting.issue_group_assignment? ? Principal.active : User.active).sort |
|
40 |
@authors = User.active.sort |
|
41 |
@projects = Project.visible.sorted |
|
42 | ||
43 |
@issues_by_project = Issue.count_and_group_by(:association => :project) |
|
44 |
end |
|
45 | ||
30 | 46 |
with_subprojects = Setting.display_subprojects_issues? |
31 | 47 |
@issues_by_tracker = Issue.by_tracker(@project, with_subprojects) |
32 | 48 |
@issues_by_version = Issue.by_version(@project, with_subprojects) |
... | ... | |
34 | 50 |
@issues_by_category = Issue.by_category(@project, with_subprojects) |
35 | 51 |
@issues_by_assigned_to = Issue.by_assigned_to(@project, with_subprojects) |
36 | 52 |
@issues_by_author = Issue.by_author(@project, with_subprojects) |
37 |
@issues_by_subproject = Issue.by_subproject(@project) || [] |
|
38 | 53 | |
39 | 54 |
render :template => "reports/issue_report" |
40 | 55 |
end |
... | ... | |
44 | 59 |
case params[:detail] |
45 | 60 |
when "tracker" |
46 | 61 |
@field = "tracker_id" |
47 |
@rows = @project.rolled_up_trackers(false).visible
|
|
62 |
@rows = @project ? @project.rolled_up_trackers(false).visible : Tracker.visible.sorted
|
|
48 | 63 |
@data = Issue.by_tracker(@project, with_subprojects) |
49 | 64 |
@report_title = l(:field_tracker) |
50 | 65 |
when "version" |
66 |
(render_404; return) unless @project.present? |
|
51 | 67 |
@field = "fixed_version_id" |
52 | 68 |
@rows = @project.shared_versions.sort |
53 | 69 |
@data = Issue.by_version(@project, with_subprojects) |
... | ... | |
58 | 74 |
@data = Issue.by_priority(@project, with_subprojects) |
59 | 75 |
@report_title = l(:field_priority) |
60 | 76 |
when "category" |
77 |
(render_404; return) unless @project.present? |
|
61 | 78 |
@field = "category_id" |
62 | 79 |
@rows = @project.issue_categories |
63 | 80 |
@data = Issue.by_category(@project, with_subprojects) |
64 | 81 |
@report_title = l(:field_category) |
65 | 82 |
when "assigned_to" |
66 | 83 |
@field = "assigned_to_id" |
67 |
@rows = (Setting.issue_group_assignment? ? @project.principals : @project.users).sort |
|
84 |
@rows = @project ? (Setting.issue_group_assignment? ? @project.principals : @project.users).sort : |
|
85 |
(Setting.issue_group_assignment? ? Principal.active : User.active).sort |
|
68 | 86 |
@data = Issue.by_assigned_to(@project, with_subprojects) |
69 | 87 |
@report_title = l(:field_assigned_to) |
70 | 88 |
when "author" |
71 | 89 |
@field = "author_id" |
72 |
@rows = @project.users.sort
|
|
90 |
@rows = @project ? @project.users.sort : User.active.sort
|
|
73 | 91 |
@data = Issue.by_author(@project, with_subprojects) |
74 | 92 |
@report_title = l(:field_author) |
75 | 93 |
when "subproject" |
94 |
(render_404; return) unless @project.present? |
|
76 | 95 |
@field = "project_id" |
77 | 96 |
@rows = @project.descendants.visible |
78 | 97 |
@data = Issue.by_subproject(@project) || [] |
79 | 98 |
@report_title = l(:field_subproject) |
99 |
when "project" |
|
100 |
@field = "project_id" |
|
101 |
@rows = Project.visible.sorted |
|
102 |
@data = Issue.count_and_group_by(:association => :project) |
|
103 |
@report_title = l(:field_project) |
|
80 | 104 |
else |
81 | 105 |
render_404 |
82 | 106 |
end |
... | ... | |
85 | 109 |
private |
86 | 110 | |
87 | 111 |
def find_issue_statuses |
88 |
@statuses = @project.rolled_up_statuses.sorted.to_a
|
|
112 |
@statuses = @project ? @project.rolled_up_statuses.sorted.to_a : IssueStatus.sorted.to_a
|
|
89 | 113 |
end |
90 | 114 |
end |
app/helpers/reports_helper.rb | ||
---|---|---|
38 | 38 | |
39 | 39 |
def aggregate_path(project, field, row, options={}) |
40 | 40 |
parameters = {:set_filter => 1, :subproject_id => '!*', field => row.id}.merge(options) |
41 |
project_issues_path(row.is_a?(Project) ? row : project, parameters) |
|
41 |
parameters[:subproject_id] = nil if project |
|
42 |
return project_issues_path(row, parameters) if row.is_a?(Project) |
|
43 |
return project_issues_path(project, parameters) if project.is_a?(Project) |
|
44 |
return issues_path(parameters) |
|
45 |
end |
|
46 | ||
47 |
def report_details_path(project, options) |
|
48 |
if project |
|
49 |
project_issues_report_details_path(project, options) |
|
50 |
else |
|
51 |
issues_report_details_path(options) |
|
52 |
end |
|
42 | 53 |
end |
43 | 54 |
end |
app/models/issue.rb | ||
---|---|---|
1486 | 1486 |
# * with_subprojects - Includes subprojects issues if set to true. |
1487 | 1487 |
# * association - Symbol. Association for grouping. |
1488 | 1488 |
def self.count_and_group_by(options) |
1489 |
visible_conditions = {:project => options[:project], :with_subprojects => options[:with_subprojects]} |
|
1490 |
visible_conditions.delete(:project) if options[:project].nil? |
|
1489 | 1491 |
assoc = reflect_on_association(options[:association]) |
1490 | 1492 |
select_field = assoc.foreign_key |
1491 | 1493 | |
1492 | 1494 |
Issue. |
1493 |
visible(User.current, :project => options[:project], :with_subprojects => options[:with_subprojects]).
|
|
1495 |
visible(User.current, visible_conditions).
|
|
1494 | 1496 |
joins(:status, assoc.name). |
1495 | 1497 |
group(:status_id, :is_closed, select_field). |
1496 | 1498 |
count. |
app/views/issues/_sidebar.html.erb | ||
---|---|---|
2 | 2 | |
3 | 3 |
<ul> |
4 | 4 |
<li><%= link_to l(:label_issue_view_all), _project_issues_path(@project, :set_filter => 1) %></li> |
5 |
<% if @project %> |
|
6 |
<li><%= link_to l(:field_summary), project_issues_report_path(@project) %></li> |
|
7 |
<% end %> |
|
5 |
<li><%= link_to l(:field_summary), @project ? project_issues_report_path(@project) : issues_report_path %></li> |
|
8 | 6 | |
9 | 7 |
<% if User.current.allowed_to?(:import_issues, @project, :global => true) %> |
10 | 8 |
<li><%= link_to l(:button_import), new_issues_import_path %></li> |
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, :subproject_id => nil) %></td>
|
|
17 |
<td class="name"><%= link_to row.name, aggregate_path(@project, field_name, row) %></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, :subproject_id => nil) %></td>
|
|
19 |
<td><%= aggregate_link data, { field_name => row.id, "status_id" => status.id }, aggregate_path(@project, field_name, row, {:status_id => status.id}) %></td>
|
|
20 | 20 |
<% end %> |
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>
|
|
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>
|
|
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, :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>
|
|
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>
|
|
18 | 18 |
</tr> |
19 | 19 |
<% end %> |
20 | 20 |
</tbody> |
app/views/reports/issue_report.html.erb | ||
---|---|---|
4 | 4 |
<h3> |
5 | 5 |
<%=l(:field_tracker)%> |
6 | 6 |
<%= link_to l(:label_details), |
7 |
project_issues_report_details_path(@project, :detail => 'tracker'),
|
|
7 |
report_details_path(@project, :detail => 'tracker'), |
|
8 | 8 |
:class => 'icon-only icon-zoom-in', |
9 | 9 |
:title => l(:label_details) %> |
10 | 10 |
</h3> |
... | ... | |
13 | 13 |
<h3> |
14 | 14 |
<%=l(:field_priority)%> |
15 | 15 |
<%= link_to l(:label_details), |
16 |
project_issues_report_details_path(@project, :detail => 'priority'),
|
|
16 |
report_details_path(@project, :detail => 'priority'), |
|
17 | 17 |
:class => 'icon-only icon-zoom-in', |
18 | 18 |
:title => l(:label_details) %> |
19 | 19 |
</h3> |
... | ... | |
22 | 22 |
<h3> |
23 | 23 |
<%=l(:field_assigned_to)%> |
24 | 24 |
<%= link_to l(:label_details), |
25 |
project_issues_report_details_path(@project, :detail => 'assigned_to'),
|
|
25 |
report_details_path(@project, :detail => 'assigned_to'), |
|
26 | 26 |
:class => 'icon-only icon-zoom-in', |
27 | 27 |
:title => l(:label_details) %> |
28 | 28 |
</h3> |
... | ... | |
31 | 31 |
<h3> |
32 | 32 |
<%=l(:field_author)%> |
33 | 33 |
<%= link_to l(:label_details), |
34 |
project_issues_report_details_path(@project, :detail => 'author'),
|
|
34 |
report_details_path(@project, :detail => 'author'), |
|
35 | 35 |
:class => 'icon-only icon-zoom-in', |
36 | 36 |
:title => l(:label_details) %> |
37 | 37 |
</h3> |
... | ... | |
41 | 41 |
</div> |
42 | 42 | |
43 | 43 |
<div class="splitcontentright"> |
44 |
<% if @issues_by_version.present? && @versions.present? %> |
|
44 | 45 |
<h3> |
45 | 46 |
<%=l(:field_version)%> |
46 | 47 |
<%= link_to l(:label_details), |
47 |
project_issues_report_details_path(@project, :detail => 'version'),
|
|
48 |
report_details_path(@project, :detail => 'version'), |
|
48 | 49 |
:class => 'icon-only icon-zoom-in', |
49 | 50 |
:title => l(:label_details) %> |
50 | 51 |
</h3> |
51 | 52 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_version, :field_name => "fixed_version_id", :rows => @versions } %> |
52 | 53 |
<br /> |
53 |
<% if @project.children.any? %> |
|
54 |
<% end %> |
|
55 |
<% if @project && @project.children.any? %> |
|
54 | 56 |
<h3> |
55 | 57 |
<%=l(:field_subproject)%> |
56 | 58 |
<%= link_to l(:label_details), |
57 |
project_issues_report_details_path(@project, :detail => 'subproject'),
|
|
59 |
report_details_path(@project, :detail => 'subproject'), |
|
58 | 60 |
:class => 'icon-only icon-zoom-in', |
59 | 61 |
:title => l(:label_details) %> |
60 | 62 |
</h3> |
61 | 63 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_subproject, :field_name => "project_id", :rows => @subprojects } %> |
62 | 64 |
<br /> |
63 | 65 |
<% end %> |
66 |
<% if @issues_by_category.present? && @categories.present? %> |
|
64 | 67 |
<h3> |
65 | 68 |
<%=l(:field_category)%> |
66 | 69 |
<%= link_to l(:label_details), |
67 |
project_issues_report_details_path(@project, :detail => 'category'),
|
|
70 |
report_details_path(@project, :detail => 'category'), |
|
68 | 71 |
:class => 'icon-only icon-zoom-in', |
69 | 72 |
:title => l(:label_details) %> |
70 | 73 |
</h3> |
71 | 74 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_category, :field_name => "category_id", :rows => @categories } %> |
72 | 75 |
<br /> |
76 |
<% end %> |
|
77 |
<% if @issues_by_project.present? && @projects.present? %> |
|
78 |
<h3> |
|
79 |
<%=l(:field_project)%> |
|
80 |
<%= link_to l(:label_details), |
|
81 |
report_details_path(@project, :detail => 'project'), |
|
82 |
:class => 'icon-only icon-zoom-in', |
|
83 |
:title => l(:label_details) %> |
|
84 |
</h3> |
|
85 |
<%= render :partial => 'simple', :locals => { :data => @issues_by_project, :field_name => "project_id", :rows => @projects } %> |
|
86 |
<br /> |
|
87 |
<% end %> |
|
73 | 88 |
<%= call_hook(:view_reports_issue_report_split_content_right, :project => @project) %> |
74 | 89 |
</div> |
75 | 90 |
app/views/reports/issue_report_details.html.erb | ||
---|---|---|
3 | 3 |
<h3><%=@report_title%></h3> |
4 | 4 |
<%= render :partial => 'details', :locals => { :data => @data, :field_name => @field, :rows => @rows } %> |
5 | 5 |
<br /> |
6 |
<%= link_to l(:button_back), project_issues_report_path(@project) %>
|
|
6 |
<%= link_to l(:button_back), @project ? project_issues_report_path(@project) : issues_report_path %>
|
|
7 | 7 |
config/routes.rb | ||
---|---|---|
61 | 61 | |
62 | 62 |
get 'projects/:id/issues/report', :to => 'reports#issue_report', :as => 'project_issues_report' |
63 | 63 |
get 'projects/:id/issues/report/:detail', :to => 'reports#issue_report_details', :as => 'project_issues_report_details' |
64 |
get 'issues/report', :to => 'reports#issue_report', :as => 'issues_report' |
|
65 |
get 'issues/report/:detail', :to => 'reports#issue_report_details', :as => 'issues_report_details' |
|
64 | 66 | |
65 | 67 |
get '/issues/imports/new', :to => 'imports#new', :as => 'new_issues_import' |
66 | 68 |
post '/imports', :to => 'imports#create', :as => 'imports' |
- « Previous
- 1
- 2
- 3
- Next »