the_role 1.4.1 → 1.5.0
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.
- data/.gitignore +1 -0
- data/.rvmrc.example +1 -0
- data/Gemfile +0 -2
- data/README.md +53 -91
- data/app/assets/stylesheets/the_role/form.css +57 -55
- data/app/assets/stylesheets/the_role/headers.css.scss +14 -12
- data/app/assets/stylesheets/the_role/style.css.scss +68 -69
- data/app/controllers/admin/role_sections_controller.rb +55 -0
- data/app/controllers/admin/roles_controller.rb +11 -69
- data/app/views/admin/roles/_form.haml +3 -3
- data/app/views/admin/roles/edit.html.haml +39 -34
- data/app/views/admin/roles/index.haml +14 -8
- data/app/views/admin/roles/new.html.haml +22 -13
- data/config/locales/en.yml +34 -33
- data/config/locales/ru.yml +34 -33
- data/config/routes.rb +10 -12
- data/db/migrate/20111025025129_create_roles.rb +4 -4
- data/lib/the_role.rb +9 -104
- data/lib/the_role/hash.rb +22 -18
- data/lib/the_role/modules/base.rb +23 -0
- data/lib/the_role/modules/controller_requires.rb +28 -0
- data/lib/the_role/modules/param_helper.rb +7 -0
- data/lib/the_role/modules/role_model.rb +121 -0
- data/lib/the_role/modules/user_model.rb +32 -0
- data/lib/the_role/version.rb +1 -1
- data/pic.png +0 -0
- data/the_role.gemspec +4 -5
- metadata +39 -12
- data/app/assets/stylesheets/the_role/reset.css.scss +0 -63
- data/app/controllers/admin/role_section_controller.rb +0 -41
- data/app/views/layouts/the_role.html.haml +0 -15
data/config/routes.rb
CHANGED
@@ -1,18 +1,16 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
2
|
namespace :admin do
|
3
3
|
resources :roles do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
resources :sections, :controller => :role_section do
|
4
|
+
resources :sections, :controller => :role_sections, :only => :none do
|
5
|
+
collection do
|
6
|
+
post :create
|
7
|
+
post :create_rule
|
8
|
+
end
|
11
9
|
member do
|
12
|
-
|
13
|
-
delete :
|
10
|
+
delete :destroy
|
11
|
+
delete :destroy_rule
|
14
12
|
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
18
16
|
end
|
@@ -2,10 +2,10 @@ class CreateRoles < ActiveRecord::Migration
|
|
2
2
|
def self.up
|
3
3
|
create_table :roles do |t|
|
4
4
|
|
5
|
-
t.string :name
|
6
|
-
t.string :title
|
7
|
-
t.text :
|
8
|
-
t.text
|
5
|
+
t.string :name, :null => false
|
6
|
+
t.string :title, :null => false
|
7
|
+
t.text :description, :null => false
|
8
|
+
t.text :the_role, :null => false
|
9
9
|
|
10
10
|
t.timestamps
|
11
11
|
end
|
data/lib/the_role.rb
CHANGED
@@ -6,111 +6,16 @@ require "the_role/engine"
|
|
6
6
|
require "the_role/version"
|
7
7
|
require "the_role/the_class_exists"
|
8
8
|
|
9
|
+
require "the_role/modules/base"
|
10
|
+
require "the_role/modules/param_helper"
|
11
|
+
require "the_role/modules/user_model"
|
12
|
+
require "the_role/modules/role_model"
|
13
|
+
require "the_role/modules/controller_requires"
|
14
|
+
|
9
15
|
module TheRole
|
16
|
+
# include TheRole::Base
|
10
17
|
# include TheRole::Requires
|
11
18
|
# include TheRole::UserModel
|
12
19
|
# include TheRole::RoleModel
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# TheRole.get(@role.the_role)
|
17
|
-
def self.get str
|
18
|
-
str = str.is_a?(String) ? str : String.new
|
19
|
-
hash = YAML::load(str)
|
20
|
-
hash ? hash : Hash.new
|
21
|
-
end
|
22
|
-
|
23
|
-
module UserModel
|
24
|
-
def self.included(base)
|
25
|
-
base.class_eval do
|
26
|
-
belongs_to :role
|
27
|
-
attr_accessible :role
|
28
|
-
# when user changed - @the_role should be reload
|
29
|
-
after_save { |user| user.instance_variable_set(:@the_role, nil) }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def the_role
|
34
|
-
@the_role ||= self.role ? TheRole.get(self.role.the_role) : Hash.new
|
35
|
-
end
|
36
|
-
|
37
|
-
def admin?
|
38
|
-
role = self.the_role[:system] ? self.the_role[:system][:administrator] : false
|
39
|
-
role && role.is_a?(TrueClass)
|
40
|
-
end
|
41
|
-
|
42
|
-
def moderator? section
|
43
|
-
return true if self.admin?
|
44
|
-
role = self.the_role[:moderator] ? self.the_role[:moderator][section.to_sym] : false
|
45
|
-
role && role.is_a?(TrueClass)
|
46
|
-
end
|
47
|
-
|
48
|
-
# TRUE if user has role - administartor of system
|
49
|
-
# TRUE if user is moderator of this section (controller_name)
|
50
|
-
# FALSE when this section (or role) is nil
|
51
|
-
# return current value of role (TRUE|FALSE) if it exists
|
52
|
-
def has_role?(section, policy)
|
53
|
-
return true if self.admin?
|
54
|
-
return true if self.moderator? section
|
55
|
-
if self.the_role[section.to_sym] && self.the_role[section.to_sym][policy.to_sym]
|
56
|
-
self.the_role[section.to_sym][policy.to_sym].is_a?(TrueClass)
|
57
|
-
else
|
58
|
-
false
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# FALSE if object is nil
|
63
|
-
# If object is a USER - check for youself
|
64
|
-
# Check for owner field - :user_id
|
65
|
-
# Check for owner _object_ if owner field is not :user_id
|
66
|
-
def owner?(obj)
|
67
|
-
return false unless obj
|
68
|
-
return true if self.admin?
|
69
|
-
return true if self.moderator? obj.class.to_s.tableize # moderator? 'pages'
|
70
|
-
return self.id == obj.id if obj.is_a?(User)
|
71
|
-
return self.id == obj[:user_id] if obj[:user_id]
|
72
|
-
return self.id == obj[:user][:id] if obj[:user]
|
73
|
-
false
|
74
|
-
end
|
75
|
-
end#UserModel
|
76
|
-
|
77
|
-
module RoleModel
|
78
|
-
def self.included(base)
|
79
|
-
base.class_eval do
|
80
|
-
has_many :users
|
81
|
-
validates :name, :presence => {:message => I18n.translate('the_role.name_presence')}
|
82
|
-
validates :title, :presence => {:message => I18n.translate('the_role.title_presence')}
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end#RoleModel
|
86
|
-
|
87
|
-
# for application controller
|
88
|
-
# @the_role_object should be defined with before_filter
|
89
|
-
# @the_role_object = @page
|
90
|
-
module Requires
|
91
|
-
private
|
92
|
-
|
93
|
-
def the_role_access_denied
|
94
|
-
flash[:error] = t('the_role.access_denied')
|
95
|
-
redirect_to root_path
|
96
|
-
end
|
97
|
-
|
98
|
-
# before_filter :role_require
|
99
|
-
def the_role_require
|
100
|
-
the_role_access_denied unless current_user.has_role?(controller_name, action_name)
|
101
|
-
end
|
102
|
-
|
103
|
-
# before_filter :the_role_object
|
104
|
-
# define class variable for *the_owner_require* filter with Controller class name
|
105
|
-
# @the_role_object = @article
|
106
|
-
def the_role_object
|
107
|
-
variable_name = self.class.to_s.tableize.split('_').first.singularize.split('/').last
|
108
|
-
@the_role_object = self.instance_variable_get("@#{variable_name}")
|
109
|
-
end
|
110
|
-
|
111
|
-
# before_filter :the_owner_require
|
112
|
-
def the_owner_require
|
113
|
-
the_role_access_denied unless current_user.owner?(@the_role_object)
|
114
|
-
end
|
115
|
-
end#Requires
|
116
|
-
end#TheRole
|
20
|
+
# include TheRole::ParamHelper
|
21
|
+
end
|
data/lib/the_role/hash.rb
CHANGED
@@ -1,25 +1,29 @@
|
|
1
1
|
class Hash
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
# load 'the_role/hash.rb' - UPDATE, BUT NOT RELOAD
|
3
|
+
|
4
|
+
# {'a b' => 1, "x y" => {'hello' => 1, :hello => 2} }.underscorify_keys => {:a_b=>1, :x_y=>{:hello=>2}}
|
5
|
+
def underscorify_keys
|
6
|
+
hash = {}
|
7
|
+
self.each do |key, value|
|
8
|
+
new_key = key.to_s.parameterize.underscore.to_sym
|
9
|
+
hash[new_key] = self[key].is_a?(Hash) ? self[key].underscorify_keys : value
|
10
10
|
end
|
11
|
+
hash
|
11
12
|
end
|
12
13
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
if base[key.to_sym].is_a?(Hash) && hash[key.to_sym].is_a?(Hash)
|
18
|
-
base[key.to_sym]= base[key.to_sym].the_merge!(hash[key.to_sym], default_value)
|
19
|
-
else
|
20
|
-
base[key.to_sym]= default_value
|
21
|
-
end
|
14
|
+
def deep_reset(default = false)
|
15
|
+
hash = dup
|
16
|
+
hash.each do |key, value|
|
17
|
+
hash[key] = hash[key].is_a?(Hash) ? hash[key].deep_reset(default) : default
|
22
18
|
end
|
23
|
-
|
19
|
+
hash
|
20
|
+
end
|
21
|
+
|
22
|
+
def underscorify_keys!
|
23
|
+
replace underscorify_keys
|
24
|
+
end
|
25
|
+
|
26
|
+
def deep_reset!(default = false)
|
27
|
+
replace deep_reset(default)
|
24
28
|
end
|
25
29
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module TheRole
|
2
|
+
module Base
|
3
|
+
def has_role? section_name, rule_name
|
4
|
+
hash = role_hash
|
5
|
+
section_name = param_prepare(section_name)
|
6
|
+
rule_name = param_prepare(rule_name)
|
7
|
+
return true if hash[:system] and hash[:system][:administrator]
|
8
|
+
return true if hash[:moderator] and hash[:moderator][section_name]
|
9
|
+
return false unless hash[section_name]
|
10
|
+
return false unless hash[section_name].key? rule_name
|
11
|
+
hash[section_name][rule_name]
|
12
|
+
end
|
13
|
+
|
14
|
+
def moderator? section_name
|
15
|
+
section_name = param_prepare(section_name)
|
16
|
+
has_role? section_name, :any_crazy_name
|
17
|
+
end
|
18
|
+
|
19
|
+
def admin?
|
20
|
+
has_role? :any_crazy_name, :any_crazy_name
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module TheRole
|
2
|
+
module Requires
|
3
|
+
private
|
4
|
+
|
5
|
+
def role_access_denied
|
6
|
+
flash[:error] = t('the_role.access_denied')
|
7
|
+
redirect_to root_path
|
8
|
+
end
|
9
|
+
|
10
|
+
# before_filter :role_require
|
11
|
+
def role_require
|
12
|
+
role_access_denied unless current_user.has_role?(controller_name, action_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
# before_filter :simple_object_finder
|
16
|
+
# define class variable for *owner_require* filter with Controller class name
|
17
|
+
# @object_for_ownership_checking = @article
|
18
|
+
def simple_object_finder
|
19
|
+
variable_name = self.class.to_s.tableize.split('_').first.singularize.split('/').last
|
20
|
+
@object_for_ownership_checking = self.instance_variable_get("@#{variable_name}")
|
21
|
+
end
|
22
|
+
|
23
|
+
# before_filter :owner_require
|
24
|
+
def owner_require
|
25
|
+
role_access_denied unless current_user.owner?(@object_for_ownership_checking)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
module TheRole
|
2
|
+
module RoleModel
|
3
|
+
include TheRole::Base
|
4
|
+
include TheRole::ParamHelper
|
5
|
+
|
6
|
+
def role_hash; to_hash; end
|
7
|
+
alias_method :has?, :has_role?
|
8
|
+
|
9
|
+
def has_section? section_name
|
10
|
+
section_name = param_prepare(section_name)
|
11
|
+
to_hash.key? section_name
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.included(base)
|
15
|
+
base.class_eval do
|
16
|
+
has_many :users
|
17
|
+
validates :name, :presence => true, :uniqueness => true
|
18
|
+
validates :title, :presence => true, :uniqueness => true
|
19
|
+
validates :description, :presence => true
|
20
|
+
before_create do
|
21
|
+
self.name = param_prepare(name)
|
22
|
+
self.the_role = {}.to_yaml
|
23
|
+
end
|
24
|
+
|
25
|
+
# C
|
26
|
+
|
27
|
+
def create_section section_name = nil
|
28
|
+
return false unless section_name
|
29
|
+
role = to_hash
|
30
|
+
section_name = param_prepare(section_name)
|
31
|
+
return false if section_name.blank?
|
32
|
+
return true if role[section_name]
|
33
|
+
role[section_name] = {}
|
34
|
+
update_attributes(:the_role => role.to_yaml)
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_rule section_name, rule_name
|
38
|
+
return false unless create_section(section_name)
|
39
|
+
role = to_hash
|
40
|
+
rule_name = param_prepare(rule_name)
|
41
|
+
section_name = param_prepare(section_name)
|
42
|
+
return true if role[section_name][rule_name]
|
43
|
+
role[section_name][rule_name] = false
|
44
|
+
update_attributes(:the_role => role.to_yaml)
|
45
|
+
end
|
46
|
+
|
47
|
+
# R
|
48
|
+
|
49
|
+
def to_hash
|
50
|
+
begin YAML::load(the_role) rescue {} end
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_yaml
|
54
|
+
the_role
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_s
|
58
|
+
the_role
|
59
|
+
end
|
60
|
+
|
61
|
+
# U
|
62
|
+
|
63
|
+
# source_hash will be reset to false
|
64
|
+
# except true items from new_role_hash
|
65
|
+
# all keys will become symbols
|
66
|
+
# look at lib/the_role/hash.rb to find definition of *underscorify_keys* method
|
67
|
+
def update_role new_role_hash
|
68
|
+
new_role_hash = new_role_hash.try(:to_hash) || {}
|
69
|
+
new_role = new_role_hash.underscorify_keys
|
70
|
+
role = to_hash.underscorify_keys.deep_reset
|
71
|
+
role.deep_merge! new_role
|
72
|
+
update_attributes(:the_role => role.to_yaml)
|
73
|
+
end
|
74
|
+
|
75
|
+
def rule_on section_name, rule_name
|
76
|
+
role = to_hash
|
77
|
+
rule_name = param_prepare(rule_name)
|
78
|
+
section_name = param_prepare(section_name)
|
79
|
+
return false unless role[section_name]
|
80
|
+
return false unless role[section_name].key? rule_name
|
81
|
+
return true if role[section_name][rule_name]
|
82
|
+
role[section_name][rule_name] = true
|
83
|
+
update_attributes(:the_role => role.to_yaml)
|
84
|
+
end
|
85
|
+
|
86
|
+
def rule_off section_name, rule_name
|
87
|
+
role = to_hash
|
88
|
+
rule_name = param_prepare(rule_name)
|
89
|
+
section_name = param_prepare(section_name)
|
90
|
+
return false unless role[section_name]
|
91
|
+
return false unless role[section_name].key? rule_name
|
92
|
+
return true unless role[section_name][rule_name]
|
93
|
+
role[section_name][rule_name] = false
|
94
|
+
update_attributes(:the_role => role.to_yaml)
|
95
|
+
end
|
96
|
+
|
97
|
+
# D
|
98
|
+
|
99
|
+
def delete_section section_name = nil
|
100
|
+
return false unless section_name
|
101
|
+
role = to_hash
|
102
|
+
section_name = param_prepare(section_name)
|
103
|
+
return false if section_name.blank?
|
104
|
+
return false unless role[section_name]
|
105
|
+
role.delete section_name
|
106
|
+
update_attributes(:the_role => role.to_yaml)
|
107
|
+
end
|
108
|
+
|
109
|
+
def delete_rule section_name, rule_name
|
110
|
+
role = to_hash
|
111
|
+
rule_name = param_prepare(rule_name)
|
112
|
+
section_name = param_prepare(section_name)
|
113
|
+
return false unless role[section_name]
|
114
|
+
return false unless role[section_name].key? rule_name
|
115
|
+
role[section_name].delete rule_name
|
116
|
+
update_attributes(:the_role => role.to_yaml)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module TheRole
|
2
|
+
module UserModel
|
3
|
+
include TheRole::Base
|
4
|
+
include TheRole::ParamHelper
|
5
|
+
def role_hash; @role_hash ||= role.to_hash; end
|
6
|
+
|
7
|
+
# FALSE if object is nil
|
8
|
+
# If object is a USER - check for youself
|
9
|
+
# Check for owner field - :user_id
|
10
|
+
# Check for owner _object_ if owner field is not :user_id
|
11
|
+
def owner? obj
|
12
|
+
return false unless obj
|
13
|
+
return true if admin?
|
14
|
+
|
15
|
+
section_name = obj.class.to_s.tableize
|
16
|
+
return true if moderator?(section_name)
|
17
|
+
|
18
|
+
return id == obj.id if obj.is_a?(User)
|
19
|
+
return id == obj[:user_id] if obj[:user_id]
|
20
|
+
return id == obj[:user][:id] if obj[:user]
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.included(base)
|
25
|
+
base.class_eval do
|
26
|
+
belongs_to :role
|
27
|
+
attr_accessible :role
|
28
|
+
after_save { |user| user.instance_variable_set(:@role_hash, nil) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/the_role/version.rb
CHANGED
data/pic.png
ADDED
Binary file
|
data/the_role.gemspec
CHANGED
@@ -17,10 +17,9 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
|
-
|
21
|
-
|
22
|
-
# s.add_development_dependency "rspec"
|
23
|
-
# s.add_runtime_dependency "rest-client"
|
24
|
-
s.add_dependency 'haml', '~> 3.0'
|
20
|
+
|
21
|
+
s.add_dependency 'haml'
|
25
22
|
s.add_dependency 'sass'
|
23
|
+
s.add_dependency 'sass-rails'
|
24
|
+
s.add_dependency 'coffee-rails'
|
26
25
|
end
|