diff --git a/app/controllers/admin/role_controller.rb b/app/controllers/admin/role_controller.rb
index b4f4fe0..95f8e9f 100644
--- a/app/controllers/admin/role_controller.rb
+++ b/app/controllers/admin/role_controller.rb
@@ -5,6 +5,20 @@ class RoleController < AdminController
@roles = environment.roles.find(:all)
end
+ def new
+ @role = Role.new
+ end
+
+ def create
+ @role = Role.new :name => params[:role][:name], :permissions => params[:role][:permissions], :environment => environment
+ if @role.save
+ redirect_to :action => 'show', :id => @role
+ else
+ session[:notice] = _('Failed to create role')
+ render :action => 'new'
+ end
+ end
+
def show
@role = environment.roles.find(params[:id])
end
diff --git a/app/models/profile.rb b/app/models/profile.rb
index c02cc8c..ac5591d 100644
--- a/app/models/profile.rb
+++ b/app/models/profile.rb
@@ -20,12 +20,16 @@ class Profile < ActiveRecord::Base
find_role('editor', env_id)
end
def self.organization_member_roles(env_id)
- [admin(env_id), moderator(env_id), member(env_id)]
+ all_roles(env_id).select{ |r| r.key.match(/^profile_/) unless r.key.blank? }
end
def self.all_roles(env_id)
- [admin(env_id), member(env_id), moderator(env_id), owner(env_id), editor(env_id)]
+ Role.all :conditions => { :environment_id => env_id }
+ end
+ def self.method_missing(m, *args, &block)
+ role = find_role(m, args[0])
+ return role unless role.nil?
+ super
end
-
private
def self.find_role(name, env_id)
::Role.find_by_key_and_environment_id("profile_#{name}", env_id)
diff --git a/app/views/profile_members/change_role.rhtml b/app/views/profile_members/change_role.rhtml
index 207e172..04c71ec 100644
--- a/app/views/profile_members/change_role.rhtml
+++ b/app/views/profile_members/change_role.rhtml
@@ -5,6 +5,11 @@
<%= _('Roles:') %>
<% @roles.each do |r| %>
<%= labelled_check_box(r.name, 'roles[]', r.id, @associations.map(&:role).include?(r) ) %>
+
+ <% r.permissions.each do |p| %>
+ - <%= p %>
+ <% end %>
+
<% end %>
<%= hidden_field_tag 'person', @member.id %>
diff --git a/app/views/role/_form.rhtml b/app/views/role/_form.rhtml
index 9db5aca..0570578 100644
--- a/app/views/role/_form.rhtml
+++ b/app/views/role/_form.rhtml
@@ -6,9 +6,10 @@
<%= required f.text_field(:name) %>
- <%= _('Permissions:') %>
+ <%= _('Permissions:') %>
<% permissions.keys.each do |p| %>
- <%= labelled_check_box(permission_name(p), "role[permissions][]", p, role.has_permission?(p)) %>
+ <%= check_box_tag("role[permissions][]", p, role.has_permission?(p), { :id => p }) %>
+ <%= content_tag(:label, permission_name(p), { :for => p }) %>
<% end %>
<% button_bar do %>
diff --git a/app/views/role/index.rhtml b/app/views/role/index.rhtml
index a77a5ba..6df2180 100644
--- a/app/views/role/index.rhtml
+++ b/app/views/role/index.rhtml
@@ -19,4 +19,5 @@
<% button_bar do %>
<%= button :back, _('Back'), :controller => 'admin_panel' %>
+ <%= button :add, _('New'), :action => 'new' %>
<% end %>
diff --git a/app/views/role/new.rhtml b/app/views/role/new.rhtml
new file mode 100644
index 0000000..38c32d7
--- /dev/null
+++ b/app/views/role/new.rhtml
@@ -0,0 +1,3 @@
+
<%= _("Create a new role") %>
+
+<%= render :partial => 'form', :locals => { :mode => :create, :role => @role, :permissions => ActiveRecord::Base::PERMISSIONS[@role.kind] } %>
diff --git a/test/functional/role_controller_test.rb b/test/functional/role_controller_test.rb
index 65918f1..61730de 100644
--- a/test/functional/role_controller_test.rb
+++ b/test/functional/role_controller_test.rb
@@ -59,6 +59,26 @@ class RoleControllerTest < ActionController::TestCase
assert_not_nil session[:notice]
end
+ def test_should_see_new_role_page
+ get 'new'
+ assert_response :success
+ assert_not_nil assigns(:role)
+ end
+
+ def test_should_create_new_role
+ assert_difference Role, :count do
+ post 'create', :role => { :name => 'Test Role', :permissions => ["test"] }
+ end
+ assert_redirected_to :action => 'show', :id => Role.last.id
+ end
+
+ def test_should_not_create_new_role
+ assert_no_difference Role, :count do
+ post 'create', :role => { }
+ end
+ assert_template :new
+ end
+
should 'not crash when editing role with no permissions' do
role = Role.create!(:name => 'test_role', :environment => Environment.default)
diff --git a/test/unit/profile_test.rb b/test/unit/profile_test.rb
index 6fda9b2..454aeb4 100644
--- a/test/unit/profile_test.rb
+++ b/test/unit/profile_test.rb
@@ -1740,6 +1740,30 @@ class ProfileTest < ActiveSupport::TestCase
assert_includes Profile.communities, child
end
+ should 'get organization roles' do
+ env = fast_create(Environment)
+ roles = %w(foo bar profile_foo profile_bar).map{ |r| Role.create!(:name => r, :key => r, :environment_id => env.id, :permissions => ["some"]) }
+ Role.create! :name => 'test', :key => 'profile_test', :environment_id => env.id + 1
+ Profile::Roles.expects(:all_roles).returns(roles)
+ assert_equal roles[2..3], Profile::Roles.organization_member_roles(env.id)
+ end
+
+ should 'get all roles' do
+ env = fast_create(Environment)
+ roles = %w(foo bar profile_foo profile_bar).map{ |r| Role.create!(:name => r, :environment_id => env.id, :permissions => ["some"]) }
+ Role.create! :name => 'test', :environment_id => env.id + 1
+ assert_equal roles, Profile::Roles.all_roles(env.id)
+ end
+
+ should 'define method for role' do
+ env = fast_create(Environment)
+ r = Role.create! :name => 'Test Role', :environment_id => env.id
+ assert_equal r, Profile::Roles.test_role(env.id)
+ assert_raise NoMethodError do
+ Profile::Roles.invalid_role(env.id)
+ end
+ end
+
private
def assert_invalid_identifier(id)
diff --git a/vendor/plugins/access_control/lib/role.rb b/vendor/plugins/access_control/lib/role.rb
index b3b9a52..5f114a0 100644
--- a/vendor/plugins/access_control/lib/role.rb
+++ b/vendor/plugins/access_control/lib/role.rb
@@ -6,6 +6,7 @@ class Role < ActiveRecord::Base
validates_presence_of :name
validates_uniqueness_of :name, :scope => :environment_id
validates_uniqueness_of :key, :if => lambda { |role| !role.key.blank? }, :scope => :environment_id
+ before_validation_on_create :create_key
def initialize(*args)
super(*args)
@@ -54,4 +55,9 @@ class Role < ActiveRecord::Base
def perms
ActiveRecord::Base::PERMISSIONS
end
+
+ private
+ def create_key
+ self.key = 'profile_' + self.name.gsub(' ', '_').gsub(/[^a-zA-Z0-9_]/, '').downcase if self.key.blank? && !self.name.blank?
+ end
end
diff --git a/vendor/plugins/access_control/test/role_test.rb b/vendor/plugins/access_control/test/role_test.rb
index a515467..e93803c 100644
--- a/vendor/plugins/access_control/test/role_test.rb
+++ b/vendor/plugins/access_control/test/role_test.rb
@@ -107,4 +107,14 @@ class RoleTest < Test::Unit::TestCase
assert !RoleAssignment.exists?(ra.id)
end
+ def test_should_define_key_for_role_if_key_not_present
+ r = Role.create! :name => 'Test Role'
+ assert_equal 'profile_test_role', r.key
+ end
+
+ def test_should_not_define_key_for_role_if_key_present
+ r = Role.create! :name => 'Test Role', :key => 'foo'
+ assert_equal 'foo', r.key
+ end
+
end
--
libgit2 0.21.2