diff --git a/README.md b/README.md index e7b30798..adcb17bd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ +# Extended + +Added the possibility to disable/enable PaperTrail from a controller. + + class ApplicationController + def paper_trail_enabled_if + request.user_agent != 'Disable User-Agent' + end + end + + # PaperTrail PaperTrail lets you track changes to your models' data. It's good for auditing or versioning. You can see how a model looked at any stage in its lifecycle, revert it to any version, and even undelete it after it's been destroyed. diff --git a/lib/paper_trail.rb b/lib/paper_trail.rb index 4a437c86..d1086dd4 100644 --- a/lib/paper_trail.rb +++ b/lib/paper_trail.rb @@ -20,7 +20,21 @@ module PaperTrail !!PaperTrail.config.enabled end - + # Returns if PaperTrails is disabled by controller + def self.request_disabled + paper_trail_store[:request_disabled] + end + + # Sets if PaperTrails is disabled by controller + def self.request_disabled=(value) + paper_trail_store[:request_disabled] = value + end + + # Sets if PaperTrails is disabled by controller + def self.request_disabled? + paper_trail_store[:request_disabled] === true + end + # Returns who is reponsible for any changes that occur. def self.whodunnit paper_trail_store[:whodunnit] diff --git a/lib/paper_trail/controller.rb b/lib/paper_trail/controller.rb index b4de7c4e..b517d15f 100644 --- a/lib/paper_trail/controller.rb +++ b/lib/paper_trail/controller.rb @@ -4,6 +4,7 @@ module PaperTrail def self.included(base) base.before_filter :set_paper_trail_whodunnit base.before_filter :set_paper_trail_controller_info + base.before_filter :set_paper_trail_enabled_if end protected @@ -39,7 +40,14 @@ module PaperTrail end private - + + # Tells PaperTrail if version should be saved. + def set_paper_trail_enabled_if + if respond_to? :paper_trail_enabled_if + ::PaperTrail.request_disabled = !paper_trail_enabled_if + end + end + # Tells PaperTrail who is responsible for any changes that occur. def set_paper_trail_whodunnit ::PaperTrail.whodunnit = user_for_paper_trail diff --git a/lib/paper_trail/has_paper_trail.rb b/lib/paper_trail/has_paper_trail.rb index 2e2556df..103c7dc3 100644 --- a/lib/paper_trail/has_paper_trail.rb +++ b/lib/paper_trail/has_paper_trail.rb @@ -167,10 +167,10 @@ module PaperTrail changed - self.class.ignore end - # Returns `true` if PaperTrail is globally enabled and active for this class, - # `false` otherwise. + # Returns `true` if controller method paper_trail_enabled_if doesn't return false, + # PaperTrail is globally enabled and active for this class, `false` otherwise. def switched_on? - PaperTrail.enabled? && self.class.paper_trail_active + !PaperTrail.request_disabled? && PaperTrail.enabled? && self.class.paper_trail_active end end diff --git a/test/dummy/app/controllers/application_controller.rb b/test/dummy/app/controllers/application_controller.rb index 41b9ce3c..29a85977 100644 --- a/test/dummy/app/controllers/application_controller.rb +++ b/test/dummy/app/controllers/application_controller.rb @@ -13,4 +13,5 @@ class ApplicationController < ActionController::Base def info_for_paper_trail {:ip => request.remote_ip, :user_agent => request.user_agent} end + end diff --git a/test/dummy/app/controllers/widgets_controller.rb b/test/dummy/app/controllers/widgets_controller.rb index a791580c..638c91df 100644 --- a/test/dummy/app/controllers/widgets_controller.rb +++ b/test/dummy/app/controllers/widgets_controller.rb @@ -1,4 +1,9 @@ class WidgetsController < ApplicationController + + def paper_trail_enabled_if + request.user_agent != 'Disable User-Agent' + end + def create @widget = Widget.create params[:widget] head :ok diff --git a/test/functional/controller_test.rb b/test/functional/controller_test.rb index d9c15123..a3cdc829 100644 --- a/test/functional/controller_test.rb +++ b/test/functional/controller_test.rb @@ -6,6 +6,36 @@ class ControllerTest < ActionController::TestCase setup do @request.env['REMOTE_ADDR'] = '127.0.0.1' end + + teardown do + PaperTrail.request_disabled = false + end + + test 'disable on create' do + @request.env['HTTP_USER_AGENT'] = 'Disable User-Agent' + post :create, :widget => { :name => 'Flugel' } + assert_equal 0, assigns(:widget).versions.length + end + + test 'disable on update' do + @request.env['HTTP_USER_AGENT'] = 'Disable User-Agent' + post :create, :widget => { :name => 'Flugel' } + w = assigns(:widget) + assert_equal 0, w.versions.length + put :update, :id => w.id, :widget => { :name => 'Bugle' } + widget = assigns(:widget) + assert_equal 0, widget.versions.length + end + + test 'disable on destroy' do + @request.env['HTTP_USER_AGENT'] = 'Disable User-Agent' + post :create, :widget => { :name => 'Flugel' } + w = assigns(:widget) + assert_equal 0, w.versions.length + delete :destroy, :id => w.id + widget = assigns(:widget) + assert_equal 0, Version.with_item_keys('Widget', w.id).size + end test 'create' do post :create, :widget => { :name => 'Flugel' }