Commit b814464f04324033f34b50cecd98f8ea0dfe3b91

Authored by Caio Almeida
1 parent f3850081

ActionItem 2287: Create, edit and assign roles

app/controllers/admin/role_controller.rb
... ... @@ -5,6 +5,20 @@ class RoleController < AdminController
5 5 @roles = environment.roles.find(:all)
6 6 end
7 7  
  8 + def new
  9 + @role = Role.new
  10 + end
  11 +
  12 + def create
  13 + @role = Role.new :name => params[:role][:name], :permissions => params[:role][:permissions], :environment => environment
  14 + if @role.save
  15 + redirect_to :action => 'show', :id => @role
  16 + else
  17 + session[:notice] = _('Failed to create role')
  18 + render :action => 'new'
  19 + end
  20 + end
  21 +
8 22 def show
9 23 @role = environment.roles.find(params[:id])
10 24 end
... ...
app/models/profile.rb
... ... @@ -20,12 +20,16 @@ class Profile < ActiveRecord::Base
20 20 find_role('editor', env_id)
21 21 end
22 22 def self.organization_member_roles(env_id)
23   - [admin(env_id), moderator(env_id), member(env_id)]
  23 + all_roles(env_id).select{ |r| r.key.match(/^profile_/) unless r.key.blank? }
24 24 end
25 25 def self.all_roles(env_id)
26   - [admin(env_id), member(env_id), moderator(env_id), owner(env_id), editor(env_id)]
  26 + Role.all :conditions => { :environment_id => env_id }
  27 + end
  28 + def self.method_missing(m, *args, &block)
  29 + role = find_role(m, args[0])
  30 + return role unless role.nil?
  31 + super
27 32 end
28   -
29 33 private
30 34 def self.find_role(name, env_id)
31 35 ::Role.find_by_key_and_environment_id("profile_#{name}", env_id)
... ...
app/views/profile_members/change_role.rhtml
... ... @@ -5,6 +5,11 @@
5 5 <%= _('Roles:') %> <br>
6 6 <% @roles.each do |r| %>
7 7 <%= labelled_check_box(r.name, 'roles[]', r.id, @associations.map(&:role).include?(r) ) %><br/>
  8 + <ul class="role-permissions">
  9 + <% r.permissions.each do |p| %>
  10 + <li><%= p %></li>
  11 + <% end %>
  12 + </ul>
8 13 <% end %>
9 14 <%= hidden_field_tag 'person', @member.id %>
10 15  
... ...
app/views/role/_form.rhtml
... ... @@ -6,9 +6,10 @@
6 6  
7 7 <%= required f.text_field(:name) %>
8 8  
9   - <%= _('Permissions:') %> <br>
  9 + <p><%= _('Permissions:') %><p>
10 10 <% permissions.keys.each do |p| %>
11   - <%= labelled_check_box(permission_name(p), "role[permissions][]", p, role.has_permission?(p)) %> <br/>
  11 + <%= check_box_tag("role[permissions][]", p, role.has_permission?(p), { :id => p }) %>
  12 + <%= content_tag(:label, permission_name(p), { :for => p }) %><br/>
12 13 <% end %>
13 14  
14 15 <% button_bar do %>
... ...
app/views/role/index.rhtml
... ... @@ -19,4 +19,5 @@
19 19  
20 20 <% button_bar do %>
21 21 <%= button :back, _('Back'), :controller => 'admin_panel' %>
  22 + <%= button :add, _('New'), :action => 'new' %>
22 23 <% end %>
... ...
app/views/role/new.rhtml 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +<h2> <%= _("Create a new role") %> </h2>
  2 +
  3 +<%= render :partial => 'form', :locals => { :mode => :create, :role => @role, :permissions => ActiveRecord::Base::PERMISSIONS[@role.kind] } %>
... ...
test/functional/role_controller_test.rb
... ... @@ -59,6 +59,26 @@ class RoleControllerTest &lt; ActionController::TestCase
59 59 assert_not_nil session[:notice]
60 60 end
61 61  
  62 + def test_should_see_new_role_page
  63 + get 'new'
  64 + assert_response :success
  65 + assert_not_nil assigns(:role)
  66 + end
  67 +
  68 + def test_should_create_new_role
  69 + assert_difference Role, :count do
  70 + post 'create', :role => { :name => 'Test Role', :permissions => ["test"] }
  71 + end
  72 + assert_redirected_to :action => 'show', :id => Role.last.id
  73 + end
  74 +
  75 + def test_should_not_create_new_role
  76 + assert_no_difference Role, :count do
  77 + post 'create', :role => { }
  78 + end
  79 + assert_template :new
  80 + end
  81 +
62 82 should 'not crash when editing role with no permissions' do
63 83 role = Role.create!(:name => 'test_role', :environment => Environment.default)
64 84  
... ...
test/unit/profile_test.rb
... ... @@ -1740,6 +1740,30 @@ class ProfileTest &lt; ActiveSupport::TestCase
1740 1740 assert_includes Profile.communities, child
1741 1741 end
1742 1742  
  1743 + should 'get organization roles' do
  1744 + env = fast_create(Environment)
  1745 + roles = %w(foo bar profile_foo profile_bar).map{ |r| Role.create!(:name => r, :key => r, :environment_id => env.id, :permissions => ["some"]) }
  1746 + Role.create! :name => 'test', :key => 'profile_test', :environment_id => env.id + 1
  1747 + Profile::Roles.expects(:all_roles).returns(roles)
  1748 + assert_equal roles[2..3], Profile::Roles.organization_member_roles(env.id)
  1749 + end
  1750 +
  1751 + should 'get all roles' do
  1752 + env = fast_create(Environment)
  1753 + roles = %w(foo bar profile_foo profile_bar).map{ |r| Role.create!(:name => r, :environment_id => env.id, :permissions => ["some"]) }
  1754 + Role.create! :name => 'test', :environment_id => env.id + 1
  1755 + assert_equal roles, Profile::Roles.all_roles(env.id)
  1756 + end
  1757 +
  1758 + should 'define method for role' do
  1759 + env = fast_create(Environment)
  1760 + r = Role.create! :name => 'Test Role', :environment_id => env.id
  1761 + assert_equal r, Profile::Roles.test_role(env.id)
  1762 + assert_raise NoMethodError do
  1763 + Profile::Roles.invalid_role(env.id)
  1764 + end
  1765 + end
  1766 +
1743 1767 private
1744 1768  
1745 1769 def assert_invalid_identifier(id)
... ...
vendor/plugins/access_control/lib/role.rb
... ... @@ -6,6 +6,7 @@ class Role &lt; ActiveRecord::Base
6 6 validates_presence_of :name
7 7 validates_uniqueness_of :name, :scope => :environment_id
8 8 validates_uniqueness_of :key, :if => lambda { |role| !role.key.blank? }, :scope => :environment_id
  9 + before_validation_on_create :create_key
9 10  
10 11 def initialize(*args)
11 12 super(*args)
... ... @@ -54,4 +55,9 @@ class Role &lt; ActiveRecord::Base
54 55 def perms
55 56 ActiveRecord::Base::PERMISSIONS
56 57 end
  58 +
  59 + private
  60 + def create_key
  61 + self.key = 'profile_' + self.name.gsub(' ', '_').gsub(/[^a-zA-Z0-9_]/, '').downcase if self.key.blank? && !self.name.blank?
  62 + end
57 63 end
... ...
vendor/plugins/access_control/test/role_test.rb
... ... @@ -107,4 +107,14 @@ class RoleTest &lt; Test::Unit::TestCase
107 107 assert !RoleAssignment.exists?(ra.id)
108 108 end
109 109  
  110 + def test_should_define_key_for_role_if_key_not_present
  111 + r = Role.create! :name => 'Test Role'
  112 + assert_equal 'profile_test_role', r.key
  113 + end
  114 +
  115 + def test_should_not_define_key_for_role_if_key_present
  116 + r = Role.create! :name => 'Test Role', :key => 'foo'
  117 + assert_equal 'foo', r.key
  118 + end
  119 +
110 120 end
... ...