mirror of
https://github.com/redmine/redmine.git
synced 2025-11-16 02:06:04 +01:00
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
This commit is contained in:
@@ -26,6 +26,8 @@ class RolesController < ApplicationController
|
|||||||
before_action :find_role, :only => [:show, :edit, :update, :destroy]
|
before_action :find_role, :only => [:show, :edit, :update, :destroy]
|
||||||
accept_api_auth :index, :show
|
accept_api_auth :index, :show
|
||||||
|
|
||||||
|
include RolesHelper
|
||||||
|
|
||||||
require_sudo_mode :create, :update, :destroy
|
require_sudo_mode :create, :update, :destroy
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@@ -108,7 +110,13 @@ class RolesController < ApplicationController
|
|||||||
scope = scope.where(:id => params[:ids])
|
scope = scope.where(:id => params[:ids])
|
||||||
end
|
end
|
||||||
@roles = scope.to_a
|
@roles = scope.to_a
|
||||||
@permissions = Redmine::AccessControl.permissions.select {|p| !p.public?}
|
@permissions = Redmine::AccessControl.permissions.reject(&:public?)
|
||||||
|
respond_to do |format|
|
||||||
|
format.html
|
||||||
|
format.csv do
|
||||||
|
send_data(permissions_to_csv(@roles, @permissions), :type => 'text/csv; header=present', :filename => 'permissions.csv')
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_permissions
|
def update_permissions
|
||||||
|
|||||||
@@ -18,4 +18,31 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
module RolesHelper
|
module RolesHelper
|
||||||
|
include ApplicationHelper
|
||||||
|
|
||||||
|
def permissions_to_csv(roles, permissions)
|
||||||
|
Redmine::Export::CSV.generate do |csv|
|
||||||
|
# csv header fields
|
||||||
|
headers = [l(:field_cvs_module), l(:label_permissions)] + roles.collect(&:name)
|
||||||
|
csv << headers
|
||||||
|
# csv lines
|
||||||
|
perms_by_module = permissions.group_by {|p| p.project_module.to_s}
|
||||||
|
perms_by_module.keys.sort.each do |mod|
|
||||||
|
perms_by_module[mod].each do |p|
|
||||||
|
names = [
|
||||||
|
l_or_humanize(p.project_module.to_s, :prefix => 'project_module_'),
|
||||||
|
l_or_humanize(p.name, :prefix => 'permission_').to_s,
|
||||||
|
]
|
||||||
|
fields = names + roles.collect do |role|
|
||||||
|
if role.setable_permissions.include?(p)
|
||||||
|
format_object(role.permissions.include?(p.name), false)
|
||||||
|
else
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
csv << fields
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -85,3 +85,6 @@
|
|||||||
<p><%= check_all_links 'permissions_form' %></p>
|
<p><%= check_all_links 'permissions_form' %></p>
|
||||||
<p><%= submit_tag l(:button_save) %></p>
|
<p><%= submit_tag l(:button_save) %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<% other_formats_links do |f| %>
|
||||||
|
<%= f.link_to 'CSV' %>
|
||||||
|
<% end %>
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ require File.expand_path('../../test_helper', __FILE__)
|
|||||||
class RolesControllerTest < Redmine::ControllerTest
|
class RolesControllerTest < Redmine::ControllerTest
|
||||||
fixtures :roles, :users, :members, :member_roles, :workflows, :trackers
|
fixtures :roles, :users, :members, :member_roles, :workflows, :trackers
|
||||||
|
|
||||||
|
include Redmine::I18n
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
User.current = nil
|
User.current = nil
|
||||||
@request.session[:user_id] = 1 # admin
|
@request.session[:user_id] = 1 # admin
|
||||||
@@ -270,6 +272,36 @@ class RolesControllerTest < Redmine::ControllerTest
|
|||||||
assert_select 'input[name=?][type=checkbox][value=delete_issues]:not([checked])', 'permissions[3][]'
|
assert_select 'input[name=?][type=checkbox][value=delete_issues]:not([checked])', 'permissions[3][]'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_permissions_csv_export
|
||||||
|
get(
|
||||||
|
:permissions,
|
||||||
|
:params => {
|
||||||
|
:format => 'csv'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
assert_response :success
|
||||||
|
|
||||||
|
assert_equal 'text/csv', @response.media_type
|
||||||
|
lines = @response.body.chomp.split("\n")
|
||||||
|
# Number of lines
|
||||||
|
permissions = Redmine::AccessControl.permissions - Redmine::AccessControl.public_permissions
|
||||||
|
permissions = permissions.group_by{|p| p.project_module.to_s}.sort.collect(&:last).flatten
|
||||||
|
assert_equal permissions.size + 1, lines.size
|
||||||
|
# Header
|
||||||
|
assert_equal 'Module,Permissions,Manager,Developer,Reporter,Non member,Anonymous', lines.first
|
||||||
|
# Details
|
||||||
|
to_test = {
|
||||||
|
:add_project => '"",Create project,Yes,No,No,No,""',
|
||||||
|
:add_issue_notes => 'Issue tracking,Add notes,Yes,Yes,Yes,Yes,Yes',
|
||||||
|
:manage_wiki => 'Wiki,Manage wiki,Yes,No,No,"",""'
|
||||||
|
}
|
||||||
|
to_test.each do |name, expected|
|
||||||
|
index = permissions.find_index {|p| p.name == name}
|
||||||
|
assert_not_nil index
|
||||||
|
assert_equal expected, lines[index + 1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_update_permissions
|
def test_update_permissions
|
||||||
post(
|
post(
|
||||||
:update_permissions,
|
:update_permissions,
|
||||||
|
|||||||
Reference in New Issue
Block a user