wiser_trails 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +3 -3
- data/lib/wiser_trails/actions/update.rb +11 -2
- data/lib/wiser_trails/common.rb +11 -47
- data/lib/wiser_trails/renderable.rb +4 -5
- data/lib/wiser_trails/roles/trail_it.rb +12 -117
- data/lib/wiser_trails/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MzZmZDkyMjc4NDdhYTJiMzMxY2IzOTliMDZjZTk1NzhjMTExODlkNA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YjU2NTAwZGIwOGIzOGIxYWY0MzIyMDJlNzE2YWNjOWQ4Nzc1NmQ1OQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YWMyNzIxYzUyODRlYzY2NGRlYWM0ZDk5MjdmNTc0NTY5NWFhMDAxMThhOGJi
|
10
|
+
Y2QwM2E4NmFiMDEyNjhkYmM3OGE3M2RmNTc5MTA0YjZkNGVjZjY3NTFjODQ2
|
11
|
+
NDgxZmUyNTY1YjIwYzQzNjdkNjRiYTEyNWY2ODA2MWM4OTI4ZDM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MDYxMzgyNzg2ZDk1NDUzNThiZjE4NWUwOTBmNGFmNzdhYzkzNTVlNGY1N2I3
|
14
|
+
YjM0YmJmYjRiNTUwM2FiYzE3NjY5MGMxY2E5ZmIzODYyMmJiYzk5M2RhYmEw
|
15
|
+
ODQxODkxMDc0ZDRlYjY3NzlhMmVmZTNiZGU1ZGU4ZTFkMWY5Yjg=
|
data/README.md
CHANGED
@@ -17,7 +17,7 @@ You can do normal gem installation for `wiser_trails`:
|
|
17
17
|
or in your Gemfile:
|
18
18
|
|
19
19
|
```ruby
|
20
|
-
gem 'wiser_trails', ~>
|
20
|
+
gem 'wiser_trails', '~> 2.0.0'
|
21
21
|
```
|
22
22
|
|
23
23
|
Then restart your application.
|
@@ -65,8 +65,8 @@ Or even the `account` if you're having a multi-account structure:
|
|
65
65
|
class Notes < ActiveRecord::Base
|
66
66
|
include WiserTrails::Model
|
67
67
|
trail_it
|
68
|
-
owner: ->(controller, model) { controller && controller.
|
69
|
-
account: ->(controller, model) { controller && controller.
|
68
|
+
owner: ->(controller, model) { controller && controller.current_user },
|
69
|
+
account: ->(controller, model) { controller && controller.current_account }
|
70
70
|
end
|
71
71
|
```
|
72
72
|
|
@@ -10,13 +10,22 @@ module WiserTrails
|
|
10
10
|
private
|
11
11
|
# Creates activity upon modification of the tracked model
|
12
12
|
def initialize_activity
|
13
|
-
|
13
|
+
changed_attrs = strip_changed_attributes
|
14
|
+
create_activity(:update) if changed_attrs.count > 0
|
14
15
|
end
|
15
16
|
def activity_on_update
|
16
|
-
|
17
|
+
changed_attrs = strip_changed_attributes
|
18
|
+
if changed_attrs.count > 0
|
17
19
|
activity = Activity.where(trackable_id: self.id, trackable_type: self.class, key: "#{self.class.to_s.downcase}.update").last
|
18
20
|
activity.update_attribute(:new_value, activity.trackable.attributes.stringify_keys) if activity
|
19
21
|
end
|
20
22
|
end
|
23
|
+
def strip_changed_attributes
|
24
|
+
changed_attributes = self.changed_attributes
|
25
|
+
self.activity_skip_fields_global.each do |attr|
|
26
|
+
changed_attributes = changed_attributes.except(attr)
|
27
|
+
end
|
28
|
+
return changed_attributes
|
29
|
+
end
|
21
30
|
end
|
22
31
|
end
|
data/lib/wiser_trails/common.rb
CHANGED
@@ -23,8 +23,9 @@ module WiserTrails
|
|
23
23
|
|
24
24
|
included do
|
25
25
|
include Trackable
|
26
|
-
class_attribute :activity_owner_global, :activity_account_global,
|
27
|
-
:activity_new_value_global, :activity_hooks, :activity_custom_fields_global
|
26
|
+
class_attribute :activity_owner_global, :activity_account_global, :activity_skip_fields_global,
|
27
|
+
:activity_new_value_global, :activity_hooks, :activity_custom_fields_global,
|
28
|
+
:activity_force_fields_global
|
28
29
|
set_wiser_trails_class_defaults
|
29
30
|
end
|
30
31
|
|
@@ -71,49 +72,18 @@ module WiserTrails
|
|
71
72
|
# @return [Hash<Symbol, Object>]
|
72
73
|
attr_accessor :activity_new_value
|
73
74
|
@activity_new_value = {}
|
74
|
-
# Set or get owner object responsible for the {Activity}.
|
75
|
-
#
|
76
|
-
# == Usage:
|
77
|
-
#
|
78
|
-
# # where current_user is an object of logged in user
|
79
|
-
# @article.activity_owner = current_user
|
80
|
-
# # OR: take @article.author association
|
81
|
-
# @article.activity_owner = :author
|
82
|
-
# # OR: provide a Proc with custom code
|
83
|
-
# @article.activity_owner = proc {|controller, model| model.author }
|
84
|
-
# @article.save
|
85
|
-
# @article.activities.last.owner #=> Returns owner object
|
86
|
-
# @return [Model] Polymorphic model
|
87
|
-
# @see #activity_owner_global
|
88
75
|
attr_accessor :activity_owner
|
89
76
|
@activity_owner = nil
|
90
|
-
|
91
|
-
# Set or get recipient for activity.
|
92
|
-
#
|
93
|
-
# Association is polymorphic, thus allowing assignment of
|
94
|
-
# all types of models. This can be used for example in the case of sending
|
95
|
-
# private notifications for only a single user.
|
96
|
-
# @return (see #activity_owner)
|
97
77
|
attr_accessor :activity_account
|
98
78
|
@activity_account = nil
|
99
|
-
# Set or get custom i18n key passed to {Activity}, later used in {Renderable#text}
|
100
|
-
#
|
101
|
-
# == Usage:
|
102
|
-
#
|
103
|
-
# @article = Article.new
|
104
|
-
# @article.activity_key = "my.custom.article.key"
|
105
|
-
# @article.save
|
106
|
-
# @article.activities.last.key #=> "my.custom.article.key"
|
107
|
-
#
|
108
|
-
# @return [String]
|
109
79
|
attr_accessor :activity_key
|
110
80
|
@activity_key = nil
|
111
|
-
|
112
|
-
# Set or get custom fields for later processing
|
113
|
-
#
|
114
|
-
# @return [Hash]
|
115
81
|
attr_accessor :activity_custom_fields
|
116
82
|
@activity_custom_fields = {}
|
83
|
+
attr_accessor :activity_skip_fields_global
|
84
|
+
@activity_skip_fields_global = {}
|
85
|
+
attr_accessor :activity_force_fields_global
|
86
|
+
@activity_force_fields_global = {}
|
117
87
|
|
118
88
|
# @!visibility private
|
119
89
|
@@activity_hooks = {}
|
@@ -131,18 +101,10 @@ module WiserTrails
|
|
131
101
|
self.activity_new_value_global = {}
|
132
102
|
self.activity_hooks = {}
|
133
103
|
self.activity_custom_fields_global = {}
|
104
|
+
self.activity_skip_fields_global = {}
|
105
|
+
self.activity_force_fields_global = {}
|
134
106
|
end
|
135
107
|
|
136
|
-
# Extracts a hook from the _:on_ option provided in
|
137
|
-
# {Tracked::ClassMethods#tracked}. Returns nil when no hook exists for
|
138
|
-
# given action
|
139
|
-
# {Common#get_hook}
|
140
|
-
#
|
141
|
-
# @see Tracked#get_hook
|
142
|
-
# @param key [String, Symbol] action to retrieve a hook for
|
143
|
-
# @return [Proc, nil] callable hook or nil
|
144
|
-
# @since 0.4.0
|
145
|
-
# @api private
|
146
108
|
def get_hook(key)
|
147
109
|
key = key.to_sym
|
148
110
|
if self.activity_hooks.has_key?(key) and self.activity_hooks[key].is_a? Proc
|
@@ -335,6 +297,8 @@ module WiserTrails
|
|
335
297
|
@activity_owner = nil
|
336
298
|
@activity_account = nil
|
337
299
|
@activity_custom_fields = {}
|
300
|
+
@activity_skip_fields_global = {}
|
301
|
+
@activity_force_fields_global = {}
|
338
302
|
end
|
339
303
|
end
|
340
304
|
end
|
@@ -7,10 +7,10 @@ module WiserTrails
|
|
7
7
|
def text(params = {})
|
8
8
|
# TODO: some helper for key transformation for two supported formats
|
9
9
|
k = key.split('.')
|
10
|
-
k.unshift('
|
10
|
+
k.unshift('wiser_trails') if k.first != 'wiser_trails'
|
11
11
|
k = k.join('.')
|
12
12
|
|
13
|
-
I18n.t(k,
|
13
|
+
I18n.t(k, params || {})
|
14
14
|
end
|
15
15
|
|
16
16
|
# Renders activity from views.
|
@@ -91,15 +91,14 @@ module WiserTrails
|
|
91
91
|
|
92
92
|
locals = params.delete(:locals) || Hash.new
|
93
93
|
|
94
|
-
params_indifferent = self.
|
94
|
+
params_indifferent = self.new_value.with_indifferent_access
|
95
95
|
params_indifferent.merge!(params)
|
96
96
|
|
97
97
|
context.render params.merge(:partial => (partial_path || self.template_path(self.key)),
|
98
98
|
:layout => layout,
|
99
99
|
:locals => locals.merge(:a => self, :activity => self,
|
100
100
|
:controller => controller,
|
101
|
-
:current_user => controller.respond_to?(:current_user) ?
|
102
|
-
controller.current_user : nil ,
|
101
|
+
:current_user => controller.respond_to?(:current_user) ? controller.current_user : nil,
|
103
102
|
:p => params_indifferent, :params => params_indifferent))
|
104
103
|
end
|
105
104
|
|
@@ -2,31 +2,7 @@ module WiserTrails
|
|
2
2
|
# Main module extending classes we want to keep track of.
|
3
3
|
module TrailIt
|
4
4
|
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
# in one line. Accepts a hash with 3 keys:
|
7
|
-
# :key, :owner, :params. You can specify all of them or just the ones you want to overwrite.
|
8
|
-
#
|
9
|
-
# == Options
|
10
|
-
#
|
11
|
-
# [:key]
|
12
|
-
# See {Common#activity_key}
|
13
|
-
# [:owner]
|
14
|
-
# See {Common#activity_owner}
|
15
|
-
# [:params]
|
16
|
-
# See {Common#activity_new_value}
|
17
|
-
# [:recipient]
|
18
|
-
# Set the recipient for this activity. Useful for private notifications, which should only be visible to a certain user. See {Common#activity_account}.
|
19
|
-
# @example
|
20
|
-
#
|
21
|
-
# @article = Article.new
|
22
|
-
# @article.title = "New article"
|
23
|
-
# @article.activity :key => "my.custom.article.key", :owner => @article.author, :params => {:title => @article.title}
|
24
|
-
# @article.save
|
25
|
-
# @article.activities.last.key #=> "my.custom.article.key"
|
26
|
-
# @article.activities.last.parameters #=> {:title => "New article"}
|
27
|
-
#
|
28
|
-
# @param options [Hash] instance options to set on the tracked model
|
29
|
-
# @return [nil]
|
5
|
+
|
30
6
|
def activity(options = {})
|
31
7
|
rest = options.clone
|
32
8
|
self.activity_key = rest.delete(:key) if rest[:key]
|
@@ -39,102 +15,21 @@ module WiserTrails
|
|
39
15
|
|
40
16
|
# Module with basic +tracked+ method that enables tracking models.
|
41
17
|
module ClassMethods
|
42
|
-
# Adds required callbacks for creating and updating
|
43
|
-
# tracked models and adds +activities+ relation for listing
|
44
|
-
# associated activities.
|
45
|
-
#
|
46
|
-
# == Parameters:
|
47
|
-
# [:owner]
|
48
|
-
# Specify the owner of the {Activity} (person responsible for the action).
|
49
|
-
# It can be a Proc, Symbol or an ActiveRecord object:
|
50
|
-
# == Examples:
|
51
|
-
#
|
52
|
-
# tracked :owner => :author
|
53
|
-
# tracked :owner => proc {|o| o.author}
|
54
|
-
#
|
55
|
-
# Keep in mind that owner relation is polymorphic, so you can't just
|
56
|
-
# provide id number of the owner object.
|
57
|
-
# [:recipient]
|
58
|
-
# Specify the recipient of the {Activity}
|
59
|
-
# It can be a Proc, Symbol, or an ActiveRecord object
|
60
|
-
# == Examples:
|
61
|
-
#
|
62
|
-
# tracked :recipient => :author
|
63
|
-
# tracked :recipient => proc {|o| o.author}
|
64
|
-
#
|
65
|
-
# Keep in mind that recipient relation is polymorphic, so you can't just
|
66
|
-
# provide id number of the owner object.
|
67
|
-
# [:params]
|
68
|
-
# Accepts a Hash with custom parameters you want to pass to i18n.translate
|
69
|
-
# method. It is later used in {Renderable#text} method.
|
70
|
-
# == Example:
|
71
|
-
# class Article < ActiveRecord::Base
|
72
|
-
# include WiserTrails::Model
|
73
|
-
# tracked :params => {
|
74
|
-
# :title => :title,
|
75
|
-
# :author_name => "Michael",
|
76
|
-
# :category_name => proc {|controller, model_instance| model_instance.category.name},
|
77
|
-
# :summary => proc {|controller, model_instance| truncate(model.text, :length => 30)}
|
78
|
-
# }
|
79
|
-
# end
|
80
|
-
#
|
81
|
-
# Values in the :params hash can either be an *exact* *value*, a *Proc/Lambda* executed before saving the activity or a *Symbol*
|
82
|
-
# which is a an attribute or a method name executed on the tracked model's instance.
|
83
|
-
#
|
84
|
-
# Everything specified here has a lower priority than parameters
|
85
|
-
# specified directly in {#activity} method.
|
86
|
-
# So treat it as a place where you provide 'default' values or where you
|
87
|
-
# specify what data should be gathered for every activity.
|
88
|
-
# For more dynamic settings refer to {Activity} model documentation.
|
89
|
-
# [:skip_defaults]
|
90
|
-
# Disables recording of activities on create/update/destroy leaving that to programmer's choice. Check {WiserTrails::Common#create_activity}
|
91
|
-
# for a guide on how to manually record activities.
|
92
|
-
# [:only]
|
93
|
-
# Accepts a symbol or an array of symbols, of which any combination of the three is accepted:
|
94
|
-
# * _:create_
|
95
|
-
# * _:update_
|
96
|
-
# * _:destroy_
|
97
|
-
# Selecting one or more of these will make WiserTrails create activities
|
98
|
-
# automatically for the tracked model on selected actions.
|
99
|
-
#
|
100
|
-
# Resulting activities will have have keys assigned to, respectively:
|
101
|
-
# * _article.create_
|
102
|
-
# * _article.update_
|
103
|
-
# * _article.destroy_
|
104
|
-
# Since only three options are valid,
|
105
|
-
# see _:except_ option for a shorter version
|
106
|
-
# [:except]
|
107
|
-
# Accepts a symbol or an array of symbols with values like in _:only_, above.
|
108
|
-
# Values provided will be subtracted from all default actions:
|
109
|
-
# (create, update, destroy).
|
110
|
-
#
|
111
|
-
# So, passing _create_ would track and automatically create
|
112
|
-
# activities on _update_ and _destroy_ actions,
|
113
|
-
# but not on the _create_ action.
|
114
|
-
# [:on]
|
115
|
-
# Accepts a Hash with key being the *action* on which to execute *value* (proc)
|
116
|
-
# Currently supported only for CRUD actions which are enabled in _:only_
|
117
|
-
# or _:except_ options on this method.
|
118
|
-
#
|
119
|
-
# Key-value pairs in this option define callbacks that can decide
|
120
|
-
# whether to create an activity or not. Procs have two attributes for
|
121
|
-
# use: _model_ and _controller_. If the proc returns true, the activity
|
122
|
-
# will be created, if not, then activity will not be saved.
|
123
|
-
#
|
124
|
-
# == Example:
|
125
|
-
# # app/models/article.rb
|
126
|
-
# tracked :on => {:update => proc {|model, controller| model.published? }}
|
127
|
-
#
|
128
|
-
# In the example above, given a model Article with boolean column _published_.
|
129
|
-
# The activities with key _article.update_ will only be created
|
130
|
-
# if the published status is set to true on that article.
|
131
|
-
# @param opts [Hash] options
|
132
|
-
# @return [nil] options
|
133
18
|
def trail_it(opts = {})
|
134
19
|
options = opts.clone
|
135
|
-
|
136
20
|
all_options = [:create, :update, :destroy]
|
137
21
|
|
22
|
+
self.activity_skip_fields_global = ["updated_at", "created_at"]
|
23
|
+
if options[:skip_fields].present?
|
24
|
+
self.activity_skip_fields_global += options[:skip_fields]
|
25
|
+
end
|
26
|
+
options.delete(:skip_fields)
|
27
|
+
|
28
|
+
if options[:force_fields].present?
|
29
|
+
self.activity_force_fields_global = options[:skip_fields]
|
30
|
+
end
|
31
|
+
options.delete(:skip_fields)
|
32
|
+
|
138
33
|
if !options.has_key?(:skip_defaults) && !options[:only] && !options[:except]
|
139
34
|
include Creation
|
140
35
|
include Destruction
|
data/lib/wiser_trails/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wiser_trails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenneth John Balgos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|