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) ⇒ Object (private)

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)



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/joinable/permissions_attribute_wrapper.rb', line 119

def method_missing(method_name, *args)
  # add permission_for accessors and mutators

  # NOTE: Don't mess with the method_name variable (e.g. change it to a string)
  # since upstream methods might assume it is a symbol.
  # NOTE: Ensure we enforce some characters before the '_permission' suffix because Rails 3 creates 
  if respond_to?(:joinable_type) && joinable_type.present?
    if method_name.to_s =~ /.+_permissions/
      return component_permissions_reader(method_name)
    elsif method_name.to_s =~ /.+_permission/
      return single_permission_reader(method_name)
    else
      super
    end
  else
    super
  end
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
  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
    self[:permissions] = permissions.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