14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
# File 'lib/aegis/has_role.rb', line 14
def has_role(options = {})
options[:accessor] ||= options.delete(:name_accessor)
options[:reader] ||= options.delete(:name_reader)
options[:writer] ||= options.delete(:name_writer)
if options[:accessor]
options[:reader] = "#{options[:accessor]}"
options[:writer] = "#{options[:accessor]}="
options.delete(:accessor)
end
self.class_eval do
class_inheritable_accessor :aegis_role_name_reader, :aegis_role_name_writer, :aegis_default_role_name
unless method_defined?(:after_initialize)
def after_initialize
end
end
if options[:default]
self.aegis_default_role_name = options[:default].to_s
after_initialize :set_default_aegis_role_name
end
self.aegis_role_name_reader = (options[:reader] || "role_name").to_sym
self.aegis_role_name_writer = (options[:writer] || "role_name=").to_sym
def aegis_role_name_reader
self.class.class_eval{ aegis_role_name_reader }
end
def aegis_role_name_writer
self.class.class_eval{ aegis_role_name_writer }
end
def aegis_role_name
send(aegis_role_name_reader)
end
def aegis_role_name=(value)
send(aegis_role_name_writer, value)
end
def role
::Permissions.find_role_by_name!(aegis_role_name)
end
def role=(role_or_name)
self.aegis_role_name = if role_or_name.is_a?(Aegis::Role)
role_or_name.name
else
role_or_name.to_s
end
end
if options[:special_permissions]
self.class_eval do
self.has_many :special_permissions, :foreign_key => "user_id"
end
@class_name = self.class_name.underscore
SpecialPermission.class_eval "belongs_to :#{@class_name}, :foreign_key => 'user_id'"
end
private
def method_missing_with_aegis_permissions(symb, *args)
method_name = symb.to_s
if method_name =~ /^#{Aegis::Constants::PERMISSION_PREFIX}_(.+?)[\!\?]$/
role.send(symb, self, *args)
elsif method_name =~ /^(.*?)\?$/ && queried_role = ::Permissions.find_role_by_name($1)
role == queried_role
else
method_missing_without_aegis_permissions(symb, *args)
end
end
alias_method_chain :method_missing, :aegis_permissions
def respond_to_with_aegis_permissions?(symb, include_private = false)
if symb.to_s =~ /^#{Aegis::Constants::PERMISSION_PREFIX}_(.+?)[\!\?]$/
true
else
respond_to_without_aegis_permissions?(symb, include_private)
end
end
alias_method_chain :respond_to?, :aegis_permissions
def set_default_aegis_role_name
if new_record? && self.aegis_role_name.blank?
self.aegis_role_name = self.class.aegis_default_role_name
end
end
end
end
|