Module: Joinable::PermissionsAttributeWrapper

Included in:
DefaultPermissionSet, Membership, MembershipInvitation
Defined in:
lib/joinable/permissions_attribute_wrapper.rb

Overview

:nodoc:

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args, &block) ⇒ Object

Adds readers for component permission groups and single permissions

Used by advanced permission forms to determine how which options to select in the various fields. (eg. which option of f.select :labels_permissions to choose)



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 105

def method_missing(method_name, *args, &block)      
  # NOTE: As of Rails 4, respond_to? must be checked inside the case statement otherwise it breaks regular AR attribute accessors
  case method_name.to_s
  when /.+_permissions/
    return component_permissions_reader(method_name) if respond_to?(:joinable_type) && joinable_type.present?
  when /.+_permission/
    return single_permission_reader(method_name) if respond_to?(:joinable_type) && joinable_type.present?
  end

  super
end

Class Method Details

.included(base) ⇒ Object



7
8
9
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 7

def self.included(base)
  base.before_save :verify_and_sort_permissions
end

Instance Method Details

#allowed_permissionsObject

Returns an array of the permissions allowed by the joinable



50
51
52
53
54
55
56
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 50

def allowed_permissions
  if self[:joinable_type]
    self[:joinable_type].constantize.permissions
  else
    raise "Cannot get allowed access levels because permission is not attached to a permissable yet: #{inspect}"
  end
end

#doesnt_have_permission?(*levels) ⇒ Boolean

Returns true if none of the permissions specified by levels are present

Returns:

  • (Boolean)


68
69
70
71
72
73
74
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 68

def doesnt_have_permission?(*levels)
  if permissions - levels == permissions
    return true
  else
    return false
  end
end

#grant_permissions(permissions_to_grant) ⇒ Object



90
91
92
93
94
95
96
97
98
99
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 90

def grant_permissions(permissions_to_grant)
  case permissions_to_grant
  when String
    permissions_to_grant = permissions_to_grant.split(' ').collect(&:to_sym)
  when Symbol
    permissions_to_grant = [permissions_to_grant]
  end

  self.permissions += permissions_to_grant
end

#has_permission?(*levels) ⇒ Boolean

Returns true if the object has all the permissions specified by levels

Returns:

  • (Boolean)


59
60
61
62
63
64
65
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 59

def has_permission?(*levels)
  if levels.all? { |level| permissions.include? level.to_sym }
    return true
  else
    return false
  end
end

#no_permissions?Boolean

Returns true if the object has an empty permission set

Returns:

  • (Boolean)


77
78
79
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 77

def no_permissions?
  permissions.empty?
end

#only_permission_to?(*levels) ⇒ Boolean

Returns true if the object only has the permissions in levels

Returns:

  • (Boolean)


82
83
84
85
86
87
88
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 82

def only_permission_to?(*levels)
  if permissions - levels == []
    return true
  else
    return false
  end
end

#permission_attributes=(permissions) ⇒ Object

Used by advanced permission forms which group permissions by their associated component or using a single check box per permission.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 33

def permission_attributes=(permissions)
  self.permissions = [] # Reset permissions in anticipation for re-population

  permissions.each do |key, value|
    key, value = key.dup, value.dup
  
    # Component Permissions
    if key.ends_with? "_permissions"
      grant_permissions(value)
    # Singular Permission
    elsif key.chomp! "_permission"
      grant_permissions(key) if value.to_i != 0
    end
  end
end

#permissionsObject

Returns an array of the permissions as symbols



16
17
18
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 16

def permissions
  Array.wrap(self[:permissions]).collect(&:to_sym)
end

#permissions=(permissions) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 20

def permissions=(permissions)
  case permissions
  when String, Symbol
    self[:permissions] = permissions.to_s.split(' ')
  when Array
    self[:permissions] = permissions
  else
    raise "Permissions were not passed to permissions writer in the appropriate format"
  end
end

#permissions_stringObject



11
12
13
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 11

def permissions_string
  self[:permissions].join(' ')
end

#respond_to?(method_name, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


117
118
119
120
121
122
123
124
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 117

def respond_to?(method_name, include_private = false)
  case method_name.to_s
  when /.+_permissions?/
    return true if respond_to?(:joinable_type) && joinable_type.present?
  end

  super
end