Feature #13767 » 13767.patch
| app/controllers/roles_controller.rb | ||
|---|---|---|
| 26 | 26 |
before_action :find_role, :only => [:show, :edit, :update, :destroy] |
| 27 | 27 |
accept_api_auth :index, :show |
| 28 | 28 | |
| 29 |
include RolesHelper |
|
| 30 | ||
| 29 | 31 |
require_sudo_mode :create, :update, :destroy |
| 30 | 32 | |
| 31 | 33 |
def index |
| ... | ... | |
| 109 | 111 |
end |
| 110 | 112 |
@roles = scope.to_a |
| 111 | 113 |
@permissions = Redmine::AccessControl.permissions.select {|p| !p.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_export.csv') |
|
| 118 |
end |
|
| 119 |
end |
|
| 112 | 120 |
end |
| 113 | 121 | |
| 114 | 122 |
def update_permissions |
| app/helpers/roles_helper.rb | ||
|---|---|---|
| 18 | 18 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 19 | 19 | |
| 20 | 20 |
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 {|role| role.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 |
|
| 21 | 48 |
end |
| app/views/roles/permissions.html.erb | ||
|---|---|---|
| 85 | 85 |
<p><%= check_all_links 'permissions_form' %></p> |
| 86 | 86 |
<p><%= submit_tag l(:button_save) %></p> |
| 87 | 87 |
<% end %> |
| 88 |
<% other_formats_links do |f| %> |
|
| 89 |
<%= f.link_to 'CSV' %> |
|
| 90 |
<% end %> |
|
| test/functional/roles_controller_test.rb | ||
|---|---|---|
| 22 | 22 |
class RolesControllerTest < Redmine::ControllerTest |
| 23 | 23 |
fixtures :roles, :users, :members, :member_roles, :workflows, :trackers |
| 24 | 24 | |
| 25 |
include Redmine::I18n |
|
| 26 | ||
| 25 | 27 |
def setup |
| 26 | 28 |
User.current = nil |
| 27 | 29 |
@request.session[:user_id] = 1 # admin |
| ... | ... | |
| 270 | 272 |
assert_select 'input[name=?][type=checkbox][value=delete_issues]:not([checked])', 'permissions[3][]' |
| 271 | 273 |
end |
| 272 | 274 | |
| 275 |
def test_permissions_csv_export |
|
| 276 |
Role.all do |r| |
|
| 277 |
r.permissions=[] |
|
| 278 |
r.save! |
|
| 279 |
end |
|
| 280 |
['Manager', 'Developer'].each do |name| |
|
| 281 |
role = Role.find_by(:name => name) |
|
| 282 |
role.permissions = [:edit_issue_notes] |
|
| 283 |
role.save! |
|
| 284 |
end |
|
| 285 | ||
| 286 |
get( |
|
| 287 |
:permissions, |
|
| 288 |
:params => {
|
|
| 289 |
:format => 'csv' |
|
| 290 |
} |
|
| 291 |
) |
|
| 292 |
assert_response :success |
|
| 293 | ||
| 294 |
assert_equal 'text/csv', @response.media_type |
|
| 295 |
lines = @response.body.chomp.split("\n")
|
|
| 296 |
# Number of lines |
|
| 297 |
permissions = Redmine::AccessControl.permissions - Redmine::AccessControl.public_permissions |
|
| 298 |
assert_equal permissions.size + 1, lines.size |
|
| 299 |
# Headers |
|
| 300 |
headers = 'Module,Permissions,' + Role.sorted.pluck(:name).join(',')
|
|
| 301 |
assert_equal headers, lines.first |
|
| 302 |
# Order of permissions |
|
| 303 |
permissions = permissions.group_by{|p| p.project_module.to_s}.sort.collect(&:last).flatten
|
|
| 304 |
module_permission_names = permissions.collect do |p| |
|
| 305 |
[ |
|
| 306 |
l_or_humanize(p.project_module.to_s, :prefix => 'project_module_').presence || '""', |
|
| 307 |
l_or_humanize(p.name, :prefix => 'permission_'), |
|
| 308 |
] |
|
| 309 |
end |
|
| 310 |
assert_equal module_permission_names, (lines[1..-1].collect {|l| l.split(',')[0..1]})
|
|
| 311 |
# Permissions of Edit notes |
|
| 312 |
perm_edit_notes = lines.find {|l| l.start_with?('Issue tracking,Edit notes,')}
|
|
| 313 |
assert_equal 'Issue tracking,Edit notes,Yes,Yes,No,No,""', perm_edit_notes |
|
| 314 |
end |
|
| 315 | ||
| 273 | 316 |
def test_update_permissions |
| 274 | 317 |
post( |
| 275 | 318 |
:update_permissions, |