the_role 2.1.1 → 2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +27 -3
  3. data/.ruby-gemset.example +1 -0
  4. data/.ruby-version.example +1 -0
  5. data/.rvmrc.example +1 -1
  6. data/.travis.yml +2 -2
  7. data/README.md +46 -47
  8. data/app/assets/javascripts/the_role_editinplace.js.coffee +32 -0
  9. data/app/controllers/admin/role_sections_controller.rb +2 -2
  10. data/app/controllers/admin/roles_controller.rb +2 -2
  11. data/app/controllers/concerns/controller.rb +23 -0
  12. data/{lib/generators/the_role/templates → app/models/_templates_}/role.rb +1 -1
  13. data/app/models/concerns/base.rb +37 -0
  14. data/app/models/concerns/role.rb +134 -0
  15. data/app/models/concerns/user.rb +57 -0
  16. data/app/views/admin/roles/_role.html.haml +90 -69
  17. data/app/views/admin/roles/_sidebar.html.haml +16 -9
  18. data/app/views/admin/roles/new.html.haml +11 -10
  19. data/config/locales/en.yml +1 -0
  20. data/config/locales/es.yml +28 -28
  21. data/config/locales/ru.yml +1 -1
  22. data/db/migrate/20111025025129_create_roles.rb +7 -1
  23. data/docs/2.1.1.png +0 -0
  24. data/lib/generators/the_role/USAGE +1 -1
  25. data/lib/generators/the_role/templates/the_role.rb +7 -2
  26. data/lib/generators/the_role/the_role_generator.rb +8 -5
  27. data/lib/tasks/roles.rake +1 -1
  28. data/lib/the_role/activerecord.rb +11 -0
  29. data/lib/the_role/config.rb +7 -0
  30. data/lib/the_role/version.rb +1 -1
  31. data/lib/the_role.rb +19 -5
  32. data/spec/dummy_app/.gitignore +18 -0
  33. data/spec/dummy_app/.rspec +1 -0
  34. data/spec/dummy_app/Gemfile +32 -0
  35. data/spec/dummy_app/README.md +39 -0
  36. data/spec/dummy_app/Rakefile +6 -0
  37. data/spec/dummy_app/app/assets/images/.keep +0 -0
  38. data/spec/dummy_app/app/assets/javascripts/application.js +17 -0
  39. data/spec/dummy_app/app/assets/stylesheets/app/style.css.scss +23 -0
  40. data/spec/dummy_app/app/assets/stylesheets/application.css +3 -0
  41. data/spec/dummy_app/app/controllers/application_controller.rb +38 -0
  42. data/spec/dummy_app/app/controllers/concerns/.keep +0 -0
  43. data/spec/dummy_app/app/controllers/pages_controller.rb +75 -0
  44. data/spec/dummy_app/app/controllers/users_controller.rb +32 -0
  45. data/spec/dummy_app/app/controllers/welcome_controller.rb +13 -0
  46. data/spec/dummy_app/app/helpers/application_helper.rb +2 -0
  47. data/spec/dummy_app/app/mailers/.keep +0 -0
  48. data/spec/dummy_app/app/models/.keep +0 -0
  49. data/spec/dummy_app/app/models/concerns/.keep +0 -0
  50. data/spec/dummy_app/app/models/page.rb +24 -0
  51. data/spec/dummy_app/app/models/role.rb +4 -0
  52. data/spec/dummy_app/app/models/user.rb +21 -0
  53. data/spec/dummy_app/app/views/layouts/_current_user_info.html.haml +17 -0
  54. data/spec/dummy_app/app/views/layouts/application.html.haml +68 -0
  55. data/spec/dummy_app/app/views/pages/_form.html.haml +19 -0
  56. data/spec/dummy_app/app/views/pages/edit.html.haml +7 -0
  57. data/spec/dummy_app/app/views/pages/index.html.haml +27 -0
  58. data/spec/dummy_app/app/views/pages/manage.html.haml +23 -0
  59. data/spec/dummy_app/app/views/pages/my.html.haml +10 -0
  60. data/spec/dummy_app/app/views/pages/new.html.haml +5 -0
  61. data/spec/dummy_app/app/views/pages/show.html.haml +15 -0
  62. data/spec/dummy_app/app/views/users/edit.html.haml +34 -0
  63. data/spec/dummy_app/app/views/welcome/index.html.haml +38 -0
  64. data/spec/dummy_app/app/views/welcome/profile.html.haml +2 -0
  65. data/spec/dummy_app/bin/bundle +3 -0
  66. data/spec/dummy_app/bin/rails +4 -0
  67. data/spec/dummy_app/bin/rake +4 -0
  68. data/spec/dummy_app/config/application.rb +23 -0
  69. data/spec/dummy_app/config/boot.rb +4 -0
  70. data/spec/dummy_app/config/database.yml +17 -0
  71. data/spec/dummy_app/config/environment.rb +5 -0
  72. data/spec/dummy_app/config/environments/development.rb +29 -0
  73. data/spec/dummy_app/config/environments/production.rb +80 -0
  74. data/spec/dummy_app/config/environments/test.rb +36 -0
  75. data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  76. data/spec/dummy_app/config/initializers/devise.rb +227 -0
  77. data/spec/dummy_app/config/initializers/filter_parameter_logging.rb +4 -0
  78. data/spec/dummy_app/config/initializers/inflections.rb +16 -0
  79. data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
  80. data/spec/dummy_app/config/initializers/secret_token.rb +12 -0
  81. data/spec/dummy_app/config/initializers/session_store.rb +3 -0
  82. data/spec/dummy_app/config/initializers/the_role.rb +6 -0
  83. data/spec/dummy_app/config/initializers/wrap_parameters.rb +14 -0
  84. data/spec/dummy_app/config/locales/devise.en.yml +57 -0
  85. data/spec/dummy_app/config/locales/en.yml +7 -0
  86. data/spec/dummy_app/config/locales/ru.yml +4 -0
  87. data/spec/dummy_app/config/routes.rb +20 -0
  88. data/spec/dummy_app/config.ru +4 -0
  89. data/spec/dummy_app/db/migrate/20120212061952_devise_create_users.rb +63 -0
  90. data/spec/dummy_app/db/migrate/20120212063249_create_roles.rb +18 -0
  91. data/spec/dummy_app/db/migrate/20120314061307_create_pages.rb +14 -0
  92. data/spec/dummy_app/db/schema.rb +59 -0
  93. data/spec/dummy_app/db/seeds.rb +85 -0
  94. data/spec/dummy_app/lib/assets/.keep +0 -0
  95. data/spec/dummy_app/lib/tasks/.keep +0 -0
  96. data/spec/dummy_app/lib/tasks/assets.rake +15 -0
  97. data/spec/dummy_app/lib/tasks/db_bootstrap.rake +16 -0
  98. data/spec/dummy_app/log/.keep +0 -0
  99. data/spec/dummy_app/public/404.html +58 -0
  100. data/spec/dummy_app/public/422.html +58 -0
  101. data/spec/dummy_app/public/500.html +57 -0
  102. data/spec/dummy_app/public/favicon.ico +0 -0
  103. data/spec/dummy_app/public/robots.txt +5 -0
  104. data/spec/dummy_app/spec/controllers/admin_roles_controller_spec.rb +52 -0
  105. data/spec/dummy_app/spec/controllers/pages_controller_spec.rb +141 -0
  106. data/spec/dummy_app/spec/controllers/welcome_controller_spec.rb +66 -0
  107. data/spec/dummy_app/spec/factories/page.rb +6 -0
  108. data/spec/dummy_app/spec/factories/role.rb +55 -0
  109. data/spec/dummy_app/spec/factories/user.rb +11 -0
  110. data/spec/dummy_app/spec/models/hash_spec.rb +272 -0
  111. data/spec/dummy_app/spec/models/param_process_spec.rb +44 -0
  112. data/spec/dummy_app/spec/models/role_spec.rb +218 -0
  113. data/spec/dummy_app/spec/models/user_spec.rb +164 -0
  114. data/spec/dummy_app/spec/routing/admin_roles_routing_spec.rb +41 -0
  115. data/spec/dummy_app/spec/routing/pages_routing_spec.rb +35 -0
  116. data/spec/dummy_app/spec/spec_helper.rb +68 -0
  117. data/spec/dummy_app/vendor/assets/javascripts/.keep +0 -0
  118. data/spec/dummy_app/vendor/assets/stylesheets/.keep +0 -0
  119. data/the_role.gemspec +2 -1
  120. data/the_role.yml.teamocil.example +11 -0
  121. metadata +213 -16
  122. data/app/assets/javascripts/the_role.js.coffee +0 -31
  123. data/app/assets/stylesheets/the_role/bootstrap_sass.css.scss +0 -20
  124. data/app/assets/stylesheets/the_role.css.scss +0 -47
  125. data/app/controllers/the_role_controller.rb +0 -18
  126. data/app/models/concerns/role_model.rb +0 -125
  127. data/app/models/concerns/the_role_base.rb +0 -35
  128. data/app/models/concerns/the_role_user_model.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 27c23d0e82c72b3aa2f3f2c846d62424f50bb349
4
- data.tar.gz: e7f1057d85c4ec5b0a8d60a227d7504810eedde9
3
+ metadata.gz: 77b00593bcd32d2fee50327a0c3fab22fbadf482
4
+ data.tar.gz: 269eb319746ed8f82864259c20ba46439ea59390
5
5
  SHA512:
6
- metadata.gz: fab50cb0f7259c5a0902f1b2647078e978171eacb42e33a4bde402cf6bb86a5f4fcd814a2d3e27a975bbf3af0ea70278b9b4ebafd76832e1856d359fe21b70f7
7
- data.tar.gz: f69efe7d0fe26e0b7d6a5423932e8c9f316f416b3fc0b9c6651da6990e80025cb9af1ea1cecfc0461ab905f8666a6b301fcd6f0c7cd2b37d2d491218765a2717
6
+ metadata.gz: 88afca09c44fe32449d4d8ca1d7bdfa60d9ad13f2d02fdf43c3fbb29931ec99377c9e6e4bf0c632c739f40f0858ec58d55eb59bffde8cbcb1e114cba33a6f518
7
+ data.tar.gz: cf2b3f534ad0d7a949590a563d722e9048161a91560c3db73940b08cd5db4ba72691055fab7c86d1c596ed408fa99a22cf8a5c0389a53cb3a6905c0d796e2b0b
data/.gitignore CHANGED
@@ -1,6 +1,30 @@
1
1
  *.gem
2
+ *.rbc
3
+
2
4
  .bundle
3
- Gemfile.lock
4
- pkg/*
5
+ .config
6
+ .yardoc
7
+
5
8
  .rvmrc
6
- spec/the_role_on_devise/public/assets
9
+ .ruby-gemset
10
+ .ruby-version
11
+
12
+ _yardoc
13
+ coverage
14
+ Gemfile.lock
15
+ InstalledFiles
16
+ lib/bundler/man
17
+ spec/dummy_app/public/assets
18
+
19
+ tmp
20
+ doc
21
+ pkg
22
+ rdoc
23
+
24
+ test/tmp
25
+ spec/reports
26
+ test/version_tmp
27
+
28
+ .DS_Store
29
+ .LSOverride
30
+ .AppleDouble
@@ -0,0 +1 @@
1
+ the_role
@@ -0,0 +1 @@
1
+ ruby-2.0.0-p353
data/.rvmrc.example CHANGED
@@ -1 +1 @@
1
- rvm use ruby-1.8.7-p357@the_role --create
1
+ rvm use ruby-2.0.0-p353@the_role --create
data/.travis.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
- gemfile: spec/the_role_on_devise/Gemfile
5
- script: "cd spec/the_role_on_devise && rake db:bootstrap RAILS_ENV=test && rspec --format documentation"
4
+ gemfile: spec/dummy_app/Gemfile
5
+ script: "cd spec/dummy_app && rake db:bootstrap RAILS_ENV=test && rspec --format documentation"
data/README.md CHANGED
@@ -41,7 +41,9 @@ puts following yields into your layout:
41
41
  gem 'the_role', '~> 2.0.0'
42
42
  ```
43
43
 
44
- [Rails 3 version](http://rubygems.org/gems/the_role/versions/1.7.0) (not recommended for use)
44
+ ## If you have any questions
45
+
46
+ Please before ask anything try to launch and play with **[Dummy App](spec/dummy_app)** in spec folder. Maybe example of integration will be better than any documentation. Thank you!
45
47
 
46
48
  ### Instalation
47
49
 
@@ -68,10 +70,8 @@ gem 'the_role', '~> 2.0.0'
68
70
  ## Install
69
71
 
70
72
  ```ruby
71
- # Optional for UI.
72
- # You can use any Bootstrap version (CSS, LESS, SCSS)
73
- # You can find required components below
74
- gem 'bootstrap-sass', '~> 2.3.1.0'
73
+ # You can use any Bootstrap 3 version (CSS, LESS, SCSS)
74
+ gem 'bootstrap-sass', github: 'thomas-mcdonald/bootstrap-sass'
75
75
 
76
76
  gem "the_role", "~> 2.0.0"
77
77
  ```
@@ -110,7 +110,9 @@ end
110
110
 
111
111
  ```ruby
112
112
  class User < ActiveRecord::Base
113
- include TheRoleUserModel
113
+ include TheRole::User
114
+ # or following alias for AR:
115
+ # has_role
114
116
 
115
117
  # has_many :pages
116
118
  end
@@ -124,6 +126,16 @@ Generate Role model
124
126
  bundle exec rails g the_role install
125
127
  ```
126
128
 
129
+ or you can create Role model manually:
130
+
131
+ ```ruby
132
+ class Role < ActiveRecord::Base
133
+ include TheRole::Role
134
+ # or following alias for AR:
135
+ # acts_as_role
136
+ end
137
+ ```
138
+
127
139
  install TheRole migrations
128
140
 
129
141
  ```ruby
@@ -158,22 +170,35 @@ User.first.update( role: Role.with_name(:admin) )
158
170
 
159
171
  ```ruby
160
172
  class ApplicationController < ActionController::Base
161
- include TheRoleController
173
+ include TheRole::Controller
162
174
 
163
175
  protect_from_forgery
164
176
 
165
- # your Access Denied processor
166
177
  def access_denied
167
- return render(text: 'access_denied: requires a role')
178
+ flash[:error] = t('the_role.access_denied')
179
+ redirect_to(:back)
168
180
  end
181
+ end
182
+ ```
183
+ ### Configuration
184
+
185
+ create the_role config:
186
+
187
+ ```
188
+ bundle exec rails g the_role setup
189
+ ```
169
190
 
170
- # 1) LOGIN_REQUIRE => authenticate_user! for Devise
171
- # 2) LOGIN_REQUIRE => require_login for Sorcery
172
- # 3) LOGIN_REQUIRE => user_require_method for other Authentication solution
191
+ **config/initializers/the_role.rb**
173
192
 
174
- # Define method aliases for the correct TheRole's controller work
175
- alias_method :login_required, :LOGIN_REQUIRE
176
- alias_method :role_access_denied, :access_denied
193
+ ```ruby
194
+ TheRole.configure do |config|
195
+ config.layout = :application
196
+ config.default_user_role = :user
197
+ config.access_denied_method = :access_denied # define it in ApplicationController
198
+ config.login_required_method = :authenticate_user! # devise auth method
199
+
200
+ # config.first_user_should_be_admin = false
201
+ # config.destroy_strategy = :restrict_with_exception # can be nil
177
202
  end
178
203
  ```
179
204
 
@@ -209,43 +234,17 @@ end
209
234
  **application.css**
210
235
 
211
236
  ```
212
- //= require the_role/bootstrap_sass
213
- //= require the_role
237
+ //= require bootstrap
214
238
  ```
215
239
 
216
- If you don't use **bootstrap-sass** gem you should add the following componetns from your bootstrap version instead **the_role/bootstrap_sass**:
217
-
218
- ```
219
- bootstrap/variables
220
- bootstrap/mixins
221
- bootstrap/reset
222
-
223
- bootstrap/scaffolding
224
- bootstrap/grid
225
- bootstrap/layouts
226
-
227
- bootstrap/navs
228
- bootstrap/wells
229
- bootstrap/forms
230
- bootstrap/close
231
- bootstrap/tables
232
- bootstrap/navbar
233
- bootstrap/dropdowns
240
+ **application.js**
234
241
 
235
- bootstrap/alerts
236
- bootstrap/buttons
237
- bootstrap/button-groups
238
242
  ```
243
+ //= require jquery
244
+ //= require jquery_ujs
239
245
 
240
- ### Configuration
241
-
242
- config/initializers/the_role.rb
243
-
244
- ```ruby
245
- TheRole.configure do |config|
246
- config.layout = :application # default Layout for TheRole UI
247
- config.default_user_role = nil # set default role (name)
248
- end
246
+ //= require bootstrap
247
+ //= require the_role_editinplace
249
248
  ```
250
249
 
251
250
  ## Understanding
@@ -0,0 +1,32 @@
1
+ showForm = (item) ->
2
+ holder = item.parents('.holder')
3
+ a_item = holder.children('span.a')
4
+ b_item = holder.children('span.b')
5
+
6
+ a_item.hide().off 'click'
7
+ b_item.css('visibility', 'visible')
8
+
9
+ holder.find('.btn-warning').click ->
10
+ item = $ @
11
+ hideForm item
12
+ item.parents('form')[0].reset()
13
+
14
+ holder.find('.btn-success').click ->
15
+ $(@).parents('form')[0].submit()
16
+
17
+ b_item.find('input').keypress (event) ->
18
+ ENTER = 13
19
+ form = $(event.target).parents('form')
20
+ form.submit() if event.which is ENTER
21
+
22
+ hideForm = (item) ->
23
+ holder = item.parents('.holder')
24
+ a_item = holder.children('span.a')
25
+ b_item = holder.children('span.b')
26
+
27
+ a_item.show()
28
+ b_item.css('visibility', 'hidden')
29
+ holder.find('.btn').off('click')
30
+ a_item.click -> showForm item
31
+
32
+ $ -> $('span.a', 'h3, h5').click -> showForm $(@)
@@ -1,6 +1,6 @@
1
1
  class Admin::RoleSectionsController < ApplicationController
2
- include TheRoleController
3
- layout TheRole.config.layout.to_s
2
+ include TheRole::Controller
3
+ layout TheRole.config.layout.to_s
4
4
 
5
5
  before_filter :login_required
6
6
  before_filter :role_required
@@ -1,6 +1,6 @@
1
1
  class Admin::RolesController < ApplicationController
2
- include TheRoleController
3
- layout TheRole.config.layout.to_s
2
+ include TheRole::Controller
3
+ layout TheRole.config.layout.to_s
4
4
 
5
5
  before_filter :login_required
6
6
  before_filter :role_required
@@ -0,0 +1,23 @@
1
+ module TheRole
2
+ module Controller
3
+ def login_required
4
+ send TheRole.config.login_required_method
5
+ end
6
+
7
+ def role_access_denied
8
+ send TheRole.config.access_denied_method
9
+ end
10
+
11
+ private
12
+
13
+ def role_required
14
+ role_access_denied unless current_user.has_role?(controller_path, action_name)
15
+ end
16
+
17
+ def owner_required
18
+ # TheRole: You should define OWNER CHECK OBJECT
19
+ # When editable object was found
20
+ role_access_denied unless current_user.owner?(@owner_check_object)
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  class Role < ActiveRecord::Base
2
- include RoleModel
2
+ acts_as_role
3
3
  end
@@ -0,0 +1,37 @@
1
+ module TheRole
2
+ module Base
3
+ def has_section? section_name
4
+ hash = role_hash
5
+ section_name = TheRoleParam.process section_name
6
+ return true if hash[section_name]
7
+ false
8
+ end
9
+
10
+ def has_role? section_name, rule_name
11
+ hash = role_hash
12
+ section_name = TheRoleParam.process(section_name)
13
+ rule_name = TheRoleParam.process(rule_name)
14
+
15
+ return true if hash.try(:[], 'system').try(:[], 'administrator')
16
+ return true if hash.try(:[], 'moderator').try(:[], section_name)
17
+
18
+ return false unless hash[section_name]
19
+ return false unless hash[section_name].key? rule_name
20
+ hash[section_name][rule_name]
21
+ end
22
+
23
+ def any_role? roles_hash = {}
24
+ roles_hash.each_pair{|section, action| return true if has_role?(section, action)}
25
+ false
26
+ end
27
+
28
+ def moderator? section_name
29
+ section_name = TheRoleParam.process(section_name)
30
+ has_role? section_name, 'any_crazy_name'
31
+ end
32
+
33
+ def admin?
34
+ has_role? 'any_crazy_name', 'any_crazy_name'
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,134 @@
1
+ module TheRole
2
+ module Role
3
+ extend ActiveSupport::Concern
4
+
5
+ include TheRole::Base
6
+
7
+ def role_hash;
8
+ to_hash;
9
+ end
10
+
11
+ alias_method :has?, :has_role?
12
+ alias_method :any?, :any_role?
13
+
14
+ def has_section? section_name
15
+ to_hash.key? TheRoleParam.process(section_name)
16
+ end
17
+
18
+ included do
19
+ has_many :users, dependent: TheRole.config.destroy_strategy
20
+ validates :name, presence: true, uniqueness: true
21
+ validates :title, presence: true, uniqueness: true
22
+ validates :description, presence: true
23
+
24
+ before_save do
25
+ self.name = TheRoleParam.process(name)
26
+
27
+ rules_set = self.the_role
28
+ self.the_role = {}.to_json if rules_set.blank? # blank
29
+ self.the_role = rules_set.to_json if rules_set.is_a?(Hash) # Hash
30
+ end
31
+ end
32
+
33
+ module ClassMethods
34
+ def with_name name
35
+ ::Role.where(name: name).first
36
+ end
37
+ end
38
+
39
+ # C
40
+
41
+ def create_section section_name = nil
42
+ return false unless section_name
43
+ role = to_hash
44
+ section_name = TheRoleParam.process(section_name)
45
+ return false if section_name.blank?
46
+ return true if role[section_name]
47
+ role[section_name] = {}
48
+ update(the_role: role)
49
+ end
50
+
51
+ def create_rule section_name, rule_name
52
+ return false if rule_name.blank?
53
+ return false unless create_section(section_name)
54
+ role = to_hash
55
+ rule_name = TheRoleParam.process(rule_name)
56
+ section_name = TheRoleParam.process(section_name)
57
+ return true if role[section_name][rule_name]
58
+ role[section_name][rule_name] = false
59
+ update(the_role: role)
60
+ end
61
+
62
+ # R
63
+
64
+ def to_hash
65
+ #return the hash if activerecord parsed the json from postgresql
66
+ return the_role if the_role.kind_of? Hash
67
+ begin
68
+ JSON.load(the_role) rescue {}
69
+ end
70
+ end
71
+
72
+ def to_json
73
+ the_role
74
+ end
75
+
76
+ # U
77
+
78
+ # source_hash will be reset to false
79
+ # except true items from new_role_hash
80
+ # all keys will become 'strings'
81
+ # look at lib/the_role/hash.rb to find definition of *underscorify_keys* method
82
+ def update_role new_role_hash
83
+ new_role_hash = new_role_hash.try(:to_hash) || {}
84
+ new_role = new_role_hash.underscorify_keys
85
+ role = to_hash.underscorify_keys.deep_reset(false)
86
+ role.deep_merge! new_role
87
+ update(the_role: role)
88
+ end
89
+
90
+ def rule_on section_name, rule_name
91
+ role = to_hash
92
+ rule_name = TheRoleParam.process(rule_name)
93
+ section_name = TheRoleParam.process(section_name)
94
+ return false unless role[section_name]
95
+ return false unless role[section_name].key? rule_name
96
+ return true if role[section_name][rule_name]
97
+ role[section_name][rule_name] = true
98
+ update(the_role: role)
99
+ end
100
+
101
+ def rule_off section_name, rule_name
102
+ role = to_hash
103
+ rule_name = TheRoleParam.process(rule_name)
104
+ section_name = TheRoleParam.process(section_name)
105
+ return false unless role[section_name]
106
+ return false unless role[section_name].key? rule_name
107
+ return true unless role[section_name][rule_name]
108
+ role[section_name][rule_name] = false
109
+ update(the_role: role)
110
+ end
111
+
112
+ # D
113
+
114
+ def delete_section section_name = nil
115
+ return false unless section_name
116
+ role = to_hash
117
+ section_name = TheRoleParam.process(section_name)
118
+ return false if section_name.blank?
119
+ return false unless role[section_name]
120
+ role.delete section_name
121
+ update(the_role: role)
122
+ end
123
+
124
+ def delete_rule section_name, rule_name
125
+ role = to_hash
126
+ rule_name = TheRoleParam.process(rule_name)
127
+ section_name = TheRoleParam.process(section_name)
128
+ return false unless role[section_name]
129
+ return false unless role[section_name].key? rule_name
130
+ role[section_name].delete rule_name
131
+ update(the_role: role)
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,57 @@
1
+ module TheRole
2
+ module User
3
+ extend ActiveSupport::Concern
4
+
5
+ include TheRole::Base
6
+
7
+ included do
8
+ belongs_to :role
9
+ before_validation :set_default_role, on: :create
10
+ after_save { |user| user.instance_variable_set(:@role_hash, nil) }
11
+ end
12
+
13
+ module ClassMethods
14
+ def with_role name
15
+ ::Role.where(name: name).first.users
16
+ end
17
+ end
18
+
19
+ def role_hash;
20
+ @role_hash ||= role.try(:to_hash) || {}
21
+ end
22
+
23
+ # FALSE if object is nil
24
+ # If object is a USER - check for youself
25
+ # Check for owner field - :user_id
26
+ # Check for owner _object_ if owner field is not :user_id
27
+ def owner? obj
28
+ return false unless obj
29
+ return true if admin?
30
+
31
+ section_name = obj.class.to_s.tableize
32
+ return true if moderator?(section_name)
33
+
34
+ # obj is User, simple way to define user_id
35
+ return id == obj.id if obj.is_a?(self.class)
36
+
37
+ # few ways to define user_id
38
+ return id == obj.user_id if obj.respond_to? :user_id
39
+ return id == obj[:user_id] if obj[:user_id]
40
+ return id == obj[:user][:id] if obj[:user]
41
+ false
42
+ end
43
+
44
+ private
45
+
46
+ def set_default_role
47
+ unless role
48
+ default_role = ::Role.find_by_name(TheRole.config.default_user_role)
49
+ self.role = default_role if default_role
50
+ end
51
+
52
+ if self.class.count.zero? && TheRole.config.first_user_should_be_admin
53
+ self.role = TheRole.create_admin_role!
54
+ end
55
+ end
56
+ end
57
+ end