Class: EgovUtils::ModelPermissions

Inherits:
Object
  • Object
show all
Defined in:
lib/egov_utils/model_permissions.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model, ability) ⇒ ModelPermissions

Returns a new instance of ModelPermissions.



20
21
22
# File 'lib/egov_utils/model_permissions.rb', line 20

def initialize(model, ability)
  @model, @ability = model, ability
end

Instance Attribute Details

#abilityObject (readonly)

Returns the value of attribute ability.



18
19
20
# File 'lib/egov_utils/model_permissions.rb', line 18

def ability
  @ability
end

#modelObject (readonly)

Returns the value of attribute model.



18
19
20
# File 'lib/egov_utils/model_permissions.rb', line 18

def model
  @model
end

Class Method Details

.build(model, ability) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
# File 'lib/egov_utils/model_permissions.rb', line 4

def self.build(model, ability)
  klass = model
  klasses = [klass]
  while klass != klass.base_class
    klass = klass.superclass
    klasses << klass
  end
  klasses.each do |kls|
    perm_class = "#{kls.name}Permissions".safe_constantize
    return perm_class.new(ability) if perm_class
  end
  EgovUtils::ModelPermissions.new(model, ability)
end

Instance Method Details

#add_editable_association_attributes(attributes, assoc, action) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/egov_utils/model_permissions.rb', line 55

def add_editable_association_attributes(attributes, assoc, action)
  assoc_permissions = self.class.build(assoc.klass, ability)

  assoc_attributes  = assoc_permissions.editable_attributes(action)
  assoc_attributes.unshift('id') if ability.can?(:update, assoc.klass)
  assoc_attributes_hash = { "#{assoc.name}_attributes" => assoc_attributes }

  case assoc.macro
  when :has_many
    attributes << assoc_attributes_hash
  when :has_one, :belongs_to
    if ability.can?(:update, assoc.klass)
      attributes << assoc.foreign_key if assoc.macro == :belongs_to
      attributes << assoc_attributes_hash
    else
      attributes << assoc_attributes_hash
    end
  else
    attributes << assoc_attributes_hash
  end
end

#add_editable_association_attributes_for(attributes, assoc, entity, action) ⇒ Object



77
78
79
80
81
82
83
84
# File 'lib/egov_utils/model_permissions.rb', line 77

def add_editable_association_attributes_for(attributes, assoc, entity, action)
  case assoc.macro
  when :has_many

  else
    add_editable_association_attributes(attributes, assoc, action)
  end
end

#assignable_associationsObject



36
37
38
# File 'lib/egov_utils/model_permissions.rb', line 36

def assignable_associations
  model.reflect_on_all_associations.select{|assoc| model.method_defined?("#{assoc.name}_attributes=".to_sym) }
end

#basic_editable_attributes(action = :update) ⇒ Object



28
29
30
# File 'lib/egov_utils/model_permissions.rb', line 28

def basic_editable_attributes(action=:update)
  model.column_names - ['id', 'updated_at', 'created_at']
end

#basic_editable_attributes_for(entity, action = :update) ⇒ Object



32
33
34
# File 'lib/egov_utils/model_permissions.rb', line 32

def basic_editable_attributes_for(entity, action=:update)
  basic_editable_attributes(action)
end

#editable_attributes(action = :update) ⇒ Object



40
41
42
43
44
45
# File 'lib/egov_utils/model_permissions.rb', line 40

def editable_attributes(action=:update)
  return [] unless ability.can?(action, model)
  attributes = basic_editable_attributes(action)
  assignable_associations.each{|assoc| add_editable_association_attributes(attributes, assoc, action) }
  attributes
end

#editable_attributes_for(entity, action = :update) ⇒ Object

TODO nested attributes should take entity as well - what to do with has_many?



48
49
50
51
52
53
# File 'lib/egov_utils/model_permissions.rb', line 48

def editable_attributes_for(entity, action=:update)
  return [] unless ability.can?(action, entity)
  attributes = basic_editable_attributes(action)
  assignable_associations.each{|assoc| add_editable_association_attributes_for(attributes, assoc, entity, action) }
  attributes
end

#readable_attributes(action = :show) ⇒ Object



24
25
26
# File 'lib/egov_utils/model_permissions.rb', line 24

def readable_attributes(action=:show)
  model.column_names
end