Commit 77ffeee2c26eb6a8c1c89bb81d112466a44498ea

Authored by André Guedes
Committed by André Guedes
1 parent 12d04695

Added custom roles management for organizations

Signed-off-by: Hebert Douglas <hebertdougl@gmail.com>
Signed-off-by: Filipe Ribeiro <firibeiro77@live.com>
Signed-off-by: André Bernardes <andrebsguedes@gmail.com>
app/controllers/admin/role_controller.rb
... ... @@ -2,7 +2,7 @@ class RoleController &lt; AdminController
2 2 protect 'manage_environment_roles', :environment
3 3  
4 4 def index
5   - @roles = environment.roles.find(:all)
  5 + @roles = environment.roles.find(:all, :conditions => {:profile_id => nil})
6 6 end
7 7  
8 8 def new
... ...
app/controllers/my_profile/profile_members_controller.rb
... ... @@ -58,6 +58,7 @@ class ProfileMembersController &lt; MyProfileController
58 58  
59 59 def change_role
60 60 @roles = Profile::Roles.organization_member_roles(environment.id)
  61 + @custom_roles = Profile::Roles.organization_custom_roles(environment.id, profile.id)
61 62 begin
62 63 @member = profile.members.find(params[:id])
63 64 rescue ActiveRecord::RecordNotFound
... ...
app/controllers/my_profile/profile_roles_controller.rb 0 → 100644
... ... @@ -0,0 +1,65 @@
  1 +class ProfileRolesController < MyProfileController
  2 +
  3 + include RoleHelper
  4 +
  5 + def index
  6 + @roles = environment.roles.find(:all, :conditions => {:profile_id => profile.id} )
  7 + end
  8 +
  9 + def new
  10 + @role = Role.new
  11 + end
  12 +
  13 + def create
  14 + @role = Role.create({:name => params[:role][:name], :permissions => params[:role][:permissions], :profile_id => profile.id, :environment => environment }, :without_protection => true)
  15 + if @role.save
  16 + redirect_to :action => 'show', :id => @role
  17 + else
  18 + session[:notice] = _('Failed to create role')
  19 + render :action => 'new'
  20 + end
  21 + end
  22 +
  23 + def show
  24 + @role = environment.roles.find(params[:id])
  25 + end
  26 +
  27 + def edit
  28 + @role = environment.roles.find(params[:id])
  29 + end
  30 +
  31 + def destroy
  32 + @role = environment.roles.find(params[:id])
  33 + @members = profile.members_by_role(@role)
  34 + @roles_list = Profile::Roles.organization_all_roles(environment.id, profile.id)
  35 + @roles_list.delete(@role)
  36 + end
  37 +
  38 + def remove
  39 + @role = environment.roles.find(params[:id])
  40 + @members = profile.members_by_role(@role)
  41 + new_roles = params[:roles] ? environment.roles.find(params[:roles].select{|r|!r.to_i.zero?}) : []
  42 + @members.each do |person|
  43 + member_roles = person.find_roles(profile).map(&:role) + new_roles
  44 + person.define_roles(member_roles, profile)
  45 + end
  46 + if @role.destroy
  47 + session[:notice] = _('Role successfuly removed!')
  48 + else
  49 + session[:notice] = _('Failed to remove role!')
  50 + end
  51 + redirect_to :action => 'index'
  52 + end
  53 +
  54 + def update
  55 + @role = environment.roles.find(params[:id])
  56 + if @role.update_attributes(params[:role])
  57 + redirect_to :action => 'show', :id => @role
  58 + else
  59 + session[:notice] = _('Failed to edit role')
  60 + render :action => 'edit'
  61 + end
  62 + end
  63 +
  64 +
  65 +end
... ...
app/models/organization.rb
... ... @@ -29,6 +29,8 @@ class Organization &lt; Profile
29 29  
30 30 has_many :mailings, :class_name => 'OrganizationMailing', :foreign_key => :source_id, :as => 'source'
31 31  
  32 + has_many :custom_roles, :class_name => 'Role', :foreign_key => :profile_id
  33 +
32 34 scope :more_popular, :order => 'members_count DESC'
33 35  
34 36 validate :presence_of_required_fieds, :unless => :is_template
... ...
app/models/profile.rb
... ... @@ -43,10 +43,16 @@ class Profile &lt; ActiveRecord::Base
43 43 find_role('editor', env_id)
44 44 end
45 45 def self.organization_member_roles(env_id)
46   - all_roles(env_id).select{ |r| r.key.match(/^profile_/) unless r.key.blank? }
  46 + all_roles(env_id, nil).select{ |r| r.key.match(/^profile_/) unless r.key.blank? }
47 47 end
48   - def self.all_roles(env_id)
49   - Role.all :conditions => { :environment_id => env_id }
  48 + def self.organization_custom_roles(env_id, profile_id)
  49 + all_roles(env_id, profile_id).select{ |r| r.key.match(/^profile_/) unless r.key.blank? }
  50 + end
  51 + def self.organization_all_roles(env_id, profile_id)
  52 + self.organization_member_roles(env_id) + self.organization_custom_roles(env_id, profile_id)
  53 + end
  54 + def self.all_roles(env_id, profile_id)
  55 + Role.all :conditions => { :profile_id => profile_id, :environment_id => env_id }
50 56 end
51 57 def self.method_missing(m, *args, &block)
52 58 role = find_role(m, args[0])
... ...
app/views/profile_editor/index.html.erb
... ... @@ -28,6 +28,8 @@
28 28  
29 29 <%= control_panel_button(_('Manage Content'), 'cms', :controller => 'cms') %>
30 30  
  31 + <%= control_panel_button(_('Manage Roles'), 'roles', :controller => 'profile_roles') %>
  32 +
31 33 <% unless profile.enterprise? %>
32 34 <%= case profile.blogs.count
33 35 when 0
... ...
app/views/profile_members/change_role.html.erb
1 1 <h3> <%= _('Changing role of %s') % @member.name %> </h3>
2 2  
3 3 <%= labelled_form_for :member, :url => {:action => 'update_roles'} do |f| %>
4   -
5   - <%= _('Roles:') %> <br>
  4 +
  5 + <h4><%= _('Roles:') %></h4>
6 6 <% @roles.each do |r| %>
7 7 <%= labelled_check_box(r.name, 'roles[]', r.id, @associations.map(&:role).include?(r) ) %><br/>
8 8 <ul class="role-permissions">
... ... @@ -11,6 +11,17 @@
11 11 <% end %>
12 12 </ul>
13 13 <% end %>
  14 + <% unless @custom_roles.empty? %>
  15 + <h4><%= _('Custom Roles:') %></h4>
  16 + <% @custom_roles.each do |r| %>
  17 + <%= labelled_check_box(r.name, 'roles[]', r.id, @associations.map(&:role).include?(r) ) %><br/>
  18 + <ul class="role-permissions">
  19 + <% r.permissions.each do |p| %>
  20 + <li> <%= permission_name(p) %> </li>
  21 + <% end %>
  22 + </ul>
  23 + <% end %>
  24 + <% end %>
14 25 <%= hidden_field_tag 'person', @member.id %>
15 26  
16 27 <% button_bar do %>
... ...
app/views/profile_roles/_form.html.erb 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +<%= error_messages_for :role %>
  2 +
  3 +<%= labelled_form_for :role, :url => (mode == :edit) ? {:action => 'update', :id => role} : {:action => 'create'} do |f| %>
  4 +
  5 + <%= required_fields_message %>
  6 +
  7 + <%= required f.text_field(:name) %>
  8 +
  9 + <% permissions.each do |key| %>
  10 + <div class="permissions <%= key.downcase %>">
  11 + <h4><%= _('%s Permissions:' % key) %></h4>
  12 + <% ActiveRecord::Base::PERMISSIONS[key].keys.each do |p| %>
  13 + <%= check_box_tag("role[permissions][]", p, role.has_permission?(p), { :id => p }) %>
  14 + <%= content_tag(:label, permission_name(p), { :for => p }) %><br/>
  15 + <% end %>
  16 + </div>
  17 + <% end %>
  18 +
  19 + <% button_bar do %>
  20 + <%= submit_button('save', (mode == :edit) ? _('Save changes') : _('Create role'), :cancel => {:action => 'index'} ) %>
  21 + <% end %>
  22 +<% end %>
... ...
app/views/profile_roles/destroy.html.erb 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +<h2> <%= _("Deleting #{@role.name}") %> </h2>
  2 +
  3 +<% if @members.nil? || @members.empty? %>
  4 + <p><%= _('This role is not being currently used.')%></p>
  5 + <p><%= _('Are you sure you want to delete this role?') %></p>
  6 +
  7 + <% button_bar do %>
  8 + <%= button(:remove, _('Yes, I am sure'), {:action => 'remove', :id => @role.id}, :method => :post) %>
  9 + <%= button(:cancel, _('No, I gave up'), {:action => 'index'}) %>
  10 + <% end %>
  11 +<% else %>
  12 + <p><%= _('There are members currently using this role.')%></p>
  13 + <p><%= _('To which role do you want to change them?') %></p>
  14 + <%= labelled_form_for :role, :url => { :action => 'remove', :id => @role.id } do |f| %>
  15 + <% @roles_list.each do |role| %>
  16 + <%= check_box_tag("roles[]", role.id, false ,{:id => role.key}) %>
  17 + <%= content_tag(:label, role.name, { :for => role.key }) %><br/>
  18 + <% end %>
  19 + <% button_bar do %>
  20 + <%= submit_button('save',_('Delete role'), :cancel => {:action => 'index'} ) %>
  21 + <% end %>
  22 + <% end %>
  23 +<% end %>
... ...
app/views/profile_roles/edit.html.erb 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +<h2> <%= _("Editing #{@role.name}") %> </h2>
  2 +
  3 +<%= render :partial => 'form', :locals => { :mode => :edit, :role => @role, :permissions => [@role.kind] } %>
... ...
app/views/profile_roles/index.html.erb 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +<h1><%= _('Manage user roles') %></h1>
  2 +
  3 +<table>
  4 + <tr>
  5 + <th><%= _('Role') %></th>
  6 + <th><%= _('Actions') %></th>
  7 + </tr>
  8 + <% @roles.each do |role| %>
  9 + <tr>
  10 + <td>
  11 + <%= link_to role.name, :action => 'show', :id => role %>
  12 + </td>
  13 + <td>
  14 + <%= button_without_text :edit, _('Edit'), :action => 'edit', :id => role %>
  15 + <%= button_without_text :delete, _('Delete'), :action => 'destroy', :id => role %>
  16 + </td>
  17 + </tr>
  18 + <% end %>
  19 +</table>
  20 +
  21 +<% button_bar do %>
  22 + <%= button :add, _('Create a new role'), :action => 'new' %>
  23 + <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
  24 +<% end %>
... ...
app/views/profile_roles/new.html.erb 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +<h2> <%= _("Create a new role") %> </h2>
  2 +
  3 +<%= render :partial => 'form', :locals => { :mode => :create, :role => @role, :permissions => ['Profile'] } %>
... ...
app/views/profile_roles/show.html.erb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +<h1> <%= _(@role.name) %></h1>
  2 +
  3 +<h3> <%= _('Permissions') %> </h3>
  4 +<ul>
  5 + <% @role.permissions.each do |p| %>
  6 + <li> <%= permission_name(p) %> </li>
  7 + <% end %>
  8 +</ul>
  9 +
  10 +<% button_bar do %>
  11 + <%= button :edit, _('Edit'), :action => 'edit', :id => @role %>
  12 + <%= button :back, _('Back to roles management'), :action => 'index' %>
  13 +<% end %>
... ...
db/migrate/20150203143051_add_reference_to_role.rb 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +class AddReferenceToRole < ActiveRecord::Migration
  2 + def self.up
  3 + add_column :roles, :profile_id, :integer
  4 + end
  5 + def self.down
  6 + remove_column :roles , :profile_id
  7 + end
  8 +end
... ...
vendor/plugins/access_control/lib/role.rb
... ... @@ -4,6 +4,7 @@ class Role &lt; ActiveRecord::Base
4 4  
5 5 has_many :role_assignments, :dependent => :destroy
6 6 belongs_to :environment
  7 + belongs_to :organization
7 8 serialize :permissions, Array
8 9 validates_presence_of :name
9 10 validates_uniqueness_of :name, :scope => :environment_id
... ...