From: Jean-Philippe Lang Date: Mon, 3 Sep 2012 17:04:28 +0000 (+0000) Subject: Create role by copy (#9258). X-Git-Tag: 2.1.0~74 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ca7498c2d6cc31176690b597dba10f7c853a8b57;p=redmine.git Create role by copy (#9258). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10285 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/controllers/roles_controller.rb b/app/controllers/roles_controller.rb index 790eb28d4..5f3885267 100644 --- a/app/controllers/roles_controller.rb +++ b/app/controllers/roles_controller.rb @@ -36,8 +36,11 @@ class RolesController < ApplicationController end def new - # Prefills the form with 'Non member' role permissions + # Prefills the form with 'Non member' role permissions by default @role = Role.new(params[:role] || {:permissions => Role.non_member.permissions}) + if params[:copy].present? && @copy_from = Role.find_by_id(params[:copy]) + @role.copy_from(@copy_from) + end @roles = Role.sorted.all end diff --git a/app/models/role.rb b/app/models/role.rb index 412e5a63c..5fd437648 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -67,6 +67,15 @@ class Role < ActiveRecord::Base :in => ISSUES_VISIBILITY_OPTIONS.collect(&:first), :if => lambda {|role| role.respond_to?(:issues_visibility)} + # Copies attributes from another role, arg can be an id or a Role + def copy_from(arg, options={}) + return unless arg.present? + role = arg.is_a?(Role) ? arg : Role.find_by_id(arg.to_s) + self.attributes = role.attributes.dup.except("id", "name", "position", "builtin", "permissions") + self.permissions = role.permissions.dup + self + end + def permissions=(perms) perms = perms.collect {|p| p.to_sym unless p.blank? }.compact.uniq if perms write_attribute(:permissions, perms) diff --git a/app/views/roles/_form.html.erb b/app/views/roles/_form.html.erb index 45f8b0d86..8ae0a604f 100644 --- a/app/views/roles/_form.html.erb +++ b/app/views/roles/_form.html.erb @@ -8,7 +8,7 @@

<%= f.select :issues_visibility, Role::ISSUES_VISIBILITY_OPTIONS.collect {|v| [l(v.last), v.first]} %>

<% if @role.new_record? && @roles.any? %>

-<%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@roles, :id, :name)) %>

+<%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@roles, :id, :name, params[:copy_workflow_from] || @copy_from.try(:id))) %>

<% end %> diff --git a/app/views/roles/index.html.erb b/app/views/roles/index.html.erb index 4a09cdfdd..5326c5638 100644 --- a/app/views/roles/index.html.erb +++ b/app/views/roles/index.html.erb @@ -21,6 +21,7 @@ <% end %> + <%= link_to l(:button_copy), new_role_path(:copy => role), :class => 'icon icon-copy' %> <%= delete_link role_path(role) unless role.builtin? %> diff --git a/test/functional/roles_controller_test.rb b/test/functional/roles_controller_test.rb index 327fad512..868c987a6 100644 --- a/test/functional/roles_controller_test.rb +++ b/test/functional/roles_controller_test.rb @@ -46,6 +46,31 @@ class RolesControllerTest < ActionController::TestCase assert_template 'new' end + def test_new_with_copy + copy_from = Role.find(2) + + get :new, :copy => copy_from.id.to_s + assert_response :success + assert_template 'new' + + role = assigns(:role) + assert_equal copy_from.permissions, role.permissions + + assert_select 'form' do + # blank name + assert_select 'input[name=?][value=]', 'role[name]' + # edit_project permission checked + assert_select 'input[type=checkbox][name=?][value=edit_project][checked=checked]', 'role[permissions][]' + # add_project permission not checked + assert_select 'input[type=checkbox][name=?][value=add_project]', 'role[permissions][]' + assert_select 'input[type=checkbox][name=?][value=add_project][checked=checked]', 'role[permissions][]', 0 + # workflow copy selected + assert_select 'select[name=?]', 'copy_workflow_from' do + assert_select 'option[value=2][selected=selected]' + end + end + end + def test_create_with_validaton_failure post :create, :role => {:name => '', :permissions => ['add_issues', 'edit_issues', 'log_time', ''], diff --git a/test/unit/role_test.rb b/test/unit/role_test.rb index e61280fc9..e93d76c84 100644 --- a/test/unit/role_test.rb +++ b/test/unit/role_test.rb @@ -33,6 +33,18 @@ class RoleTest < ActiveSupport::TestCase assert_equal Role.all.reject(&:builtin?).sort, Role.builtin(false).all.sort end + def test_copy_from + role = Role.find(1) + copy = Role.new.copy_from(role) + + assert_nil copy.id + assert_equal '', copy.name + assert_equal role.permissions, copy.permissions + + copy.name = 'Copy' + assert copy.save + end + def test_copy_workflows source = Role.find(1) assert_equal 90, source.workflow_rules.size