module Audited::Auditor::AuditedInstanceMethods
def audit_create
def audit_create write_audit(:action => 'create', :audited_changes => audited_attributes, :comment => audit_comment) end
def audit_destroy
def audit_destroy write_audit(:action => 'destroy', :audited_changes => audited_attributes, :comment => audit_comment) end
def audit_update
def audit_update unless (changes = audited_changes).empty? && audit_comment.blank? write_audit(:action => 'update', :audited_changes => changes, :comment => audit_comment) end end
def audited_attributes
def audited_attributes attributes.except(*non_audited_columns) end
def audited_changes
def audited_changes changed_attributes.except(*non_audited_columns).inject({}) do |changes,(attr, old_value)| changes[attr] = [old_value, self[attr]] changes end end
def audits_to(version = nil)
def audits_to(version = nil) if version == :previous version = if self.version self.version - 1 else previous = audits.descending.offset(1).first previous ? previous.version : 1 end end audits.to_version(version) end
def empty_callback #:nodoc:
def empty_callback #:nodoc: end
def require_comment
def require_comment if auditing_enabled && audit_comment.blank? errors.add(:audit_comment, "Comment required before destruction") return false end end
def revision(version)
def revision(version) revision_with Audited.audit_class.reconstruct_attributes(audits_to(version)) end
def revision_at(date_or_time)
def revision_at(date_or_time) audits = self.audits.up_until(date_or_time) revision_with Audited.audit_class.reconstruct_attributes(audits) unless audits.empty? end
def revision_with(attributes)
def revision_with(attributes) self.dup.tap do |revision| revision.id = id revision.send :instance_variable_set, '@attributes', self.attributes revision.send :instance_variable_set, '@new_record', self.destroyed? revision.send :instance_variable_set, '@persisted', !self.destroyed? revision.send :instance_variable_set, '@readonly', false revision.send :instance_variable_set, '@destroyed', false revision.send :instance_variable_set, '@_destroyed', false revision.send :instance_variable_set, '@marked_for_destruction', false Audited.audit_class.assign_revision_attributes(revision, attributes) # Remove any association proxies so that they will be recreated # and reference the correct object for this revision. The only way # to determine if an instance variable is a proxy object is to # see if it responds to certain methods, as it forwards almost # everything to its target. for ivar in revision.instance_variables proxy = revision.instance_variable_get ivar if !proxy.nil? and proxy.respond_to? :proxy_respond_to? revision.instance_variable_set ivar, nil end end end end
def revisions(from_version = 1)
end
user.version
user.name
user.revisions.each do |revision|
Gets an array of the revisions available
def revisions(from_version = 1) audits = self.audits.from_version(from_version) return [] if audits.empty? revisions = [] audits.each do |audit| revisions << audit.revision end revisions end
def save_without_auditing
def save_without_auditing without_auditing { save } end
def without_auditing(&block)
end
@foo.save
@foo.without_auditing do
Executes the block with the auditing callbacks disabled.
def without_auditing(&block) self.class.without_auditing(&block) end
def write_audit(attrs)
def write_audit(attrs) attrs[:associated] = self.send(audit_associated_with) unless audit_associated_with.nil? self.audit_comment = nil run_callbacks(:audit) { self.audits.create(attrs) } if auditing_enabled end