Commit b814464f04324033f34b50cecd98f8ea0dfe3b91
1 parent
f3850081
Exists in
master
and in
29 other branches
ActionItem 2287: Create, edit and assign roles
Showing
10 changed files
with
93 additions
and
5 deletions
Show diff stats
app/controllers/admin/role_controller.rb
@@ -5,6 +5,20 @@ class RoleController < AdminController | @@ -5,6 +5,20 @@ class RoleController < AdminController | ||
5 | @roles = environment.roles.find(:all) | 5 | @roles = environment.roles.find(:all) |
6 | end | 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 | def show | 22 | def show |
9 | @role = environment.roles.find(params[:id]) | 23 | @role = environment.roles.find(params[:id]) |
10 | end | 24 | end |
app/models/profile.rb
@@ -20,12 +20,16 @@ class Profile < ActiveRecord::Base | @@ -20,12 +20,16 @@ class Profile < ActiveRecord::Base | ||
20 | find_role('editor', env_id) | 20 | find_role('editor', env_id) |
21 | end | 21 | end |
22 | def self.organization_member_roles(env_id) | 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 | end | 24 | end |
25 | def self.all_roles(env_id) | 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 | end | 32 | end |
28 | - | ||
29 | private | 33 | private |
30 | def self.find_role(name, env_id) | 34 | def self.find_role(name, env_id) |
31 | ::Role.find_by_key_and_environment_id("profile_#{name}", env_id) | 35 | ::Role.find_by_key_and_environment_id("profile_#{name}", env_id) |
app/views/profile_members/change_role.rhtml
@@ -5,6 +5,11 @@ | @@ -5,6 +5,11 @@ | ||
5 | <%= _('Roles:') %> <br> | 5 | <%= _('Roles:') %> <br> |
6 | <% @roles.each do |r| %> | 6 | <% @roles.each do |r| %> |
7 | <%= labelled_check_box(r.name, 'roles[]', r.id, @associations.map(&:role).include?(r) ) %><br/> | 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 | <% end %> | 13 | <% end %> |
9 | <%= hidden_field_tag 'person', @member.id %> | 14 | <%= hidden_field_tag 'person', @member.id %> |
10 | 15 |
app/views/role/_form.rhtml
@@ -6,9 +6,10 @@ | @@ -6,9 +6,10 @@ | ||
6 | 6 | ||
7 | <%= required f.text_field(:name) %> | 7 | <%= required f.text_field(:name) %> |
8 | 8 | ||
9 | - <%= _('Permissions:') %> <br> | 9 | + <p><%= _('Permissions:') %><p> |
10 | <% permissions.keys.each do |p| %> | 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 | <% end %> | 13 | <% end %> |
13 | 14 | ||
14 | <% button_bar do %> | 15 | <% button_bar do %> |
app/views/role/index.rhtml
test/functional/role_controller_test.rb
@@ -59,6 +59,26 @@ class RoleControllerTest < ActionController::TestCase | @@ -59,6 +59,26 @@ class RoleControllerTest < ActionController::TestCase | ||
59 | assert_not_nil session[:notice] | 59 | assert_not_nil session[:notice] |
60 | end | 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 | should 'not crash when editing role with no permissions' do | 82 | should 'not crash when editing role with no permissions' do |
63 | role = Role.create!(:name => 'test_role', :environment => Environment.default) | 83 | role = Role.create!(:name => 'test_role', :environment => Environment.default) |
64 | 84 |
test/unit/profile_test.rb
@@ -1740,6 +1740,30 @@ class ProfileTest < ActiveSupport::TestCase | @@ -1740,6 +1740,30 @@ class ProfileTest < ActiveSupport::TestCase | ||
1740 | assert_includes Profile.communities, child | 1740 | assert_includes Profile.communities, child |
1741 | end | 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 | private | 1767 | private |
1744 | 1768 | ||
1745 | def assert_invalid_identifier(id) | 1769 | def assert_invalid_identifier(id) |
vendor/plugins/access_control/lib/role.rb
@@ -6,6 +6,7 @@ class Role < ActiveRecord::Base | @@ -6,6 +6,7 @@ class Role < ActiveRecord::Base | ||
6 | validates_presence_of :name | 6 | validates_presence_of :name |
7 | validates_uniqueness_of :name, :scope => :environment_id | 7 | validates_uniqueness_of :name, :scope => :environment_id |
8 | validates_uniqueness_of :key, :if => lambda { |role| !role.key.blank? }, :scope => :environment_id | 8 | validates_uniqueness_of :key, :if => lambda { |role| !role.key.blank? }, :scope => :environment_id |
9 | + before_validation_on_create :create_key | ||
9 | 10 | ||
10 | def initialize(*args) | 11 | def initialize(*args) |
11 | super(*args) | 12 | super(*args) |
@@ -54,4 +55,9 @@ class Role < ActiveRecord::Base | @@ -54,4 +55,9 @@ class Role < ActiveRecord::Base | ||
54 | def perms | 55 | def perms |
55 | ActiveRecord::Base::PERMISSIONS | 56 | ActiveRecord::Base::PERMISSIONS |
56 | end | 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 | end | 63 | end |
vendor/plugins/access_control/test/role_test.rb
@@ -107,4 +107,14 @@ class RoleTest < Test::Unit::TestCase | @@ -107,4 +107,14 @@ class RoleTest < Test::Unit::TestCase | ||
107 | assert !RoleAssignment.exists?(ra.id) | 107 | assert !RoleAssignment.exists?(ra.id) |
108 | end | 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 | end | 120 | end |