effective_roles 2.1.0 → 2.3.0

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
  SHA256:
3
- metadata.gz: 7f392991013eeab38fcc7b6092c1014078fc2a356833bd5033b9a268987dc512
4
- data.tar.gz: 38bb573be4e391b9cfd6141713bd89d29914e46148705588f1859642a5269bed
3
+ metadata.gz: 72568face118a2d07b1fb427fe30aacbaf1fcc8d49b1b21c2c9b76c4772b7024
4
+ data.tar.gz: 9ecf2d813dea46623737893ba9bf28bdbf99b07ab8e2d6637a02f3d3c711e7db
5
5
  SHA512:
6
- metadata.gz: ef6d332b9c6d93d8e28b61e856c93ec20e8c731b2fd02678fd1dcd8e52c2bcd12e1f5b68c891d82a265054065fe5694cc2bd59baa72ddaf2bb4553af28a93739
7
- data.tar.gz: e7f10cde194b45115445a09bd99d0da254c81dd611c97cb9f1c25e8cd33181941449aaa20eb45b5b24d4bea0af8397720cf1156865ef0bf217b1798bf103225a
6
+ metadata.gz: e61f574d94b7bae5a50d9cca54cd53f9f172fc015cdaf88631758e6cb15c87ce63f2390e712e36b7331596b957b995a236f98f5632fa1ceaaea1c23d81905a0f
7
+ data.tar.gz: 3a54e2cc622c8bd97fc1f2838132ba55509e1a5a37af91ab618792365570b38acf2c7912596055c98d5938230c142e52fb3878428b40bd059567d7575259576b
@@ -5,7 +5,7 @@ module Admin
5
5
 
6
6
  include Effective::CrudController
7
7
 
8
- if (config = EffectiveRoles.config.layout)
8
+ if (config = EffectiveRoles.layout)
9
9
  layout(config.kind_of?(Hash) ? config[:admin] : config)
10
10
  end
11
11
 
@@ -2,7 +2,7 @@ module EffectiveRolesHelper
2
2
  def effective_roles_summary(obj, options = {}) # User or a Post, any acts_as_roleable
3
3
  raise 'expected an acts_as_roleable object' unless obj.respond_to?(:roles)
4
4
 
5
- descriptions = EffectiveRoles.config.role_descriptions[obj.class.name] || EffectiveRoles.config.role_descriptions || {}
5
+ descriptions = EffectiveRoles.role_descriptions[obj.class.name] || EffectiveRoles.role_descriptions || {}
6
6
  opts = { obj: obj, roles: obj.roles, descriptions: descriptions }.merge(options)
7
7
 
8
8
  render partial: 'effective/roles/summary', locals: opts
@@ -17,7 +17,7 @@ module EffectiveRolesHelper
17
17
  raise 'Expected argument to be a Hash' unless opts.kind_of?(Hash)
18
18
 
19
19
  roles = Array(opts[:roles]).presence
20
- roles ||= [:public, :signed_in] + EffectiveRoles.config.roles
20
+ roles ||= [:public, :signed_in] + EffectiveRoles.roles
21
21
 
22
22
  if opts[:only].present?
23
23
  klasses = Array(opts[:only])
@@ -103,7 +103,7 @@ module EffectiveRolesHelper
103
103
 
104
104
  # This is used by the effective_roles_summary_table helper method
105
105
  def effective_roles_authorization_level(controller, role, resource)
106
- authorization_method = EffectiveRoles.config.authorization_method
106
+ authorization_method = EffectiveResources.authorization_method
107
107
 
108
108
  raise('expected an authorization method') unless (authorization_method.respond_to?(:call) || authorization_method.kind_of?(Symbol))
109
109
  return :unknown unless (controller.current_user rescue nil).respond_to?(:roles=)
@@ -29,7 +29,7 @@ module ActsAsRoleRestricted
29
29
 
30
30
  validates :roles_mask, numericality: true, allow_nil: true
31
31
 
32
- validate(if: -> { changes.include?(:roles_mask) && EffectiveRoles.assignable_roles_present?(self) }) do
32
+ validate(if: -> { changes.include?(:roles_mask) && EffectiveRoles.assignable_roles_present?(self) && current_user.present? }) do
33
33
  roles_was = EffectiveRoles.roles_for(changes[:roles_mask].first)
34
34
  changed = (roles + roles_was) - (roles & roles_was) # XOR
35
35
 
@@ -53,6 +53,8 @@ module ActsAsRoleRestricted
53
53
  end
54
54
 
55
55
  module ClassMethods
56
+ def acts_as_role_restricted?; true; end
57
+
56
58
  # Call with for_role(:admin) or for_role(@user.roles) or for_role([:admin, :member]) or for_role(:admin, :member, ...)
57
59
 
58
60
  # Returns all records which have been assigned any of the the given roles
@@ -71,33 +73,58 @@ module ActsAsRoleRestricted
71
73
  def with_role_sql(*roles)
72
74
  roles = roles.flatten.compact
73
75
  roles = roles.first.roles if roles.length == 1 && roles.first.respond_to?(:roles)
74
- roles = (roles.map { |role| role.to_sym } & EffectiveRoles.config.roles)
76
+ roles = (roles.map { |role| role.to_sym } & EffectiveRoles.roles)
75
77
 
76
- roles.map { |role| "(#{self.table_name}.roles_mask & %d > 0)" % 2**EffectiveRoles.config.roles.index(role) }.join(' OR ')
78
+ roles.map { |role| "(#{self.table_name}.roles_mask & %d > 0)" % 2**EffectiveRoles.roles.index(role) }.join(' OR ')
77
79
  end
78
80
 
79
81
  def without_role(*roles)
80
82
  roles = roles.flatten.compact
81
83
  roles = roles.first.roles if roles.length == 1 && roles.first.respond_to?(:roles)
82
- roles = (roles.map { |role| role.to_sym } & EffectiveRoles.config.roles)
84
+ roles = (roles.map { |role| role.to_sym } & EffectiveRoles.roles)
83
85
 
84
86
  where(
85
- roles.map { |role| "NOT(#{self.table_name}.roles_mask & %d > 0)" % 2**EffectiveRoles.config.roles.index(role) }.join(' AND ')
87
+ roles.map { |role| "NOT(#{self.table_name}.roles_mask & %d > 0)" % 2**EffectiveRoles.roles.index(role) }.join(' AND ')
86
88
  ).or(where(roles_mask: nil))
87
89
  end
88
90
  end
89
91
 
92
+ def roles
93
+ EffectiveRoles.roles_for(roles_mask)
94
+ end
95
+
90
96
  def roles=(roles)
91
97
  self.roles_mask = EffectiveRoles.roles_mask_for(roles)
92
98
  end
93
99
 
94
- def roles
95
- EffectiveRoles.roles_for(roles_mask)
100
+ def add_role(role)
101
+ raise('expected role to be a symbol') unless role.kind_of?(Symbol)
102
+ raise('unknown role') unless EffectiveRoles.roles_mask_for(role) > 0
103
+
104
+ assign_attributes(roles: roles | [role])
105
+ end
106
+
107
+ def add_role!(role)
108
+ add_role(role); save!
109
+ end
110
+
111
+ def remove_role(role)
112
+ raise('expected role to be a symbol') unless role.kind_of?(Symbol)
113
+ raise('unknown role') unless EffectiveRoles.roles_mask_for(role) > 0
114
+
115
+ assign_attributes(roles: roles - [role])
116
+ end
117
+
118
+ def remove_role!(role)
119
+ remove_role(role); save!
96
120
  end
97
121
 
98
122
  # if user.is? :admin
99
123
  def is?(role)
100
- roles.include?(role.try(:to_sym))
124
+ raise('expected role to be a symbol') unless role.kind_of?(Symbol)
125
+ raise('unknown role') unless EffectiveRoles.roles_mask_for(role) > 0
126
+
127
+ roles.include?(role)
101
128
  end
102
129
 
103
130
  # if user.is_any?(:admin, :editor)
@@ -1,3 +1,3 @@
1
1
  module EffectiveRoles
2
- VERSION = '2.1.0'.freeze
2
+ VERSION = '2.3.0'.freeze
3
3
  end
@@ -3,25 +3,12 @@ require 'effective_roles/engine'
3
3
  require 'effective_roles/version'
4
4
 
5
5
  module EffectiveRoles
6
- # mattr_accessor :roles
7
- # mattr_accessor :role_descriptions
8
- # mattr_accessor :assignable_roles
9
- # mattr_accessor :layout
10
6
 
11
- def self.config(namespace = nil)
12
- @config ||= ActiveSupport::OrderedOptions.new
13
- namespace ||= Tenant.current if defined?(Tenant)
14
-
15
- if namespace
16
- @config[namespace] ||= ActiveSupport::OrderedOptions.new
17
- else
18
- @config
19
- end
7
+ def self.config_keys
8
+ [:roles, :role_descriptions, :assignable_roles, :layout]
20
9
  end
21
10
 
22
- def self.setup(namespace = nil, &block)
23
- yield(config(namespace))
24
- end
11
+ include EffectiveGem
25
12
 
26
13
  def self.permitted_params
27
14
  { roles: [] }
@@ -33,11 +20,11 @@ module EffectiveRoles
33
20
  if obj.respond_to?(:is_role_restricted?)
34
21
  obj.roles
35
22
  elsif obj.kind_of?(Integer)
36
- config.roles.reject { |r| (obj & 2 ** config.roles.index(r)).zero? }
23
+ roles.reject { |r| (obj & 2 ** config.roles.index(r)).zero? }
37
24
  elsif obj.kind_of?(Symbol)
38
- Array(config.roles.find { |role| role == obj })
25
+ Array(roles.find { |role| role == obj })
39
26
  elsif obj.kind_of?(String)
40
- Array(config.roles.find { |role| role == obj.to_sym })
27
+ Array(roles.find { |role| role == obj.to_sym })
41
28
  elsif obj.kind_of?(Array)
42
29
  obj.map { |obj| roles_for(obj) }.flatten.compact
43
30
  elsif obj.nil?
@@ -52,8 +39,8 @@ module EffectiveRoles
52
39
  roles_for(roles).map { |r| 2 ** config.roles.index(r) }.sum
53
40
  end
54
41
 
55
- def self.roles_collection(resource, current_user = nil, only: nil, except: nil, multiple: nil)
56
- if config.assignable_roles.present?
42
+ def self.roles_collection(resource, current_user = nil, only: nil, except: nil, multiple: nil, skip_disabled: nil)
43
+ if assignable_roles.present?
57
44
  raise('expected object to respond to is_role_restricted?') unless resource.respond_to?(:is_role_restricted?)
58
45
  raise('expected current_user to respond to is_role_restricted?') if current_user && !current_user.respond_to?(:is_role_restricted?)
59
46
  end
@@ -62,21 +49,25 @@ module EffectiveRoles
62
49
  except = Array(except).compact
63
50
  multiple = resource.acts_as_role_restricted_options[:multiple] if multiple.nil?
64
51
  assignable = assignable_roles_collection(resource, current_user, multiple: multiple)
52
+ skip_disabled = assignable_roles.kind_of?(Hash) if skip_disabled.nil?
65
53
 
66
- config.roles.map do |role|
54
+ roles.map do |role|
67
55
  next if only.present? && !only.include?(role)
68
56
  next if except.present? && except.include?(role)
69
57
 
58
+ disabled = !assignable.include?(role)
59
+ next if disabled && skip_disabled
60
+
70
61
  [
71
62
  "#{role}<p class='help-block text-muted'>#{role_description(role, resource)}</p>".html_safe,
72
63
  role,
73
- ({:disabled => :disabled} unless assignable.include?(role))
64
+ ({:disabled => :disabled} if disabled)
74
65
  ]
75
66
  end.compact
76
67
  end
77
68
 
78
69
  def self.assignable_roles_collection(resource, current_user = nil, multiple: nil)
79
- return config.roles unless assignable_roles_present?(resource)
70
+ return roles unless assignable_roles_present?(resource)
80
71
 
81
72
  if current_user && !current_user.respond_to?(:is_role_restricted?)
82
73
  raise('expected current_user to respond to is_role_restricted?')
@@ -86,8 +77,8 @@ module EffectiveRoles
86
77
  raise('expected current_user to respond to is_role_restricted?')
87
78
  end
88
79
 
89
- assigned_roles = if config.assignable_roles.kind_of?(Hash)
90
- assignable = (config.assignable_roles[resource.class.to_s] || config.assignable_roles || {})
80
+ assigned_roles = if assignable_roles.kind_of?(Hash)
81
+ assignable = (assignable_roles[resource.class.to_s] || assignable_roles || {})
91
82
  assigned = [] # our return value
92
83
 
93
84
  if current_user.blank?
@@ -107,8 +98,8 @@ module EffectiveRoles
107
98
  end
108
99
 
109
100
  assigned
110
- elsif config.assignable_roles.kind_of?(Array)
111
- config.assignable_roles
101
+ elsif assignable_roles.kind_of?(Array)
102
+ assignable_roles
112
103
  end.uniq
113
104
 
114
105
  # Check boxes
@@ -120,27 +111,27 @@ module EffectiveRoles
120
111
  end
121
112
 
122
113
  def self.assignable_roles_present?(resource)
123
- return false unless config.assignable_roles.present?
114
+ return false unless assignable_roles.present?
124
115
 
125
- raise 'EffectiveRoles config.assignable_roles_for must be a Hash or Array' unless [Hash, Array].include?(config.assignable_roles.class)
116
+ raise 'EffectiveRoles config.assignable_roles_for must be a Hash or Array' unless [Hash, Array].include?(assignable_roles.class)
126
117
  raise('expected resource to respond to is_role_restricted?') unless resource.respond_to?(:is_role_restricted?)
127
118
 
128
- if config.assignable_roles.kind_of?(Array)
129
- config.assignable_roles
130
- elsif config.assignable_roles.key?(resource.class.to_s)
131
- config.assignable_roles[resource.class.to_s]
119
+ if assignable_roles.kind_of?(Array)
120
+ assignable_roles
121
+ elsif assignable_roles.key?(resource.class.to_s)
122
+ assignable_roles[resource.class.to_s]
132
123
  else
133
- config.assignable_roles
124
+ assignable_roles
134
125
  end.present?
135
126
  end
136
127
 
137
128
  private
138
129
 
139
130
  def self.role_description(role, obj = nil)
140
- raise 'EffectiveRoles config.role_descriptions must be a Hash' unless config.role_descriptions.kind_of?(Hash)
131
+ raise 'EffectiveRoles config.role_descriptions must be a Hash' unless role_descriptions.kind_of?(Hash)
141
132
 
142
- description = config.role_descriptions.dig(obj.class.to_s, role) if obj.present?
143
- description ||= config.role_descriptions[role]
133
+ description = role_descriptions.dig(obj.class.to_s, role) if obj.present?
134
+ description ||= role_descriptions[role]
144
135
  description || ''
145
136
  end
146
137
 
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: 2.1.0
4
+ version: 2.3.0
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: 2021-02-17 00:00:00.000000000 Z
11
+ date: 2022-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails