9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/active_admin/audit/has_versions.rb', line 9
def has_versions(options = {})
options[:also_include] ||= {}
options[:skip] ||= []
options[:skip] += options[:also_include].keys
if respond_to?(:translated_attrs)
options[:skip] += translated_attrs.map { |attr| "#{attr}_translations" }
end
has_paper_trail options.merge(on: [], class_name: 'ActiveAdmin::Audit::ContentVersion', meta: {
additional_objects: ->(record) { record.additional_objects_snapshot.to_json },
additional_objects_changes: ->(record) { record.additional_objects_snapshot_changes.to_json },
})
class_eval do
define_method(:additional_objects_snapshot) do
options[:also_include].each_with_object(VersionSnapshot.new) do |(attr, scheme), snapshot|
snapshot[attr] =
if scheme.is_a? Symbol
send(scheme)
elsif scheme.empty?
send(attr)
else
Array(send(attr)).map do |item|
scheme.each_with_object({}) do |item_attr, item_snapshot|
item_snapshot[item_attr] = item.send(item_attr)
end
end
end
end
end
after_commit do
if paper_trail.enabled?
if @event_for_paper_trail
generate_version!
end
end
end
options_on = Array(options.fetch(:on, [:create, :update, :destroy]))
if options_on.include?(:create)
after_create do
if paper_trail.enabled?
@event_for_paper_trail = 'create'
end
end
end
if options_on.include?(:update)
after_update do
if paper_trail.enabled?
@event_for_paper_trail = 'update'
cache_version_object_changes
end
end
end
if options_on.include?(:destroy)
before_destroy do
if paper_trail.enabled?
@event_for_paper_trail = 'destroy'
cache_version_object
cache_version_object_changes
cache_version_additional_objects_and_changes
end
end
end
end
end
|