Skip to content

Commit f0de1cf

Browse files
committed
PaperTrail + Inheritance
1 parent e0eb6ca commit f0de1cf

File tree

5 files changed

+149
-84
lines changed

5 files changed

+149
-84
lines changed

lib/rails_admin/extensions/paper_trail/auditing_adapter.rb

+15-4
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,9 @@ def listing_for_model_or_object(model, object, query, sort, sort_reverse, all, p
9797
sort_reverse = 'true'
9898
end
9999

100-
model_name = model.model.name
101-
102100
current_page = page.presence || '1'
103101

104-
versions = version_class_for(model_name).where item_type: model_name
105-
versions = versions.where item_id: object.id if object
102+
versions = object.nil? ? versions_for_model(model) : object.versions
106103
versions = versions.where('event LIKE ?', "%#{query}%") if query.present?
107104
versions = versions.order(sort_reverse == 'true' ? "#{sort} DESC" : sort)
108105
versions = all ? versions : versions.send(Kaminari.config.page_method_name, current_page).per(per_page)
@@ -114,6 +111,20 @@ def listing_for_model_or_object(model, object, query, sort, sort_reverse, all, p
114111
paginated_proxies
115112
end
116113

114+
def versions_for_model(model)
115+
model_name = model.model.name
116+
base_class_name = model.model.base_class.name
117+
118+
options =
119+
if base_class_name == model_name
120+
{item_type: model_name}
121+
else
122+
{item_type: base_class_name, item_id: model.model.all}
123+
end
124+
125+
version_class_for(model_name).where(options)
126+
end
127+
117128
def version_class_for(model_name)
118129
klass = model_name.constantize.
119130
try(:version_class_name).
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class PaperTrailTest < ActiveRecord::Base
2+
class SubclassInNamespace < self
3+
end
4+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
class PaperTrailTestSubclass < PaperTrailTest
2+
end

spec/factories.rb

+8
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,13 @@
8181

8282
factory :paper_trail_test do
8383
sequence(:name) { |n| "name #{n}" }
84+
85+
factory :paper_trail_test_subclass,
86+
parent: :paper_trail_test,
87+
class: 'PaperTrailTestSubclass'
88+
89+
factory :paper_trail_test_subclass_in_namespace,
90+
parent: :paper_trail_test,
91+
class: 'PaperTrailTest::SubclassInNamespace'
8492
end
8593
end

spec/integration/history/rails_admin_paper_trail_spec.rb

+120-80
Original file line numberDiff line numberDiff line change
@@ -15,115 +15,155 @@
1515
end
1616
end
1717

18-
describe 'on object creation', type: :request do
19-
subject { page }
20-
before do
21-
@user = FactoryGirl.create :user
22-
RailsAdmin::Config.authenticate_with { warden.authenticate! scope: :user }
23-
RailsAdmin::Config.current_user_method(&:current_user)
24-
login_as @user
25-
with_versioning do
26-
visit new_path(model_name: 'paper_trail_test')
27-
fill_in 'paper_trail_test[name]', with: 'Jackie Robinson'
28-
click_button 'Save'
29-
@object = RailsAdmin::AbstractModel.new('PaperTrailTest').first
18+
shared_examples :paper_on_object_creation do
19+
describe 'on object creation', type: :request do
20+
subject { page }
21+
before do
22+
@user = FactoryGirl.create :user
23+
RailsAdmin::Config.authenticate_with { warden.authenticate! scope: :user }
24+
RailsAdmin::Config.current_user_method(&:current_user)
25+
login_as @user
26+
with_versioning do
27+
visit new_path(model_name: paper_model_name)
28+
fill_in paper_field_name, with: 'Jackie Robinson'
29+
click_button 'Save'
30+
@object = RailsAdmin::AbstractModel.new(paper_class_name).first
31+
end
3032
end
31-
end
3233

33-
it 'records a version' do
34-
expect(@object.versions.size).to eq 1
35-
expect(@object.versions.first.whodunnit).to eq @user.id.to_s
34+
it 'records a version' do
35+
expect(@object.versions.size).to eq 1
36+
expect(@object.versions.first.whodunnit).to eq @user.id.to_s
37+
end
3638
end
3739
end
3840

39-
describe 'model history fetch' do
40-
before(:each) do
41-
PaperTrail::Version.delete_all
42-
@model = RailsAdmin::AbstractModel.new('PaperTrailTest')
43-
@user = FactoryGirl.create :user
44-
@paper_trail_test = FactoryGirl.create :paper_trail_test
45-
with_versioning do
46-
PaperTrail.whodunnit = @user.id
47-
30.times do |i|
48-
@paper_trail_test.update!(name: "updated name #{i}")
41+
shared_examples :paper_history do
42+
describe 'model history fetch' do
43+
before(:each) do
44+
PaperTrail::Version.delete_all
45+
@model = RailsAdmin::AbstractModel.new(paper_class_name)
46+
@user = FactoryGirl.create :user
47+
@paper_trail_test = FactoryGirl.create(paper_factory)
48+
with_versioning do
49+
PaperTrail.whodunnit = @user.id
50+
30.times do |i|
51+
@paper_trail_test.update!(name: "updated name #{i}")
52+
end
4953
end
5054
end
51-
end
52-
53-
it 'creates versions' do
54-
expect(PaperTrail::Version.count).to eq(30)
55-
end
56-
57-
describe 'model history fetch with auditing adapter' do
58-
before(:all) do
59-
@adapter = RailsAdmin::Extensions::PaperTrail::AuditingAdapter.new(nil, 'User', 'PaperTrail::Version')
60-
end
61-
62-
it 'fetches on page of history' do
63-
versions = @adapter.listing_for_model @model, nil, false, false, false, nil, 20
64-
expect(versions.total_count).to eq(30)
65-
expect(versions.count).to eq(20)
66-
end
6755

68-
it 'respects RailsAdmin::Config.default_items_per_page' do
69-
RailsAdmin.config.default_items_per_page = 15
70-
versions = @adapter.listing_for_model @model, nil, false, false, false, nil
71-
expect(versions.total_count).to eq(30)
72-
expect(versions.count).to eq(15)
56+
it 'creates versions' do
57+
expect(PaperTrail::Version.count).to eq(30)
7358
end
7459

75-
it 'sets correct next page' do
76-
versions = @adapter.listing_for_model @model, nil, false, false, false, 2, 10
77-
expect(versions.next_page).to eq(3)
78-
end
60+
describe 'model history fetch with auditing adapter' do
61+
before(:all) do
62+
@adapter = RailsAdmin::Extensions::PaperTrail::AuditingAdapter.new(nil, 'User', 'PaperTrail::Version')
63+
end
7964

80-
it 'can fetch all history' do
81-
versions = @adapter.listing_for_model @model, nil, false, false, true, nil, 20
82-
expect(versions.total_count).to eq(30)
83-
expect(versions.count).to eq(30)
84-
end
65+
it 'fetches on page of history' do
66+
versions = @adapter.listing_for_model @model, nil, false, false, false, nil, 20
67+
expect(versions.total_count).to eq(30)
68+
expect(versions.count).to eq(20)
69+
end
8570

86-
describe 'returned version objects' do
87-
before(:each) do
88-
@padinated_listing = @adapter.listing_for_model @model, nil, false, false, false, nil
89-
@version = @padinated_listing.first
71+
it 'respects RailsAdmin::Config.default_items_per_page' do
72+
RailsAdmin.config.default_items_per_page = 15
73+
versions = @adapter.listing_for_model @model, nil, false, false, false, nil
74+
expect(versions.total_count).to eq(30)
75+
expect(versions.count).to eq(15)
9076
end
9177

92-
it '#username returns user email' do
93-
expect(@version.username).to eq(@user.email)
78+
it 'sets correct next page' do
79+
versions = @adapter.listing_for_model @model, nil, false, false, false, 2, 10
80+
expect(versions.next_page).to eq(3)
9481
end
9582

96-
it '#message returns event' do
97-
expect(@version.message).to eq('update')
83+
it 'can fetch all history' do
84+
versions = @adapter.listing_for_model @model, nil, false, false, true, nil, 20
85+
expect(versions.total_count).to eq(30)
86+
expect(versions.count).to eq(30)
9887
end
9988

100-
describe 'changed item attributes' do
101-
it '#item returns item.id' do
102-
expect(@version.item).to eq(@paper_trail_test.id)
89+
describe 'returned version objects' do
90+
before(:each) do
91+
@padinated_listing = @adapter.listing_for_model @model, nil, false, false, false, nil
92+
@version = @padinated_listing.first
10393
end
10494

105-
it '#table returns item class name' do
106-
expect(@version.table.to_s).to eq('PaperTrailTest')
95+
it '#username returns user email' do
96+
expect(@version.username).to eq(@user.email)
10797
end
108-
end
10998

110-
context 'with Kaminari' do
111-
before do
112-
@paged = @adapter.listing_for_model @model, nil, false, false, false, nil
113-
Kaminari.config.page_method_name = :per_page_kaminari
99+
it '#message returns event' do
100+
expect(@version.message).to eq('update')
114101
end
115102

116-
after do
117-
Kaminari.config.page_method_name = :page
103+
describe 'changed item attributes' do
104+
it '#item returns item.id' do
105+
expect(@version.item).to eq(@paper_trail_test.id)
106+
end
107+
108+
it '#table returns item class name' do
109+
expect(@version.table.to_s).to eq('PaperTrailTest')
110+
end
118111
end
119112

120-
it "supports pagination when Kaminari's page_method_name is customized" do
121-
expect(PaperTrail::Version).to receive(:per_page_kaminari).twice.and_return(@paged)
122-
@adapter.listing_for_model @model, nil, false, false, false, nil
123-
@adapter.listing_for_object @model, @paper_trail_test, nil, false, false, false, nil
113+
context 'with Kaminari' do
114+
before do
115+
@paged = @adapter.listing_for_model @model, nil, false, false, false, nil
116+
Kaminari.config.page_method_name = :per_page_kaminari
117+
end
118+
119+
after do
120+
Kaminari.config.page_method_name = :page
121+
end
122+
123+
it "supports pagination when Kaminari's page_method_name is customized" do
124+
expect(PaperTrail::Version).to receive(:per_page_kaminari).twice.and_return(@paged)
125+
@adapter.listing_for_model @model, nil, false, false, false, nil
126+
@adapter.listing_for_object @model, @paper_trail_test, nil, false, false, false, nil
127+
end
124128
end
125129
end
126130
end
127131
end
128132
end
133+
134+
context 'PaperTrailTest' do
135+
let(:paper_class_name) { 'PaperTrailTest' }
136+
let(:paper_factory) { :paper_trail_test }
137+
138+
it_behaves_like :paper_on_object_creation do
139+
let(:paper_model_name) { 'paper_trail_test' }
140+
let(:paper_field_name) { 'paper_trail_test[name]' }
141+
end
142+
143+
it_behaves_like :paper_history
144+
end
145+
146+
context 'PaperTrailTestSubclass' do
147+
let(:paper_class_name) { 'PaperTrailTestSubclass' }
148+
let(:paper_factory) { :paper_trail_test_subclass }
149+
150+
it_behaves_like :paper_on_object_creation do
151+
let(:paper_model_name) { 'paper_trail_test_subclass' }
152+
let(:paper_field_name) { 'paper_trail_test_subclass[name]' }
153+
end
154+
155+
it_behaves_like :paper_history
156+
end
157+
158+
context 'PaperTrailTest::SubclassInNamespace' do
159+
let(:paper_class_name) { 'PaperTrailTest::SubclassInNamespace' }
160+
let(:paper_factory) { :paper_trail_test_subclass_in_namespace }
161+
162+
it_behaves_like :paper_on_object_creation do
163+
let(:paper_model_name) { 'paper_trail_test~subclass_in_namespace' }
164+
let(:paper_field_name) { 'paper_trail_test_subclass_in_namespace[name]' }
165+
end
166+
167+
it_behaves_like :paper_history
168+
end
129169
end

0 commit comments

Comments
 (0)