effective_roles 1.3.1 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1354b2d3e3b153eb52f9b83a4edd7e54f2b43ac2
4
- data.tar.gz: 13b982ccbc08bc3549d5dbd4ea6b0a7263e55a83
3
+ metadata.gz: bc53981f7c579c5ff33a87070f1d0a761c2d7fc2
4
+ data.tar.gz: eb79c31edb80c855541bf78a35eb717b22849af9
5
5
  SHA512:
6
- metadata.gz: 5ebacd48387fc1cfdc7c75e42a18cde5d704332720b24e04ba12cec1ddc539fe961c5ad22eda8fc9910f11aae6b35d210230888671725c612070765bbb865c2a
7
- data.tar.gz: 588b462eb1a33a73bb0a3f6d299cbbc592145415344af265cc944f0934c83e111297128812eab4a30a0321a287f020041cb758e948d7ee5252dc84b104d341e1
6
+ metadata.gz: 5f8bc2e438991c33a6eca9a851763d698f9ee664f21757336137901dac1b52f517f2f7c2f0c99b0cd6dd48c8c5505e08eb7f5b29c23c25e9052d2789a16822b8
7
+ data.tar.gz: 9ed90a7550a6ead52c3a49d43e315fec04e262f8947de555bc7c930128cf00e4f284b2c215c2d6a012c42ced234a6d953a69cd8fd03fa4f3ea0f42e152d1c852
data/README.md CHANGED
@@ -211,6 +211,22 @@ simple_form_for @user do |f|
211
211
  = f.input :roles, :collection => EffectiveRoles.roles_collection(f.object, current_user), :as => :check_boxes
212
212
  ```
213
213
 
214
+ ## Summary table
215
+
216
+ Use the `effective_roles_summary_table` view helper to output a table of the actual permission levels for each role and ActiveRecord object combination.
217
+
218
+ You can customize the helper function with the following keys: roles, only, except, plus and additionally
219
+
220
+ ```ruby
221
+ effective_roles_summary_table(roles: [:admin, :superadmin], only: [Post, Event])
222
+ effective_roles_summary_table(except: [Post, User])
223
+ effective_roles_summary_table(plus: [Reports::PostReport]) # Add a non ActiveRecord object to the output, sorted with the other model names
224
+ effective_roles_summary_table(additionally: [Reports::PostReport]) # Add a non ActiveRecord object to the output, after the other models
225
+ effective_roles_summary_table(plus: {post_report: :export}) # A custom permission based on a symbol
226
+ ```
227
+
228
+ You can override the `effective_roles_authorization_label(klass)` method for better control of the label display.
229
+
214
230
  ## Bitmask Implementation
215
231
 
216
232
  The underlying role information for any acts_as_role_restricted ActiveRecord object is stored in that object's roles_mask field.
@@ -10,4 +10,92 @@ module EffectiveRolesHelper
10
10
 
11
11
  render :partial => 'effective/roles/roles_fields', :locals => opts
12
12
  end
13
+
14
+ # Output a table of permissions for each role based on current permissions
15
+
16
+ # effective_roles_summary_table(roles: [:admin, :superadmin], only: [Post, Event])
17
+ # effective_roles_summary_table(except: [Post, User])
18
+ # effective_roles_summary_table(aditionally: [Report::PostReport, User])
19
+ def effective_roles_summary_table(opts = {})
20
+ roles = Array(opts[:roles]).presence || EffectiveRoles.roles
21
+
22
+ if opts[:only].present?
23
+ klasses = Array(opts[:only])
24
+ render partial: '/effective/roles/summary_table', locals: {klasses: klasses, roles: roles}
25
+ return
26
+ end
27
+
28
+ # Figure out all klasses (ActiveRecord objects)
29
+ tables = ActiveRecord::Base.connection.tables - ['schema_migrations', 'delayed_jobs']
30
+
31
+ klasses = ActiveRecord::Base.descendants.map do |model|
32
+ model if (model.respond_to?(:table_name) && tables.include?(model.table_name))
33
+ end.compact
34
+
35
+ if opts[:except]
36
+ klasses = klasses - Array(opts[:except])
37
+ end
38
+
39
+ if opts[:plus]
40
+ klasses = klasses + Array(opts[:plus])
41
+ end
42
+
43
+ klasses = klasses.sort do |a, b|
44
+ a = a.respond_to?(:name) ? a.name : a.to_s
45
+ b = b.respond_to?(:name) ? b.name : b.to_s
46
+
47
+ a_namespaces = a.split('::')
48
+ b_namespaces = b.split('::')
49
+
50
+ if a_namespaces.length != b_namespaces.length
51
+ a_namespaces.length <=> b_namespaces.length
52
+ else
53
+ a <=> b
54
+ end
55
+ end
56
+
57
+ if opts[:additionally]
58
+ klasses = klasses + Array(opts[:additionally])
59
+ end
60
+
61
+ render partial: '/effective/roles/summary_table', locals: {klasses: klasses, roles: roles}
62
+ end
63
+
64
+ def effective_roles_authorization_badge(level)
65
+ case level
66
+ when :manage
67
+ content_tag(:span, 'Full', class: 'label label-success')
68
+ when :update
69
+ content_tag(:span, 'Edit', class: 'label label-success')
70
+ when :update_own
71
+ content_tag(:span, 'Edit Own', class: 'label label-info')
72
+ when :create
73
+ content_tag(:span, 'Create', class: 'label label-success')
74
+ when :show
75
+ content_tag(:span, 'Read only', class: 'label label-warning')
76
+ when :index
77
+ content_tag(:span, 'Read only', class: 'label label-warning')
78
+ when :destroy
79
+ content_tag(:span, 'Delete only', class: 'label label-warning')
80
+ when :none
81
+ content_tag(:span, 'No Access', class: 'label label-danger')
82
+ when :unknown
83
+ content_tag(:span, 'Unknown', class: 'label')
84
+ else
85
+ content_tag(:span, level.to_s.titleize, class: 'label label-success')
86
+ end
87
+ end
88
+
89
+ def effective_roles_authorization_label(klass)
90
+ klass = klass.keys.first if klass.kind_of?(Hash)
91
+
92
+ label = (klass.respond_to?(:name) ? klass.name : klass.to_s)
93
+
94
+ ['Effective::Datatables::', 'Effective::'].each do |replace|
95
+ label = label.sub(replace, '')
96
+ end
97
+
98
+ label
99
+ end
100
+
13
101
  end
@@ -0,0 +1,12 @@
1
+ %table.table
2
+ %thead
3
+ %th
4
+ - roles.each do |role|
5
+ %th.text-center= role
6
+ %tbody
7
+ - klasses.each do |klass|
8
+ %tr
9
+ %td= effective_roles_authorization_label(klass)
10
+ - roles.each do |role|
11
+ %td.text-center
12
+ = effective_roles_authorization_badge(EffectiveRoles.authorization_level(controller, role, klass))
@@ -8,6 +8,8 @@ module EffectiveRoles
8
8
  mattr_accessor :assignable_roles
9
9
  mattr_accessor :disabled_roles
10
10
 
11
+ mattr_accessor :authorization_method_for_summary_table
12
+
11
13
  def self.setup
12
14
  yield self
13
15
  end
@@ -48,6 +50,63 @@ module EffectiveRoles
48
50
  user.roles.map { |role| assignable[role] }.flatten.compact.uniq
49
51
  end
50
52
 
53
+ # This is used by the effective_roles_summary_table helper method
54
+ def self.authorization_level(controller, role, resource)
55
+ auth_method = authorization_method_for_summary_table
56
+
57
+ return :unknown unless (auth_method.respond_to?(:call) || auth_method.kind_of?(Symbol))
58
+ return :unknown unless (controller.current_user rescue nil).respond_to?(:roles=)
59
+
60
+ controller.instance_variable_set(:@current_ability, nil)
61
+ controller.current_user.roles = [role]
62
+ resource = (resource.new() rescue resource)
63
+
64
+ # Custom actions
65
+ if resource.kind_of?(Hash)
66
+ resource.each do |key, value|
67
+ return value if (controller.instance_exec(controller, value, key, &auth_method) rescue false)
68
+ end
69
+ end
70
+
71
+ # Check for Manage
72
+ return :manage if (
73
+ (controller.instance_exec(controller, :create, resource, &auth_method) rescue false) &&
74
+ (controller.instance_exec(controller, :update, resource, &auth_method) rescue false) &&
75
+ (controller.instance_exec(controller, :show, resource, &auth_method) rescue false) &&
76
+ (controller.instance_exec(controller, :destroy, resource, &auth_method) rescue false)
77
+ )
78
+
79
+ # Check for Update
80
+ return :update if (controller.instance_exec(controller, :update, resource, &auth_method) rescue false)
81
+
82
+ # Check for Update Own
83
+ if resource.respond_to?('user=')
84
+ resource.user = controller.current_user
85
+ return :update_own if (controller.instance_exec(controller, :update, resource, &auth_method) rescue false)
86
+ resource.user = nil
87
+ elsif resource.respond_to?('user_id=')
88
+ resource.user_id = controller.current_user.id
89
+ return :update_own if (controller.instance_exec(controller, :update, resource, &auth_method) rescue false)
90
+ resource.user_id = nil
91
+ elsif resource.kind_of?(User)
92
+ return :update_own if (controller.instance_exec(controller, :update, controller.current_user, &auth_method) rescue false)
93
+ end
94
+
95
+ # Check for Create
96
+ return :create if (controller.instance_exec(controller, :create, resource, &auth_method) rescue false)
97
+
98
+ # Check for Show
99
+ return :show if (controller.instance_exec(controller, :show, resource, &auth_method) rescue false)
100
+
101
+ # Check for Index
102
+ return :index if (controller.instance_exec(controller, :index, resource, &auth_method) rescue false)
103
+
104
+ # Check for Destroy
105
+ return :destroy if (controller.instance_exec(controller, :destroy, resource, &auth_method) rescue false)
106
+
107
+ :none
108
+ end
109
+
51
110
  private
52
111
 
53
112
  def self.role_description(role, obj = nil)
@@ -1,3 +1,3 @@
1
1
  module EffectiveRoles
2
- VERSION = '1.3.1'.freeze
2
+ VERSION = '1.3.2'.freeze
3
3
  end
@@ -77,4 +77,13 @@ EffectiveRoles.setup do |config|
77
77
  }
78
78
 
79
79
 
80
+ # config.authorization_method_for_summary_table
81
+ # This has absolutely no affect on the any logic involving roles
82
+ # It's purely for the effective_roles_summary_table() helper method
83
+ #
84
+ # It should match the authorization check used by your application
85
+ #
86
+ # Use CanCan: can?(action, resource)
87
+ config.authorization_method_for_summary_table = Proc.new { |controller, action, resource| true }
88
+
80
89
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_roles
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-19 00:00:00.000000000 Z
11
+ date: 2015-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -165,6 +165,7 @@ files:
165
165
  - app/helpers/effective_roles_helper.rb
166
166
  - app/models/concerns/acts_as_role_restricted.rb
167
167
  - app/views/effective/roles/_roles_fields.html.haml
168
+ - app/views/effective/roles/_summary_table.html.haml
168
169
  - lib/effective_roles.rb
169
170
  - lib/effective_roles/engine.rb
170
171
  - lib/effective_roles/version.rb