Skip to content

Commit

Permalink
Merge pull request #3059 from jaredbeck/paper_trail_options
Browse files Browse the repository at this point in the history
Avoid using private API of PaperTrail
  • Loading branch information
mshibuya committed Sep 18, 2018
2 parents 171fb91 + a216c74 commit 6d08234
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
32 changes: 22 additions & 10 deletions lib/rails_admin/extensions/paper_trail/auditing_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ class AuditingAdapter
created_at: :created_at,
message: :event,
}.freeze
E_VERSION_MODEL_NOT_SET = <<-EOS.strip_heredoc.freeze
Please set up PaperTrail's version model explicitly.
config.audit_with :paper_trail, 'User', 'PaperTrail::Version'
If you have configured a model to use a custom version class
(https://github.com/paper-trail-gem/paper_trail#6a-custom-version-classes)
that configuration will take precedence over what you specify in
`audit_with`.
EOS

def self.setup
raise('PaperTrail not found') unless defined?(::PaperTrail)
Expand All @@ -59,7 +69,7 @@ def initialize(controller, user_class = 'User', version_class = '::Version')
begin
@version_class = version_class.to_s.constantize
rescue NameError
raise "Please set up Papertrail's version model explicitly. Ex: config.audit_with :paper_trail, 'User', 'PaperTrail::Version'"
raise E_VERSION_MODEL_NOT_SET
end
end

Expand Down Expand Up @@ -91,6 +101,7 @@ def listing_for_object(model, object, query, sort, sort_reverse, all, page, per_

protected

# - model - a RailsAdmin::AbstractModel
def listing_for_model_or_object(model, object, query, sort, sort_reverse, all, page, per_page)
if sort.present?
sort = COLUMN_MAPPING[sort.to_sym]
Expand All @@ -99,11 +110,10 @@ def listing_for_model_or_object(model, object, query, sort, sort_reverse, all, p
sort_reverse = 'true'
end

model_name = model.model.name

ar_model = model.model
current_page = page.presence || '1'

versions = version_class_for(model_name).where item_type: model_name
versions = version_class_for(ar_model).where item_type: ar_model.name
versions = versions.where item_id: object.id if object
versions = versions.where('event LIKE ?', "%#{query}%") if query.present?
versions = versions.order(sort_reverse == 'true' ? "#{sort} DESC" : sort)
Expand All @@ -116,12 +126,14 @@ def listing_for_model_or_object(model, object, query, sort, sort_reverse, all, p
paginated_proxies
end

def version_class_for(model_name)
klass = model_name.constantize.
try(:version_class_name).
try(:constantize)

klass || @version_class
# PT can be configured to use [custom version
# classes](https://github.com/paper-trail-gem/paper_trail#6a-custom-version-classes)
#
# ```ruby
# has_paper_trail class_name: 'MyVersion'
# ```
def version_class_for(model)
model.paper_trail_options[:class_name].try(:constantize) || @version_class
end
end
end
Expand Down
8 changes: 7 additions & 1 deletion spec/integration/history/rails_admin_paper_trail_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,13 @@
@user = FactoryBot.create :user
@paper_trail_test = FactoryBot.create :paper_trail_test
with_versioning do
PaperTrail.whodunnit = @user.id
# `PaperTrail.whodunnit` deprecated in PT 9, will be removed in 10.
# Use `PaperTrail.request.whodunnit` instead.
if PaperTrail.respond_to?(:request)
PaperTrail.request.whodunnit = @user.id
else
PaperTrail.whodunnit = @user.id
end
30.times do |i|
@paper_trail_test.update!(name: "updated name #{i}")
end
Expand Down

0 comments on commit 6d08234

Please sign in to comment.