Skip to content

Commit cf7a401

Browse files
committed
Export permissions report to CSV (#13767).
Patch by David Escala and Yuichi HARADA. git-svn-id: http://svn.redmine.org/redmine/trunk@20778 e93f8b46-1217-0410-a6f0-8f06a7374b81
1 parent 9f73af6 commit cf7a401

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

app/controllers/roles_controller.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class RolesController < ApplicationController
2626
before_action :find_role, :only => [:show, :edit, :update, :destroy]
2727
accept_api_auth :index, :show
2828

29+
include RolesHelper
30+
2931
require_sudo_mode :create, :update, :destroy
3032

3133
def index
@@ -108,7 +110,13 @@ def permissions
108110
scope = scope.where(:id => params[:ids])
109111
end
110112
@roles = scope.to_a
111-
@permissions = Redmine::AccessControl.permissions.select {|p| !p.public?}
113+
@permissions = Redmine::AccessControl.permissions.reject(&:public?)
114+
respond_to do |format|
115+
format.html
116+
format.csv do
117+
send_data(permissions_to_csv(@roles, @permissions), :type => 'text/csv; header=present', :filename => 'permissions.csv')
118+
end
119+
end
112120
end
113121

114122
def update_permissions

app/helpers/roles_helper.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,31 @@
1818
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919

2020
module RolesHelper
21+
include ApplicationHelper
22+
23+
def permissions_to_csv(roles, permissions)
24+
Redmine::Export::CSV.generate do |csv|
25+
# csv header fields
26+
headers = [l(:field_cvs_module), l(:label_permissions)] + roles.collect(&:name)
27+
csv << headers
28+
# csv lines
29+
perms_by_module = permissions.group_by {|p| p.project_module.to_s}
30+
perms_by_module.keys.sort.each do |mod|
31+
perms_by_module[mod].each do |p|
32+
names = [
33+
l_or_humanize(p.project_module.to_s, :prefix => 'project_module_'),
34+
l_or_humanize(p.name, :prefix => 'permission_').to_s,
35+
]
36+
fields = names + roles.collect do |role|
37+
if role.setable_permissions.include?(p)
38+
format_object(role.permissions.include?(p.name), false)
39+
else
40+
''
41+
end
42+
end
43+
csv << fields
44+
end
45+
end
46+
end
47+
end
2148
end

app/views/roles/permissions.html.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,6 @@
8585
<p><%= check_all_links 'permissions_form' %></p>
8686
<p><%= submit_tag l(:button_save) %></p>
8787
<% end %>
88+
<% other_formats_links do |f| %>
89+
<%= f.link_to 'CSV' %>
90+
<% end %>

test/functional/roles_controller_test.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
class RolesControllerTest < Redmine::ControllerTest
2323
fixtures :roles, :users, :members, :member_roles, :workflows, :trackers
2424

25+
include Redmine::I18n
26+
2527
def setup
2628
User.current = nil
2729
@request.session[:user_id] = 1 # admin
@@ -270,6 +272,36 @@ def test_permissions_with_filter
270272
assert_select 'input[name=?][type=checkbox][value=delete_issues]:not([checked])', 'permissions[3][]'
271273
end
272274

275+
def test_permissions_csv_export
276+
get(
277+
:permissions,
278+
:params => {
279+
:format => 'csv'
280+
}
281+
)
282+
assert_response :success
283+
284+
assert_equal 'text/csv', @response.media_type
285+
lines = @response.body.chomp.split("\n")
286+
# Number of lines
287+
permissions = Redmine::AccessControl.permissions - Redmine::AccessControl.public_permissions
288+
permissions = permissions.group_by{|p| p.project_module.to_s}.sort.collect(&:last).flatten
289+
assert_equal permissions.size + 1, lines.size
290+
# Header
291+
assert_equal 'Module,Permissions,Manager,Developer,Reporter,Non member,Anonymous', lines.first
292+
# Details
293+
to_test = {
294+
:add_project => '"",Create project,Yes,No,No,No,""',
295+
:add_issue_notes => 'Issue tracking,Add notes,Yes,Yes,Yes,Yes,Yes',
296+
:manage_wiki => 'Wiki,Manage wiki,Yes,No,No,"",""'
297+
}
298+
to_test.each do |name, expected|
299+
index = permissions.find_index {|p| p.name == name}
300+
assert_not_nil index
301+
assert_equal expected, lines[index + 1]
302+
end
303+
end
304+
273305
def test_update_permissions
274306
post(
275307
:update_permissions,

0 commit comments

Comments
 (0)