module Pravangi::Model

Public Instance Methods

approve_pending_changes() click to toggle source
# File lib/pravangi/requires_approval.rb, line 61
def approve_pending_changes
  self.pending_approvals.each(&:approve_changes)
  self.touch
  self.reload
end
pending_approval?() click to toggle source
# File lib/pravangi/requires_approval.rb, line 57
def pending_approval?
  pending_approvals.present?
end
pravangi_object_changes() click to toggle source
# File lib/pravangi/requires_approval.rb, line 36
def pravangi_object_changes
  self.changes.except(*self.class.pravangi_options[:skip_attributes])
end
reject_pending_changes() click to toggle source
# File lib/pravangi/requires_approval.rb, line 67
def reject_pending_changes
  self.pending_approvals.each(&:reject_changes)
  self.touch
  self.reload
end
requires_approval(options = {}) click to toggle source
# File lib/pravangi/requires_approval.rb, line 14
def requires_approval(options = {})
  class_attribute :pravangi_options
  self.pravangi_options = options.dup

  attr_accessor :skip_approval

  class_eval do 
    def should_track_approval?
      self.send(self.class.pravangi_options[:if]) && !skip_approval
    end
  end

  before_update :track_approval, if: :should_track_approval?

  has_many :pending_approvals, 
    lambda { order('id ASC') },
    class_name: 'Pravangi::PendingApproval',
    as: :resource
end
should_track_approval?() click to toggle source
# File lib/pravangi/requires_approval.rb, line 21
def should_track_approval?
  self.send(self.class.pravangi_options[:if]) && !skip_approval
end
track_approval() click to toggle source
# File lib/pravangi/requires_approval.rb, line 40
def track_approval
  warn('Pravangi: The record cannot be updated, because it requires approval.')
  if changed?
    original = self.clone
    original.pending_approvals.build(
      object_changes: original.pravangi_object_changes,
      raw_object: original.to_yaml
      ).save
    self.reload

    skip_attributes = Array(self.class.pravangi_options[:skip_attributes])
    skip_attributes.each do |attr|
      self[attr] = original[attr]
    end
  end
end