public_activity 1.1.0 → 1.4.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -20
  3. data/README.md +50 -62
  4. data/lib/public_activity/activity.rb +2 -0
  5. data/lib/public_activity/common.rb +9 -7
  6. data/lib/public_activity/config.rb +15 -0
  7. data/lib/public_activity/models/activist.rb +2 -0
  8. data/lib/public_activity/models/adapter.rb +1 -0
  9. data/lib/public_activity/models/trackable.rb +2 -0
  10. data/lib/public_activity/orm/active_record/activist.rb +9 -6
  11. data/lib/public_activity/orm/active_record/activity.rb +4 -3
  12. data/lib/public_activity/orm/active_record/adapter.rb +4 -0
  13. data/lib/public_activity/orm/active_record/trackable.rb +4 -0
  14. data/lib/public_activity/orm/mongo_mapper/activist.rb +46 -0
  15. data/lib/public_activity/orm/mongo_mapper/activity.rb +33 -0
  16. data/lib/public_activity/orm/mongo_mapper/adapter.rb +12 -0
  17. data/lib/public_activity/orm/mongo_mapper/trackable.rb +11 -0
  18. data/lib/public_activity/orm/mongo_mapper.rb +4 -0
  19. data/lib/public_activity/orm/mongoid/activity.rb +1 -0
  20. data/lib/public_activity/renderable.rb +12 -8
  21. data/lib/public_activity/roles/deactivatable.rb +3 -0
  22. data/lib/public_activity/roles/tracked.rb +6 -6
  23. data/lib/public_activity/utility/view_helpers.rb +11 -3
  24. data/lib/public_activity/version.rb +1 -1
  25. data/test/migrations/001_create_activities.rb +23 -0
  26. data/test/migrations/002_create_articles.rb +11 -0
  27. data/test/migrations/003_create_users.rb +8 -0
  28. data/test/migrations/004_add_nonstandard_to_activities.rb +7 -0
  29. data/test/mongo_mapper.yml +4 -0
  30. data/test/mongoid.yml +6 -0
  31. data/test/test_activist.rb +56 -0
  32. data/test/test_activity.rb +67 -0
  33. data/test/test_common.rb +168 -0
  34. data/test/test_controller_integration.rb +41 -0
  35. data/test/test_generators.rb +41 -0
  36. data/test/test_helper.rb +124 -0
  37. data/test/test_tracking.rb +378 -0
  38. data/test/test_view_helpers.rb +36 -0
  39. data/test/views/layouts/_activity.erb +1 -0
  40. data/test/views/public_activity/_test.erb +8 -0
  41. metadata +139 -22
  42. data/UPGRADING +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8fd39acfbf854c069a2b94620e3053830683b8fb
4
- data.tar.gz: d8c98bb1597029b47b4926aa98afd16a5afaf7ce
3
+ metadata.gz: 86fca5f56a3715cdc7aa50a5429478d3da652e2a
4
+ data.tar.gz: 6873ddaac083d14044c4e9eb7f4137b257d7bfec
5
5
  SHA512:
6
- metadata.gz: b21e5ce84fd4c69efb5c0a8ea47ad594c46d2405340ee51930ce7d05f9249adc173a25f2120bb404d475339a7c95716ee23053b1c8dcd1dab5b544a9e6bda888
7
- data.tar.gz: e41642ab559c0616592d20e59ccbbec11e0bd3183855b493fe819bddb60bc04d9a5cd820086afc97c77eb055faa06daa44a726b569b7ec21ececb3748c54fcc5
6
+ metadata.gz: 8b432bcada38def3820e0a72b49d233e14bd1c87ceb6fdca7263e5b442a1c4d888cf88cc106a3df66febf6b5a6785b1a92a15b148c5410a72b8608596732a540
7
+ data.tar.gz: 8ace1656f39368a932ff0e5883d710a59a546ce269f25608bfaa9e08e6fde99881681e8eade10461f0d8142e3a72751545016a0a9eda3aae5f3c319332cb731c
data/Gemfile CHANGED
@@ -1,22 +1,2 @@
1
- ENV['PA_ORM'] ||= 'active_record'
2
-
3
1
  source "https://rubygems.org"
4
-
5
-
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', '< 5.0.0'
18
- gem 'redcarpet'
19
- gem 'yard', '~> 0.8'
20
- end
21
-
22
2
  gemspec
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
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
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
3
+ _public_activity_ provides easy activity tracking for your **ActiveRecord**, **Mongoid 3** and **MongoMapper** models
4
+ in Rails 3. Simply put: it records what has been changed or created and gives you the ability to present those
5
5
  recorded activities to users - in a similar way to how GitHub does it.
6
6
 
7
7
  ## Table of contents
@@ -9,8 +9,8 @@ recorded activities to users - in a similar way to how GitHub does it.
9
9
  1. [Example](#example)
10
10
  * [Demo](#online-demo)
11
11
  * [Screencast](#screencast)
12
- 3. **[Upgrading](#upgrading)**
13
- 4. [Setup](#setup)
12
+ * **[Common examples](#common-examples)**
13
+ 2. [Setup](#setup)
14
14
  1. [Gem installation](#gem-installation)
15
15
  2. [Database setup](#database-setup)
16
16
  3. [Model configuration](#model-configuration)
@@ -18,8 +18,9 @@ recorded activities to users - in a similar way to how GitHub does it.
18
18
  5. [Displaying activities](#displaying-activities)
19
19
  1. [Activity views](#activity-views)
20
20
  2. [i18n](#i18n)
21
- 5. [Documentation](#documentation)
22
- 6. **[Help](#help)**
21
+ 3. [Documentation](#documentation)
22
+ 4. **[Help](#help)**
23
+ 5. [Upgrading](https://github.com/pokonski/public_activity/wiki/Upgrading-from-pre-0.4.0-versions)
23
24
 
24
25
  ## Example
25
26
 
@@ -37,10 +38,6 @@ The source code of the demo is hosted here: https://github.com/pokonski/activity
37
38
 
38
39
  Ryan Bates made a [great screencast](http://railscasts.com/episodes/406-public-activity) describing how to integrate Public Activity in your Rails Application.
39
40
 
40
- ## Upgrading from pre-0.4.0
41
-
42
- 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.
43
-
44
41
  ## Setup
45
42
 
46
43
  ### Gem installation
@@ -57,8 +54,10 @@ gem 'public_activity'
57
54
 
58
55
  ### Database setup
59
56
 
60
- By default _public_activity_ uses Active Record. If you want to use Mongoid as your backend, create
61
- an initializer file in your Rails application with this code inside:
57
+ By default _public_activity_ uses Active Record. If you want to use Mongoid or MongoMapper as your backend, create
58
+ an initializer file in your Rails application with the corresponding code inside:
59
+
60
+ For _Mongoid:_
62
61
 
63
62
  ```ruby
64
63
  # config/initializers/public_activity.rb
@@ -67,6 +66,15 @@ PublicActivity::Config.set do
67
66
  end
68
67
  ```
69
68
 
69
+ For _MongoMapper:_
70
+
71
+ ```ruby
72
+ # config/initializers/public_activity.rb
73
+ PublicActivity::Config.set do
74
+ orm :mongo_mapper
75
+ end
76
+ ```
77
+
70
78
  **(ActiveRecord only)** Create migration for activities and migrate the database (in your Rails project):
71
79
 
72
80
  rails g public_activity:migration
@@ -95,6 +103,16 @@ class Article
95
103
  end
96
104
  ```
97
105
 
106
+ For _MongoMapper:_
107
+
108
+ ```ruby
109
+ class Article
110
+ include MongoMapper::Document
111
+ include PublicActivity::Model
112
+ tracked
113
+ end
114
+ ```
115
+
98
116
  And now, by default create/update/destroy activities are recorded in activities table.
99
117
  This is all you need to start recording activities for basic CRUD actions.
100
118
 
@@ -126,13 +144,13 @@ end
126
144
  And in your views:
127
145
 
128
146
  ```erb
129
- <% @activities.each do |activity| %>
130
- <%= render_activity(activity) %>
131
- <% end %>
147
+ <%= render_activities(@activities) %>
132
148
  ```
133
149
 
134
150
  *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.
135
151
 
152
+ *Note*: `render_activities` is an alias for `render_activity` and does the same.
153
+
136
154
  #### Layouts
137
155
 
138
156
  You can also pass options to both `activity#render` and `#render_activity` methods, which are passed deeper
@@ -141,18 +159,26 @@ A useful example would be to render activities wrapped in layout, which shares c
141
159
  like a timestamp, owner's avatar etc:
142
160
 
143
161
  ```erb
144
- <% @activities.each do |activity| %>
145
- <%= render_activity(activity, :layout => :activity) %>
146
- <% end %>
162
+ <%= render_activities(@activities, layout: :activity) %>
147
163
  ```
148
164
 
149
165
  The activity will be wrapped with the `app/views/layouts/_activity.erb` layout, in the above example.
150
166
 
151
167
  **Important**: please note that layouts for activities are also partials. Hence the `_` prefix.
152
168
 
169
+ #### Locals
170
+
171
+ Sometimes, it's desirable to pass additional local variables to partials. It can be done this way:
172
+
173
+ ```erb
174
+ <%= render_activity(@activity, locals: {friends: current_user.friends} %>
175
+ ```
176
+
177
+ *Note*: Before 1.4.0, one could pass variables directly to the options hash for `#render_activity` and access it from activity parameters. This functionality is retained in 1.4.0 and later, but the `:locals` method is **preferred**, since it prevents bugs from shadowing variables from activity parameters in the database.
178
+
153
179
  #### Activity views
154
180
 
155
- 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.
181
+ `public_activity` looks for views in `app/views/public_activity`.
156
182
 
157
183
  For example, if you have an activity with `:key` set to `"activity.user.changed_avatar"`, the gem will look for a partial in `app/views/public_activity/user/_changed_avatar.(erb|haml|slim|something_else)`.
158
184
 
@@ -162,7 +188,7 @@ If a view file does not exist, then p_a falls back to the old behaviour and trie
162
188
 
163
189
  #### i18n
164
190
 
165
- 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.
191
+ 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. You can render pure i18n strings by passing `{display: :i18n}` to `#render_activity` or `#render`.
166
192
 
167
193
  Translations should be put in your locale `.yml` files. To render pure strings from I18n Example structure:
168
194
 
@@ -176,54 +202,16 @@ activity:
176
202
 
177
203
  This structure is valid for activities with keys `"activity.article.create"` or `"article.create"`. As mentioned before, `"activity."` part of the key is optional.
178
204
 
179
- ## Upgrading
180
-
181
- **Read this if you have been using versions older than 0.4.**
182
-
183
- There are a couple of major differences between 0.3 and 0.4 version. To upgrade, follow these steps:
184
-
185
- 1. Add `include PublicActivity::Model` above `tracked` method call in your tracked models, like this:
186
-
187
- _ActiveRecord:_
188
-
189
- ```ruby
190
- class Article < ActiveRecord::Base
191
- include PublicActivity::Model
192
- tracked
193
- end
194
- ```
195
-
196
- _Mongoid:_
197
-
198
- ```ruby
199
- class Article
200
- include Mongoid::Document
201
- include PublicActivity::Model
202
- tracked
203
- end
204
- ```
205
-
206
- 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.
207
-
208
- <br/>**IMPORTANT**: Locales are no longer rendered with ERB, this has been removed in favor of real view partials like in actual Rails apps.
209
- Read [Activity views](#activity-views) section above to learn how to use those templates.<br/>
210
-
211
- 3. **(ActiveRecord only)** Generate and run migration which adds new column to `activities` table:
212
-
213
- ```bash
214
- rails g public_activity:migration_upgrade
215
- rake db:migrate
216
- ```
217
-
218
205
  ## Documentation
219
206
 
220
- For more customization go [here](http://rubydoc.info/gems/public_activity/index)
207
+ For more documentation go [here](http://rubydoc.info/gems/public_activity/index)
221
208
 
222
- ## Useful examples
209
+ ## Common examples
223
210
 
224
211
  * [[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)
225
212
  * [[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)
226
213
  * [[How to] Create custom activities](https://github.com/pokonski/public_activity/wiki/%5BHow-to%5D-Create-custom-activities)
214
+ * [[How to] Use custom fields on Activity](https://github.com/pokonski/public_activity/wiki/%5BHow-to%5D-Use-custom-fields-on-Activity)
227
215
 
228
216
  ## Help
229
217
 
@@ -234,4 +222,4 @@ https://groups.google.com/forum/?fromgroups#!forum/public-activity
234
222
  Please do not ask general questions in the Github Issues.
235
223
 
236
224
  ## License
237
- Copyright (c) 2012 Piotrek Okoński, released under the MIT license
225
+ Copyright (c) 2011-2013 Piotrek Okoński, released under the MIT license
@@ -1,4 +1,6 @@
1
1
  module PublicActivity
2
+ # Main model, stores all information about what happened,
3
+ # who caused it, when and anything else.
2
4
  class Activity < inherit_orm("Activity")
3
5
  end
4
6
  end
@@ -96,7 +96,7 @@ module PublicActivity
96
96
  # @return (see #activity_owner)
97
97
  attr_accessor :activity_recipient
98
98
  @activity_recipient = nil
99
- # Set or get custom i18n key passed to {Activity}, later used in {Activity#text}
99
+ # Set or get custom i18n key passed to {Activity}, later used in {Renderable#text}
100
100
  #
101
101
  # == Usage:
102
102
  #
@@ -119,6 +119,8 @@ module PublicActivity
119
119
  @@activity_hooks = {}
120
120
 
121
121
  # @!endgroup
122
+
123
+ # Provides some global methods for every model class.
122
124
  module ClassMethods
123
125
  #
124
126
  # @since 1.0.0
@@ -134,7 +136,7 @@ module PublicActivity
134
136
  # Extracts a hook from the _:on_ option provided in
135
137
  # {Tracked::ClassMethods#tracked}. Returns nil when no hook exists for
136
138
  # given action
137
- # {Tracked#get_hook}
139
+ # {Common#get_hook}
138
140
  #
139
141
  # @see Tracked#get_hook
140
142
  # @param key [String, Symbol] action to retrieve a hook for
@@ -160,11 +162,11 @@ module PublicActivity
160
162
  PublicActivity.enabled?
161
163
  end
162
164
  #
163
- # Shortcut for {Tracked::ClassMethods#get_hook}
164
- # @param (see Tracked::ClassMethods#get_hook)
165
- # @return (see Tracked::ClassMethods#get_hook)
166
- # @since (see Tracked::ClassMethods#get_hook)
167
- # @api (see Tracked::ClassMethods#get_hook)
165
+ # Shortcut for {ClassMethods#get_hook}
166
+ # @param (see ClassMethods#get_hook)
167
+ # @return (see ClassMethods#get_hook)
168
+ # @since (see ClassMethods#get_hook)
169
+ # @api (see ClassMethods#get_hook)
168
170
  def get_hook(key)
169
171
  self.class.get_hook(key)
170
172
  end
@@ -13,6 +13,12 @@ module PublicActivity
13
13
  @enabled = true
14
14
  end
15
15
 
16
+ # Evaluates given block to provide DSL configuration.
17
+ # @example Initializer for Rails
18
+ # PublicActivity::Config.set do
19
+ # orm :mongo_mapper
20
+ # enabled false
21
+ # end
16
22
  def self.set &block
17
23
  b = Block.new
18
24
  b.instance_eval &block
@@ -23,23 +29,32 @@ module PublicActivity
23
29
  instance.instance_variable_set(:@enabled, enabled) unless enabled.nil?
24
30
  end
25
31
 
32
+ # Set the ORM for use by PublicActivity.
26
33
  def self.orm(orm = nil)
27
34
  @@orm = (orm ? orm.to_sym : false) || @@orm
28
35
  end
29
36
 
37
+ # alias for {#orm}
38
+ # @see #orm
30
39
  def self.orm=(orm = nil)
31
40
  orm(orm)
32
41
  end
33
42
 
43
+ # instance version of {Config#orm}
44
+ # @see Config#orm
34
45
  def orm(orm=nil)
35
46
  self.class.orm(orm)
36
47
  end
37
48
 
49
+ # Provides simple DSL for the config block.
38
50
  class Block
51
+ # @see Config#orm
39
52
  def orm(orm = nil)
40
53
  @orm = (orm ? orm.to_sym : false) || @orm
41
54
  end
42
55
 
56
+ # Decides whether to enable PublicActivity.
57
+ # @param en [Boolean] Enabled?
43
58
  def enabled(en = nil)
44
59
  @en = (en.nil? ? @en : en)
45
60
  end
@@ -1,5 +1,7 @@
1
1
  module PublicActivity
2
+ # Provides helper methods for selecting activities from a user.
2
3
  module Activist
4
+ # Delegates to configured ORM.
3
5
  def self.included(base)
4
6
  base.extend PublicActivity::inherit_orm("Activist")
5
7
  end
@@ -1,4 +1,5 @@
1
1
  module PublicActivity
2
+ # Loads database-specific routines for use by PublicActivity.
2
3
  class Adapter < inherit_orm("Adapter")
3
4
  end
4
5
  end
@@ -1,5 +1,7 @@
1
1
  module PublicActivity
2
+ # Provides association for activities bound to this object by *trackable*.
2
3
  module Trackable
4
+ # Delegates to ORM.
3
5
  def self.included(base)
4
6
  base.extend PublicActivity::inherit_orm("Trackable")
5
7
  end
@@ -5,16 +5,12 @@ module PublicActivity
5
5
  module Activist
6
6
  extend ActiveSupport::Concern
7
7
 
8
+ # Loads the {ClassMethods#activist} method for declaring the class
9
+ # as an activist.
8
10
  def self.extended(base)
9
11
  base.extend(ClassMethods)
10
12
  end
11
- # Association of activities as their owner.
12
- # @!method activities
13
- # @return [Array<Activity>] Activities which self is the owner of.
14
13
 
15
- # Association of activities as their recipient.
16
- # @!method private_activities
17
- # @return [Array<Activity>] Activities which self is the recipient of.
18
14
 
19
15
  # Module extending classes that serve as owners
20
16
  module ClassMethods
@@ -35,7 +31,14 @@ module PublicActivity
35
31
  # User.first.activities
36
32
  #
37
33
  def activist
34
+ # Association of activities as their owner.
35
+ # @!method activities_as_owner
36
+ # @return [Array<Activity>] Activities which self is the owner of.
38
37
  has_many :activities_as_owner, :class_name => "::PublicActivity::Activity", :as => :owner
38
+
39
+ # Association of activities as their recipient.
40
+ # @!method activities_as_recipient
41
+ # @return [Array<Activity>] Activities which self is the recipient of.
39
42
  has_many :activities_as_recipient, :class_name => "::PublicActivity::Activity", :as => :recipient
40
43
  end
41
44
  end
@@ -15,9 +15,10 @@ module PublicActivity
15
15
  # Serialize parameters Hash
16
16
  serialize :parameters, Hash
17
17
 
18
- # should recipient and owner be accessible?
19
- attr_accessible :key, :owner, :parameters, :recipient, :trackable
18
+ if ::ActiveRecord::VERSION::MAJOR < 4
19
+ attr_accessible :key, :owner, :parameters, :recipient, :trackable
20
+ end
20
21
  end
21
22
  end
22
23
  end
23
- end
24
+ end
@@ -1,6 +1,10 @@
1
1
  module PublicActivity
2
2
  module ORM
3
+ # Support for ActiveRecord for PublicActivity. Used by default and supported
4
+ # officialy.
3
5
  module ActiveRecord
6
+ # Provides ActiveRecord specific, database-related routines for use by
7
+ # PublicActivity.
4
8
  class Adapter
5
9
  # Creates the activity on `trackable` with `options`
6
10
  def self.create_activity(trackable, options)
@@ -1,7 +1,11 @@
1
1
  module PublicActivity
2
2
  module ORM
3
3
  module ActiveRecord
4
+ # Implements {PublicActivity::Trackable} for ActiveRecord
5
+ # @see PublicActivity::Trackable
4
6
  module Trackable
7
+ # Creates an association for activities where self is the *trackable*
8
+ # object.
5
9
  def self.extended(base)
6
10
  base.has_many :activities, :class_name => "::PublicActivity::Activity", :as => :trackable
7
11
  end
@@ -0,0 +1,46 @@
1
+ module PublicActivity
2
+ module ORM
3
+ module MongoMapper
4
+ # Module extending classes that serve as owners
5
+ module Activist
6
+ extend ActiveSupport::Concern
7
+
8
+ def self.extended(base)
9
+ base.extend(ClassMethods)
10
+ end
11
+ # Association of activities as their owner.
12
+ # @!method activities
13
+ # @return [Array<Activity>] Activities which self is the owner of.
14
+
15
+ # Association of activities as their recipient.
16
+ # @!method private_activities
17
+ # @return [Array<Activity>] Activities which self is the recipient of.
18
+
19
+ # Module extending classes that serve as owners
20
+ module ClassMethods
21
+ # Adds MongoMapper associations to model to simplify fetching
22
+ # so you can list activities performed by the owner.
23
+ # It is completely optional. Any model can be an owner to an activity
24
+ # even without being an explicit activist.
25
+ #
26
+ # == Usage:
27
+ # In model:
28
+ #
29
+ # class User
30
+ # include MongoMapper::Document
31
+ # include PublicActivity::Model
32
+ # activist
33
+ # end
34
+ #
35
+ # In controller:
36
+ # User.first.activities
37
+ #
38
+ def activist
39
+ many :activities_as_owner, :class_name => "::PublicActivity::Activity", :as => :owner
40
+ many :activities_as_recipient, :class_name => "::PublicActivity::Activity", :as => :recipient
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,33 @@
1
+ require 'mongo_mapper'
2
+ require 'active_support/core_ext'
3
+
4
+ module PublicActivity
5
+ module ORM
6
+ module MongoMapper
7
+ # The MongoMapper document containing
8
+ # details about recorded activity.
9
+ class Activity
10
+ include ::MongoMapper::Document
11
+ include Renderable
12
+
13
+ class SymbolHash < Hash
14
+ def self.from_mongo(value)
15
+ value.symbolize_keys unless value.nil?
16
+ end
17
+ end
18
+
19
+ # Define polymorphic association to the parent
20
+ belongs_to :trackable, polymorphic: true
21
+ # Define ownership to a resource responsible for this activity
22
+ belongs_to :owner, polymorphic: true
23
+ # Define ownership to a resource targeted by this activity
24
+ belongs_to :recipient, polymorphic: true
25
+
26
+ key :key, String
27
+ key :parameters, SymbolHash
28
+
29
+ timestamps!
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,12 @@
1
+ module PublicActivity
2
+ module ORM
3
+ module MongoMapper
4
+ class Adapter
5
+ # Creates the activity on `trackable` with `options`
6
+ def self.create_activity(trackable, options)
7
+ trackable.activities.create options
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module PublicActivity
2
+ module ORM
3
+ module MongoMapper
4
+ module Trackable
5
+ def self.extended(base)
6
+ base.many :activities, :class_name => "::PublicActivity::Activity", order: :created_at.asc, :as => :trackable
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ require_relative "mongo_mapper/activity.rb"
2
+ require_relative "mongo_mapper/adapter.rb"
3
+ require_relative "mongo_mapper/activist.rb"
4
+ require_relative "mongo_mapper/trackable.rb"
@@ -8,6 +8,7 @@ module PublicActivity
8
8
  class Activity
9
9
  include ::Mongoid::Document
10
10
  include ::Mongoid::Timestamps
11
+ include ::Mongoid::Attributes::Dynamic if (::Mongoid::VERSION =~ /^4/) == 0
11
12
  include Renderable
12
13
 
13
14
  # Define polymorphic association to the parent
@@ -1,4 +1,6 @@
1
1
  module PublicActivity
2
+ # Provides logic for rendering activities. Handles both i18n strings
3
+ # support and smart partials rendering (different templates per activity key).
2
4
  module Renderable
3
5
  # Virtual attribute returning text description of the activity
4
6
  # using the activity's key to translate using i18n.
@@ -80,23 +82,25 @@ module PublicActivity
80
82
  return context.render :text => self.text(params) if params[:display].to_sym == :"i18n"
81
83
  partial_path = 'public_activity/'+params[:display].to_s
82
84
  end
83
- # if we're going to render a partial, let it throw when none can be found
84
- params_indifferent = self.parameters.with_indifferent_access
85
- params_indifferent.merge!(params)
85
+
86
86
  controller = PublicActivity.get_controller
87
- layout = params_indifferent.delete(:layout)
88
- if layout
87
+ if layout = params.delete(:layout)
89
88
  layout = layout.to_s
90
89
  layout = layout[0,8] == "layouts/" ? layout : "layouts/#{layout}"
91
90
  end
91
+
92
+ locals = params.delete(:locals) || Hash.new
93
+
94
+ params_indifferent = self.parameters.with_indifferent_access
95
+ params_indifferent.merge!(params)
96
+
92
97
  context.render :partial => (partial_path || self.template_path(self.key)),
93
98
  :layout => layout,
94
- :locals =>
95
- {:a => self, :activity => self,
99
+ :locals => locals.merge(:a => self, :activity => self,
96
100
  :controller => controller,
97
101
  :current_user => controller.respond_to?(:current_user) ?
98
102
  controller.current_user : nil ,
99
- :p => params_indifferent, :params => params_indifferent}
103
+ :p => params_indifferent, :params => params_indifferent)
100
104
  end
101
105
 
102
106
  protected
@@ -1,4 +1,5 @@
1
1
  module PublicActivity
2
+ # Enables per-class disabling of PublicActivity functionality.
2
3
  module Deactivatable
3
4
  extend ActiveSupport::Concern
4
5
 
@@ -17,6 +18,8 @@ module PublicActivity
17
18
  PublicActivity.enabled? && self.class.public_activity_enabled_for_model
18
19
  end
19
20
 
21
+ # Provides global methods to disable or enable PublicActivity on a per-class
22
+ # basis.
20
23
  module ClassMethods
21
24
  # Switches public_activity off for this class
22
25
  def public_activity_off
@@ -9,13 +9,13 @@ module PublicActivity
9
9
  # == Options
10
10
  #
11
11
  # [:key]
12
- # See {#activity_key}
12
+ # See {Common#activity_key}
13
13
  # [:owner]
14
- # See {#activity_owner}
14
+ # See {Common#activity_owner}
15
15
  # [:params]
16
- # See {#activity_params}
16
+ # See {Common#activity_params}
17
17
  # [:recipient]
18
- # Set the recipient for this activity. Useful for private notifications, which should only be visible to a certain user. See {#activity_recipient}.
18
+ # Set the recipient for this activity. Useful for private notifications, which should only be visible to a certain user. See {Common#activity_recipient}.
19
19
  # @example
20
20
  #
21
21
  # @article = Article.new
@@ -66,7 +66,7 @@ module PublicActivity
66
66
  # provide id number of the owner object.
67
67
  # [:params]
68
68
  # Accepts a Hash with custom parameters you want to pass to i18n.translate
69
- # method. It is later used in {Activity#text} method.
69
+ # method. It is later used in {Renderable#text} method.
70
70
  # == Example:
71
71
  # class Article < ActiveRecord::Base
72
72
  # include PublicActivity::Model
@@ -128,7 +128,7 @@ module PublicActivity
128
128
  # In the example above, given a model Article with boolean column _published_.
129
129
  # The activities with key _article.update_ will only be created
130
130
  # if the published status is set to true on that article.
131
- # @param options [Hash] options
131
+ # @param opts [Hash] options
132
132
  # @return [nil] options
133
133
  def tracked(opts = {})
134
134
  options = opts.clone