public_activity 0.5.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. data/Gemfile +19 -2
  2. data/README.md +103 -19
  3. data/UPGRADING +4 -13
  4. data/lib/generators/public_activity/migration/templates/migration.rb +4 -0
  5. data/lib/public_activity.rb +15 -11
  6. data/lib/public_activity/{creation.rb → actions/creation.rb} +0 -0
  7. data/lib/public_activity/{destruction.rb → actions/destruction.rb} +0 -0
  8. data/lib/public_activity/{update.rb → actions/update.rb} +0 -0
  9. data/lib/public_activity/common.rb +195 -18
  10. data/lib/public_activity/config.rb +49 -3
  11. data/lib/public_activity/orm/active_record.rb +5 -0
  12. data/lib/public_activity/orm/active_record/activist.rb +42 -0
  13. data/lib/public_activity/orm/active_record/activity.rb +23 -0
  14. data/lib/public_activity/orm/active_record/adapter.rb +14 -0
  15. data/lib/public_activity/orm/active_record/trackable.rb +11 -0
  16. data/lib/public_activity/orm/mongoid.rb +4 -0
  17. data/lib/public_activity/orm/mongoid/activist.rb +42 -0
  18. data/lib/public_activity/orm/mongoid/activity.rb +25 -0
  19. data/lib/public_activity/orm/mongoid/adapter.rb +14 -0
  20. data/lib/public_activity/orm/mongoid/trackable.rb +11 -0
  21. data/lib/public_activity/{activity.rb → renderable.rb} +40 -56
  22. data/lib/public_activity/roles/deactivatable.rb +39 -0
  23. data/lib/public_activity/roles/tracked.rb +183 -0
  24. data/lib/public_activity/{store_controller.rb → utility/store_controller.rb} +0 -0
  25. data/lib/public_activity/{view_helpers.rb → utility/view_helpers.rb} +0 -0
  26. data/lib/public_activity/version.rb +1 -1
  27. metadata +40 -154
  28. data/lib/public_activity/activist.rb +0 -37
  29. data/lib/public_activity/tracked.rb +0 -337
data/Gemfile CHANGED
@@ -1,5 +1,22 @@
1
+ ENV['PA_ORM'] ||= 'active_record'
2
+
1
3
  source :rubygems
2
4
 
3
- gemspec
4
5
 
5
- gem 'yard'
6
+ case ENV['PA_ORM']
7
+ when 'active_record'
8
+ gem 'activerecord', '~> 3.0'
9
+ when 'mongoid'
10
+ gem 'mongoid', '~> 3.0'
11
+ end
12
+
13
+ group :development, :test do
14
+ gem 'sqlite3', '~> 1.3.7' if ENV['PA_ORM'] == 'active_record'
15
+ gem 'mocha', '~> 0.13.0', require: false
16
+ gem 'simplecov', '~> 0.7.0'
17
+ gem 'minitest', '>= 4.3.0'
18
+ gem 'redcarpet'
19
+ gem 'yard', '~> 0.8'
20
+ end
21
+
22
+ gemspec
data/README.md CHANGED
@@ -1,7 +1,24 @@
1
- # PublicActivity [![Build Status](https://secure.travis-ci.org/pokonski/public_activity.png)](http://travis-ci.org/pokonski/public_activity)
2
-
3
- public_activity provides smooth activity tracking for your ActiveRecord models in Rails 3.
4
- Simply put: it records what has been changed or edited and gives you the ability to present those recorded activities to users - in a similar way Github does it.
1
+ # PublicActivity [![Build Status](https://secure.travis-ci.org/pokonski/public_activity.png)](http://travis-ci.org/pokonski/public_activity) [![Dependency Status](https://gemnasium.com/pokonski/public_activity.png)](https://gemnasium.com/pokonski/public_activity)
2
+
3
+ _public_activity_ provides smooth activity tracking for your **ActiveRecord** and **Mongoid 3** models in Rails 3.
4
+ Simply put: it records what has been changed or created and gives you the ability to present those
5
+ recorded activities to users - in a similar way to how GitHub does it.
6
+
7
+ ## Table of contents
8
+
9
+ 1. [Example](#example)
10
+ * [Demo](#online-demo)
11
+ 3. **[Upgrading](#upgrading)**
12
+ 4. [Setup](#setup)
13
+ 1. [Gem installation](#gem-installation)
14
+ 2. [Database setup](#database-setup)
15
+ 3. [Model configuration](#model-configuration)
16
+ 4. [Custom activities](#custom-activities)
17
+ 5. [Displaying activities](#displaying-activities)
18
+ 1. [Activity views](#activity-views)
19
+ 2. [i18n](#i18n)
20
+ 5. [Documentation](#documentation)
21
+ 6. **[Help](#help)**
5
22
 
6
23
  ## Example
7
24
 
@@ -14,11 +31,12 @@ Here is a simple example showing what this gem is about:
14
31
  You can see an actual application using this gem here: http://public-activity-example.herokuapp.com/feed
15
32
 
16
33
  The source code of the demo is hosted here: https://github.com/pokonski/activity_blog
17
- ## Upgrading to 0.4
34
+
35
+ ## Upgrading from pre-0.4.0
18
36
 
19
37
  If you are using versions earlier than 0.4.0 please click [here](#upgrading) or scroll to the "Upgrading" section at the bottom of this README.
20
38
 
21
- ## First time setup
39
+ ## Setup
22
40
 
23
41
  ### Gem installation
24
42
 
@@ -34,7 +52,17 @@ gem 'public_activity'
34
52
 
35
53
  ### Database setup
36
54
 
37
- Create migration for activities and migrate the database (in your Rails project):
55
+ By default _public_activity_ uses Active Record. If you want to use Mongoid as your backend, create
56
+ an initializer file in your Rails application with this code inside:
57
+
58
+ ```ruby
59
+ # config/initializers/public_activity.rb
60
+ PublicActivity::Config.set do
61
+ orm :mongoid
62
+ end
63
+ ```
64
+
65
+ **(ActiveRecord only)** Create migration for activities and migrate the database (in your Rails project):
38
66
 
39
67
  rails g public_activity:migration
40
68
  rake db:migrate
@@ -43,6 +71,8 @@ Create migration for activities and migrate the database (in your Rails project)
43
71
 
44
72
  Include `PublicActivity::Model` and add `tracked` to the model you want to keep track of:
45
73
 
74
+ For _ActiveRecord:_
75
+
46
76
  ```ruby
47
77
  class Article < ActiveRecord::Base
48
78
  include PublicActivity::Model
@@ -50,11 +80,36 @@ class Article < ActiveRecord::Base
50
80
  end
51
81
  ```
52
82
 
53
- And now, by default create/update/destroy activities are recorded in activities table. This is all you need to start recording activities for basic CRUD actions.
83
+ For _Mongoid:_
84
+
85
+ ```ruby
86
+ class Article
87
+ include Mongoid::Document
88
+ include PublicActivity::Model
89
+ tracked
90
+ end
91
+ ```
92
+
93
+ And now, by default create/update/destroy activities are recorded in activities table.
94
+ This is all you need to start recording activities for basic CRUD actions.
95
+
96
+ _Optional_: If you don't need `#tracked` but still want the comfort of `#create_activity`,
97
+ you can include only the lightweight `Common` module instead of `Model`.
98
+
99
+ #### Custom activities
100
+
101
+ You can trigger custom activities by setting all your required parameters and triggering `create_activity`
102
+ on the tracked model, like this:
103
+
104
+ ```ruby
105
+ @article.create_activity key: 'article.commented_on', owner: current_user
106
+ ```
107
+
108
+ See this entry http://rubydoc.info/gems/public_activity/PublicActivity/Common:create_activity for more details.
54
109
 
55
110
  ### Displaying activities
56
111
 
57
- To display them you simply query the `PublicActivity::Activity` ActiveRecord model:
112
+ To display them you simply query the `PublicActivity::Activity` model:
58
113
 
59
114
  ```ruby
60
115
  # notifications_controller.rb
@@ -66,25 +121,31 @@ end
66
121
  And in your views:
67
122
 
68
123
  ```erb
69
- <% for activity in @activities %>
124
+ <% @activities.each do |activity| %>
70
125
  <%= render_activity(activity) %>
71
126
  <% end %>
72
127
  ```
73
128
 
74
129
  *Note*: `render_activity` is a helper for use in view templates. `render_activity(activity)` can be written as `activity.render(self)` and it will have the same meaning.
75
130
 
76
- You can also pass options to both `activity#render` and `#render_activity` methods, which are passed deeper to the `render_partial` method.
77
- A useful example would be to render activities wrapped in layout, which shares common elements of an activity, like a timestamp, owner's avatar etc.
131
+ #### Layouts
132
+
133
+ You can also pass options to both `activity#render` and `#render_activity` methods, which are passed deeper
134
+ to the internally used `render_partial` method.
135
+ A useful example would be to render activities wrapped in layout, which shares common elements of an activity,
136
+ like a timestamp, owner's avatar etc:
78
137
 
79
138
  ```erb
80
- <% for activity in @activities %>
139
+ <% @activities.each do |activity| %>
81
140
  <%= render_activity(activity, :layout => :activity) %>
82
141
  <% end %>
83
142
  ```
84
143
 
85
- The activity will be wrapped with the `app/views/layouts/activity` layout, in the above example.
144
+ The activity will be wrapped with the `app/views/layouts/_activity.erb` layout, in the above example.
145
+
146
+ **Important**: please note that layouts for activities are also partials. Hence the `_` prefix.
86
147
 
87
- ### Activity views
148
+ #### Activity views
88
149
 
89
150
  Since version `0.4.0` you can use views to render activities. `public_activity` looks for views in `app/views/public_activity`, and this is now the *default* behaviour.
90
151
 
@@ -94,7 +155,7 @@ For example, if you have an activity with `:key` set to `"activity.user.changed_
94
155
 
95
156
  If a view file does not exist, then p_a falls back to the old behaviour and tries to translate the activity `:key` using `I18n#translate` method (see the section below).
96
157
 
97
- ### i18n
158
+ #### i18n
98
159
 
99
160
  Translations are used by the `#text` method, to which you can pass additional options in form of a hash. `#render` method uses translations when view templates have not been provided.
100
161
 
@@ -112,10 +173,14 @@ This structure is valid for activities with keys `"activity.article.create"` or
112
173
 
113
174
  ## Upgrading
114
175
 
176
+ **Read this if you have been using versions older than 0.4.**
177
+
115
178
  There are a couple of major differences between 0.3 and 0.4 version. To upgrade, follow these steps:
116
179
 
117
180
  1. Add `include PublicActivity::Model` above `tracked` method call in your tracked models, like this:
118
181
 
182
+ _ActiveRecord:_
183
+
119
184
  ```ruby
120
185
  class Article < ActiveRecord::Base
121
186
  include PublicActivity::Model
@@ -123,12 +188,22 @@ There are a couple of major differences between 0.3 and 0.4 version. To upgrade,
123
188
  end
124
189
  ```
125
190
 
126
- 2. public_activity's config YAML file is no longer used (by default in `config/pba.yml`). Move your YAML contents to your `config/locales/*.yml` files.
191
+ _Mongoid:_
192
+
193
+ ```ruby
194
+ class Article
195
+ include Mongoid::Document
196
+ include PublicActivity::Model
197
+ tracked
198
+ end
199
+ ```
200
+
201
+ 2. _public_activity_'s config YAML file is no longer used (by default in `config/pba.yml`). Move your YAML contents to your `config/locales/*.yml` files.
127
202
 
128
203
  <br/>**IMPORTANT**: Locales are no longer rendered with ERB, this has been removed in favor of real view partials like in actual Rails apps.
129
204
  Read [Activity views](#activity-views) section above to learn how to use those templates.<br/>
130
205
 
131
- 3. Generate and run migration which adds new column to `activities` table:
206
+ 3. **(ActiveRecord only)** Generate and run migration which adds new column to `activities` table:
132
207
 
133
208
  ```bash
134
209
  rails g public_activity:migration_upgrade
@@ -143,6 +218,15 @@ For more customization go [here](http://rubydoc.info/gems/public_activity/index)
143
218
 
144
219
  * [[How to] Set the Activity's owner to current_user by default](https://github.com/pokonski/public_activity/wiki/%5BHow-to%5D-Set-the-Activity's-owner-to-current_user-by-default)
145
220
  * [[How to] Disable tracking for a class or globally](https://github.com/pokonski/public_activity/wiki/%5BHow-to%5D-Disable-tracking-for-a-class-or-globally)
221
+ * [[How to] Create custom activities](https://github.com/pokonski/public_activity/wiki/%5BHow-to%5D-Create-custom-activities)
222
+
223
+ ## Help
224
+
225
+ If you need help with using public_activity please visit our discussion group and ask a question there:
226
+
227
+ https://groups.google.com/forum/?fromgroups#!forum/public-activity
228
+
229
+ Please do not ask general questions in the Github Issues.
146
230
 
147
231
  ## License
148
- Copyright (c) 2012 Piotrek Okoński, released under the MIT license
232
+ Copyright (c) 2012 Piotrek Okoński, released under the MIT license
data/UPGRADING CHANGED
@@ -1,17 +1,8 @@
1
- ################################################
2
- # RUBY 1.8.7 IS NOW DEPRECATED #
3
- ################################################
4
-
5
- The 0.5 version of public_activity will be the
6
- last to support versions older than 1.9.2. Please
7
- update your Ruby if you wish to continue using
8
- this gem.
9
-
10
- --------------------------------------------------
11
- | NOTE FOR UPGRADING FROM PRE-0.4.0 VERSION |
12
- --------------------------------------------------
1
+ ##################################################
2
+ # NOTE FOR UPGRADING FROM PRE-0.4.0 VERSION #
3
+ ##################################################
13
4
 
14
5
  public_activity 0.4.0 brings major changes compared to 0.3.X versions,
15
- please read https://github.com/pokonski/public_activity#upgrading
6
+ please read https://github.com/pokonski/public_activity#upgrading
16
7
  to learn about all the changes you need to apply to properly
17
8
  upgrade your applications.
@@ -11,6 +11,10 @@ class CreateActivities < ActiveRecord::Migration
11
11
 
12
12
  t.timestamps
13
13
  end
14
+
15
+ add_index :activities, [:trackable_id, :trackable_type]
16
+ add_index :activities, [:owner_id, :owner_type]
17
+ add_index :activities, [:recipient_id, :recipient_type]
14
18
  end
15
19
  # Drop table
16
20
  def self.down
@@ -1,7 +1,5 @@
1
1
  require 'active_support'
2
2
  require 'action_view'
3
- require 'active_record'
4
-
5
3
  # +public_activity+ keeps track of changes made to models
6
4
  # and allows you to display them to the users.
7
5
  #
@@ -10,15 +8,15 @@ require 'active_record'
10
8
  module PublicActivity
11
9
  extend ActiveSupport::Concern
12
10
  extend ActiveSupport::Autoload
13
- autoload :Activist
14
- autoload :Activity
15
11
  autoload :Config
16
- autoload :Tracked
17
- autoload :Creation
18
- autoload :Update
19
- autoload :Destruction
12
+ autoload :Tracked, 'public_activity/roles/tracked.rb'
13
+ autoload :Deactivatable,'public_activity/roles/deactivatable.rb'
14
+ autoload :Creation, 'public_activity/actions/creation.rb'
15
+ autoload :Update, 'public_activity/actions/update.rb'
16
+ autoload :Destruction, 'public_activity/actions/destruction.rb'
20
17
  autoload :VERSION
21
18
  autoload :Common
19
+ autoload :Renderable
22
20
 
23
21
  # Switches PublicActivity on or off.
24
22
  # @param value [Boolean]
@@ -45,11 +43,17 @@ module PublicActivity
45
43
  module Model
46
44
  extend ActiveSupport::Concern
47
45
  included do
46
+ include Common
47
+ include Deactivatable
48
48
  include Tracked
49
- include Activist
49
+ include Activist # optional associations by recipient|owner
50
50
  end
51
51
  end
52
52
  end
53
53
 
54
- require 'public_activity/store_controller'
55
- require 'public_activity/view_helpers'
54
+ # Force Active Record ORM to load
55
+ # makes initializer optional for default config
56
+ PublicActivity.config if defined? ActiveRecord
57
+
58
+ require 'public_activity/utility/store_controller'
59
+ require 'public_activity/utility/view_helpers'
@@ -20,6 +20,174 @@ module PublicActivity
20
20
  # Common methods shared across the gem.
21
21
  module Common
22
22
  extend ActiveSupport::Concern
23
+
24
+ included do
25
+ ::PublicActivity.config # it's the first module to be loaded into models
26
+ # we need to have pieces provided by orm loaded
27
+ include Trackable
28
+ class_attribute :activity_owner_global, :activity_recipient_global,
29
+ :activity_params_global, :activity_hooks, :activity_custom_fields_global
30
+ set_public_activity_class_defaults
31
+ end
32
+
33
+ # @!group Global options
34
+
35
+ # @!attribute activity_owner_global
36
+ # Global version of activity owner
37
+ # @see #activity_owner
38
+ # @return [Model]
39
+
40
+ # @!attribute activity_recipient_global
41
+ # Global version of activity recipient
42
+ # @see #activity_recipient
43
+ # @return [Model]
44
+
45
+ # @!attribute activity_params_global
46
+ # Global version of activity parameters
47
+ # @see #activity_params
48
+ # @return [Hash<Symbol, Object>]
49
+
50
+ # @!attribute activity_hooks
51
+ # @return [Hash<Symbol, Proc>]
52
+ # Hooks/functions that will be used to decide *if* the activity should get
53
+ # created.
54
+ #
55
+ # The supported keys are:
56
+ # * :create
57
+ # * :update
58
+ # * :destroy
59
+
60
+ # @!endgroup
61
+
62
+ # @!group Instance options
63
+
64
+ # Set or get parameters that will be passed to {Activity} when saving
65
+ #
66
+ # == Usage:
67
+ #
68
+ # @article.activity_params = {:article_title => @article.title}
69
+ # @article.save
70
+ #
71
+ # This way you can pass strings that should remain constant, even when model attributes
72
+ # change after creating this {Activity}.
73
+ # @return [Hash<Symbol, Object>]
74
+ attr_accessor :activity_params
75
+ @activity_params = {}
76
+ # Set or get owner object responsible for the {Activity}.
77
+ #
78
+ # == Usage:
79
+ #
80
+ # # where current_user is an object of logged in user
81
+ # @article.activity_owner = current_user
82
+ # # OR: take @article.author association
83
+ # @article.activity_owner = :author
84
+ # # OR: provide a Proc with custom code
85
+ # @article.activity_owner = proc {|controller, model| model.author }
86
+ # @article.save
87
+ # @article.activities.last.owner #=> Returns owner object
88
+ # @return [Model] Polymorphic model
89
+ # @see #activity_owner_global
90
+ attr_accessor :activity_owner
91
+ @activity_owner = nil
92
+
93
+ # Set or get recipient for activity.
94
+ #
95
+ # Association is polymorphic, thus allowing assignment of
96
+ # all types of models. This can be used for example in the case of sending
97
+ # private notifications for only a single user.
98
+ # @return (see #activity_owner)
99
+ attr_accessor :activity_recipient
100
+ @activity_recipient = nil
101
+ # Set or get custom i18n key passed to {Activity}, later used in {Activity#text}
102
+ #
103
+ # == Usage:
104
+ #
105
+ # @article = Article.new
106
+ # @article.activity_key = "my.custom.article.key"
107
+ # @article.save
108
+ # @article.activities.last.key #=> "my.custom.article.key"
109
+ #
110
+ # @return [String]
111
+ attr_accessor :activity_key
112
+ @activity_key = nil
113
+
114
+ # Set or get custom fields for later processing
115
+ #
116
+ # @return [Hash]
117
+ attr_accessor :activity_custom_fields
118
+ @activity_custom_fields = {}
119
+
120
+ # @!visibility private
121
+ @@activity_hooks = {}
122
+
123
+ # @!endgroup
124
+ module ClassMethods
125
+ #
126
+ # @since 1.0.0
127
+ # @api private
128
+ def set_public_activity_class_defaults
129
+ self.activity_owner_global = nil
130
+ self.activity_recipient_global = nil
131
+ self.activity_params_global = {}
132
+ self.activity_hooks = {}
133
+ self.activity_custom_fields_global = {}
134
+ end
135
+
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
+ # {Tracked#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
+ def get_hook(key)
147
+ key = key.to_sym
148
+ if self.activity_hooks.has_key?(key) and self.activity_hooks[key].is_a? Proc
149
+ self.activity_hooks[key]
150
+ else
151
+ nil
152
+ end
153
+ end
154
+ end
155
+ #
156
+ # Returns true if PublicActivity is enabled
157
+ # globally and for this class.
158
+ # @return [Boolean]
159
+ # @api private
160
+ # @since 0.5.0
161
+ def public_activity_enabled?
162
+ PublicActivity.enabled?
163
+ end
164
+ #
165
+ # Shortcut for {Tracked::ClassMethods#get_hook}
166
+ # @param (see Tracked::ClassMethods#get_hook)
167
+ # @return (see Tracked::ClassMethods#get_hook)
168
+ # @since (see Tracked::ClassMethods#get_hook)
169
+ # @api (see Tracked::ClassMethods#get_hook)
170
+ def get_hook(key)
171
+ self.class.get_hook(key)
172
+ end
173
+
174
+ # Calls hook safely.
175
+ # If a hook for given action exists, calls it with model (self) and
176
+ # controller (if available, see {StoreController})
177
+ # @param key (see #get_hook)
178
+ # @return [Boolean] if hook exists, it's decision, if there's no hook, true
179
+ # @since 0.4.0
180
+ # @api private
181
+ def call_hook_safe(key)
182
+ hook = self.get_hook(key)
183
+ if hook
184
+ # provides hook with model and controller
185
+ hook.call(self, PublicActivity.get_controller)
186
+ else
187
+ true
188
+ end
189
+ end
190
+
23
191
  # Directly creates activity record in the database, based on supplied options.
24
192
  #
25
193
  # It's meant for creating custom activities while *preserving* *all*
@@ -82,14 +250,11 @@ module PublicActivity
82
250
  options = prepare_settings(*args)
83
251
 
84
252
  if call_hook_safe(options[:key].split('.').last)
85
- self.activities.create(
86
- :key => options[:key],
87
- :owner => options[:owner],
88
- :recipient => options[:recipient],
89
- :parameters => options[:params]
90
- )
91
253
  reset_activity_instance_options
254
+ PublicActivity::Adapter.create_activity(self, options)
92
255
  end
256
+
257
+ return nil
93
258
  end
94
259
 
95
260
  # Prepares settings used during creation of Activity record.
@@ -105,39 +270,50 @@ module PublicActivity
105
270
  # @see #create_activity
106
271
  def prepare_settings(*args)
107
272
  # key
108
- options = args.extract_options!
273
+ all_options = args.extract_options!
274
+ options = {
275
+ key: all_options.delete(:key),
276
+ owner: all_options.delete(:key),
277
+ action: all_options.delete(:action),
278
+ recipient: all_options.delete(:recipient),
279
+ parameters: all_options.delete(:parameters) || all_options.delete(:params)
280
+ }
109
281
  action = (args.first || options[:action]).try(:to_s)
110
282
 
111
- key = extract_key(action, options)
283
+ options[:key] = extract_key(action, options)
112
284
 
113
- raise NoKeyProvided, "No key provided for #{self.class.name}" unless key
285
+ raise NoKeyProvided, "No key provided for #{self.class.name}" unless options[:key]
286
+
287
+ options.delete(:action)
114
288
 
115
289
  # user responsible for the activity
116
- owner = PublicActivity.resolve_value(self,
290
+ options[:owner] = PublicActivity.resolve_value(self,
117
291
  options[:owner] ||
118
292
  self.activity_owner ||
119
293
  self.class.activity_owner_global
120
294
  )
121
295
 
122
296
  # recipient of the activity
123
- recipient = PublicActivity.resolve_value(self,
297
+ options[:recipient] = PublicActivity.resolve_value(self,
124
298
  options[:recipient] ||
125
299
  self.activity_recipient ||
126
300
  self.class.activity_recipient_global
127
301
  )
128
302
 
129
303
  #customizable parameters
130
- params = options[:params] || {}
304
+ params = options[:params] || options[:parameters] || {}
131
305
  params.merge!(self.class.activity_params_global)
132
306
  params.merge!(self.activity_params) if self.activity_params
133
307
  params.each { |k, v| params[k] = PublicActivity.resolve_value(self, v) }
308
+ options[:parameters] = params
309
+ options.delete(:params)
134
310
 
135
- {
136
- :key => key,
137
- :owner => owner,
138
- :recipient => recipient,
139
- :params => params
140
- }
311
+ customs = self.class.activity_custom_fields_global
312
+ customs.merge!(self.activity_custom_fields) if self.activity_custom_fields
313
+ customs.merge!(all_options)
314
+ customs.each do |k, v|
315
+ customs[k] = PublicActivity.resolve_value(self, v)
316
+ end.merge options
141
317
  end
142
318
 
143
319
  # Helper method to serialize class name into relevant key
@@ -159,6 +335,7 @@ module PublicActivity
159
335
  @activity_key = nil
160
336
  @activity_owner = nil
161
337
  @activity_recipient = nil
338
+ @activity_custom_fields = {}
162
339
  end
163
340
  end
164
341
  end