public_activity 0.3.2 → 0.3.3
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.
- data/README.md +19 -8
- data/lib/public_activity/activity.rb +2 -1
- data/lib/public_activity/common.rb +47 -50
- data/lib/public_activity/creation.rb +6 -9
- data/lib/public_activity/destruction.rb +6 -9
- data/lib/public_activity/tracked.rb +10 -13
- data/lib/public_activity/update.rb +6 -9
- data/lib/public_activity/version.rb +1 -1
- metadata +38 -13
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# PublicActivity 
|
2
2
|
|
3
3
|
public_activity provides smooth acitivity tracking for your ActiveRecord models in Rails 3.
|
4
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.
|
@@ -25,12 +25,15 @@ Create migration for activities (in your Rails project):
|
|
25
25
|
|
26
26
|
Add 'tracked' to the model you want to keep track of:
|
27
27
|
|
28
|
+
```ruby
|
28
29
|
class Article < ActiveRecord::Base
|
29
30
|
tracked
|
30
31
|
end
|
32
|
+
```
|
31
33
|
|
32
34
|
To default the owner to the current user (optional)
|
33
|
-
|
35
|
+
|
36
|
+
```ruby
|
34
37
|
#Aplication Controller
|
35
38
|
before_filter :define_current_user
|
36
39
|
|
@@ -42,32 +45,40 @@ To default the owner to the current user (optional)
|
|
42
45
|
class User < ActiveRecord::Base
|
43
46
|
cattr_accessor :current_user
|
44
47
|
end
|
45
|
-
|
48
|
+
```
|
49
|
+
|
46
50
|
And now, by default create/update/destroy activities are recorded in activities table.
|
47
51
|
To display them you can do a simple query:
|
48
52
|
|
53
|
+
```ruby
|
49
54
|
# some_controller.rb
|
50
55
|
def index
|
51
56
|
@activities = PublicActivity::Activity.all
|
52
57
|
end
|
53
|
-
|
58
|
+
```
|
59
|
+
|
54
60
|
And in your views:
|
55
61
|
|
62
|
+
```erb
|
56
63
|
<% for activity in @activities %>
|
57
64
|
<%= activity.text %><br/>
|
58
65
|
<% end %>
|
59
|
-
|
66
|
+
```
|
67
|
+
|
60
68
|
The only thing left is to add templates (config/pba.yml), for example:
|
61
69
|
|
70
|
+
```yaml
|
62
71
|
activity:
|
63
72
|
article:
|
64
73
|
create: 'Article has been created'
|
65
74
|
update: 'Someone has edited the article'
|
66
75
|
destroy: 'Some user removed an article!'
|
76
|
+
```
|
77
|
+
Place this in a file and reference it in a Rails initializer.
|
67
78
|
|
68
|
-
|
69
|
-
|
79
|
+
```ruby
|
70
80
|
PublicActivity::Activity.template = YAML.load_file("#{RAILS_ROOT}/config/pba.yml")
|
81
|
+
```
|
71
82
|
|
72
83
|
This is only a basic example, refer to documentation for more options and customization!
|
73
84
|
## Documentation
|
@@ -75,4 +86,4 @@ This is only a basic example, refer to documentation for more options and custom
|
|
75
86
|
You can find documentation [here](http://rubydoc.info/gems/public_activity/)
|
76
87
|
|
77
88
|
## License
|
78
|
-
Copyright (c)
|
89
|
+
Copyright (c) 2012 Piotrek Okoński, released under the MIT license
|
@@ -2,58 +2,55 @@ module PublicActivity
|
|
2
2
|
# Common methods shared across the gem.
|
3
3
|
module Common
|
4
4
|
extend ActiveSupport::Concern
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
if owner.nil? && ((defined? User) != nil) && User.respond_to?(:current_user)
|
25
|
-
owner = User.current_user
|
26
|
-
end
|
27
|
-
|
28
|
-
activity = self.activities.create(:key => key, :owner => owner, :parameters => params)
|
29
|
-
if !Pusher.app_id.nil? && !Pusher.key.nil? && !Pusher.secret.nil?
|
30
|
-
Pusher['acitivty-channel'].trigger('acitivty-create', {:key => key, :owner => owner, :parameters => params, :text => activity.text, :object => self})
|
31
|
-
end
|
5
|
+
# Directly creates activity record in the database, based on supplied arguments.
|
6
|
+
# Only first argument - key - is required.
|
7
|
+
#
|
8
|
+
# == Usage:
|
9
|
+
#
|
10
|
+
# current_user.create_activity("activity.user.avatar_changed") if @user.avatar_file_name_changed?
|
11
|
+
#
|
12
|
+
# == Parameters:
|
13
|
+
# [key]
|
14
|
+
# Custom key that will be used as a i18n translation key - *required*
|
15
|
+
# [owner]
|
16
|
+
# Polymorphic relation specifying the owner of this activity (for example, a User who performed this task) - *optional*
|
17
|
+
# [params]
|
18
|
+
# Hash with parameters passed directly into i18n.translate method - *optional*
|
19
|
+
#
|
20
|
+
def create_activity(key, owner = nil, params = {})
|
21
|
+
|
22
|
+
if owner.nil? && ((defined? User) != nil) && User.respond_to?(:current_user)
|
23
|
+
owner = User.current_user
|
32
24
|
end
|
33
25
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
def prepare_settings
|
39
|
-
# user responsible for the activity
|
40
|
-
if self.activity_owner
|
41
|
-
owner = self.activity_owner
|
42
|
-
else
|
43
|
-
owner = self.class.activity_owner_global
|
44
|
-
end
|
45
|
-
|
46
|
-
case owner
|
47
|
-
when Symbol
|
48
|
-
owner = self.try(owner)
|
49
|
-
when Proc
|
50
|
-
owner = owner.call(self)
|
51
|
-
end
|
52
|
-
#customizable parameters
|
53
|
-
parameters = self.class.activity_params_global
|
54
|
-
parameters.merge! self.activity_params if self.activity_params
|
55
|
-
return {:key => self.activity_key,:owner => owner, :parameters => parameters}
|
56
|
-
end
|
26
|
+
activity = self.activities.create(:key => key, :owner => owner, :parameters => params)
|
27
|
+
if !Pusher.app_id.nil? && !Pusher.key.nil? && !Pusher.secret.nil?
|
28
|
+
Pusher['acitivty-channel'].trigger('acitivty-create', {:key => key, :owner => owner, :parameters => params, :text => activity.text, :object => self})
|
29
|
+
end
|
57
30
|
end
|
31
|
+
|
32
|
+
private
|
33
|
+
# Prepares settings used during creation of Activity record.
|
34
|
+
# params passed directly to tracked model have priority over
|
35
|
+
# settings specified in tracked() method
|
36
|
+
def prepare_settings
|
37
|
+
# user responsible for the activity
|
38
|
+
if self.activity_owner
|
39
|
+
owner = self.activity_owner
|
40
|
+
else
|
41
|
+
owner = self.class.activity_owner_global
|
42
|
+
end
|
43
|
+
|
44
|
+
case owner
|
45
|
+
when Symbol
|
46
|
+
owner = self.try(owner)
|
47
|
+
when Proc
|
48
|
+
owner = owner.call(self)
|
49
|
+
end
|
50
|
+
#customizable parameters
|
51
|
+
parameters = self.class.activity_params_global
|
52
|
+
parameters.merge! self.activity_params if self.activity_params
|
53
|
+
return {:key => self.activity_key,:owner => owner, :parameters => parameters}
|
54
|
+
end
|
58
55
|
end
|
59
56
|
end
|
@@ -6,14 +6,11 @@ module PublicActivity
|
|
6
6
|
included do
|
7
7
|
after_create :activity_on_create
|
8
8
|
end
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
create_activity(settings[:key] || "activity."+self.class.name.parameterize('_')+".create", settings[:owner], settings[:parameters])
|
16
|
-
end
|
17
|
-
end
|
9
|
+
private
|
10
|
+
# Creates activity upon creation of the tracked model
|
11
|
+
def activity_on_create
|
12
|
+
settings = prepare_settings
|
13
|
+
create_activity(settings[:key] || "activity."+self.class.name.parameterize('_')+".create", settings[:owner], settings[:parameters])
|
14
|
+
end
|
18
15
|
end
|
19
16
|
end
|
@@ -6,14 +6,11 @@ module PublicActivity
|
|
6
6
|
included do
|
7
7
|
before_destroy :activity_on_destroy
|
8
8
|
end
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
create_activity("activity."+self.class.name.parameterize('_')+".destroy", settings[:owner], settings[:parameters])
|
16
|
-
end
|
17
|
-
end
|
9
|
+
private
|
10
|
+
# Records an activity upon destruction of the tracked model
|
11
|
+
def activity_on_destroy
|
12
|
+
settings = prepare_settings
|
13
|
+
create_activity("activity."+self.class.name.parameterize('_')+".destroy", settings[:owner], settings[:parameters])
|
14
|
+
end
|
18
15
|
end
|
19
16
|
end
|
@@ -87,12 +87,12 @@ module PublicActivity
|
|
87
87
|
# method. It is later used in {Activity#text} method.
|
88
88
|
# == Example:
|
89
89
|
# @article.activity :parameters => {:title => @article.title, :short => truncate(@article.text, :length => 50)}
|
90
|
-
# Everything specified here has a lower priority than parameters specified directly in {
|
90
|
+
# Everything specified here has a lower priority than parameters specified directly in {#activity} method.
|
91
91
|
# So treat it as a place where you provide 'default' values.
|
92
92
|
# For more dynamic settings refer to {Activity} model
|
93
93
|
# documentation.
|
94
94
|
# [:skip_defaults]
|
95
|
-
# Disables recording of activities on create/update/destroy leaving that to programmer's choice. Check {PublicActivity::Common
|
95
|
+
# Disables recording of activities on create/update/destroy leaving that to programmer's choice. Check {PublicActivity::Common#create_activity}
|
96
96
|
# for a guide on how to manually record activities.
|
97
97
|
def tracked(options = {})
|
98
98
|
include Common
|
@@ -131,8 +131,6 @@ module PublicActivity
|
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
-
# A module with shortcut method for setting own parameters to the {Activity} model
|
135
|
-
module InstanceMethods
|
136
134
|
# A shortcut method for setting custom key, owner and parameters of {Activity}
|
137
135
|
# in one line. Accepts a hash with 3 keys:
|
138
136
|
# :key, :owner, :params. You can specify all of them or just the ones you want to overwrite.
|
@@ -145,7 +143,7 @@ module PublicActivity
|
|
145
143
|
# Specify the owner of the {Activity} (person responsible for the action).
|
146
144
|
# It can be a Proc, Symbol or an ActiveRecord object:
|
147
145
|
# == Examples:
|
148
|
-
# @article.activity :owner => :author
|
146
|
+
# @article.activity :owner => :author
|
149
147
|
# @article.activity :owner => {|o| o.author}
|
150
148
|
# @article.activity :owner => User.where(:login => 'piotrek').first
|
151
149
|
# Keep in mind that owner relation is polymorphic, so you can't just provide id number of the owner object.
|
@@ -160,22 +158,21 @@ module PublicActivity
|
|
160
158
|
#
|
161
159
|
# class Article < ActiveRecord::Base
|
162
160
|
# tracked
|
163
|
-
# end
|
161
|
+
# end
|
164
162
|
#
|
165
163
|
# In controller:
|
166
164
|
#
|
167
165
|
# @article = Article.new
|
168
|
-
# @article.title = "New article"
|
166
|
+
# @article.title = "New article"
|
169
167
|
# @article.activity :key => "my.custom.article.key", :owner => @article.author, :params => {:title => @article.title}
|
170
168
|
# @article.save
|
171
169
|
# @article.activities.last.key #=> "my.custom.article.key"
|
172
170
|
# @article.activities.last.parameters #=> {:title => "New article"}
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
end
|
171
|
+
def activity(options = {})
|
172
|
+
self.activity_key = options[:key] if options[:key]
|
173
|
+
self.activity_owner = options[:owner] if options[:owner]
|
174
|
+
self.activity_params = options[:params] if options[:params]
|
178
175
|
end
|
179
|
-
|
176
|
+
|
180
177
|
end
|
181
178
|
end
|
@@ -6,14 +6,11 @@ module PublicActivity
|
|
6
6
|
included do
|
7
7
|
after_update :activity_on_update
|
8
8
|
end
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
create_activity(settings[:key] || "activity."+self.class.name.parameterize('_')+".update", settings[:owner], settings[:parameters])
|
16
|
-
end
|
17
|
-
end
|
9
|
+
private
|
10
|
+
# Creates activity upon modification of the tracked model
|
11
|
+
def activity_on_update
|
12
|
+
settings = prepare_settings
|
13
|
+
create_activity(settings[:key] || "activity."+self.class.name.parameterize('_')+".update", settings[:owner], settings[:parameters])
|
14
|
+
end
|
18
15
|
end
|
19
16
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: public_activity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-05-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
17
|
-
requirement:
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,15 @@ dependencies:
|
|
22
22
|
version: 3.0.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements:
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 3.0.0
|
26
31
|
- !ruby/object:Gem::Dependency
|
27
32
|
name: activesupport
|
28
|
-
requirement:
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
29
34
|
none: false
|
30
35
|
requirements:
|
31
36
|
- - ! '>='
|
@@ -33,10 +38,15 @@ dependencies:
|
|
33
38
|
version: 3.0.0
|
34
39
|
type: :runtime
|
35
40
|
prerelease: false
|
36
|
-
version_requirements:
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 3.0.0
|
37
47
|
- !ruby/object:Gem::Dependency
|
38
48
|
name: i18n
|
39
|
-
requirement:
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
40
50
|
none: false
|
41
51
|
requirements:
|
42
52
|
- - ! '>='
|
@@ -44,10 +54,15 @@ dependencies:
|
|
44
54
|
version: 0.5.0
|
45
55
|
type: :runtime
|
46
56
|
prerelease: false
|
47
|
-
version_requirements:
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.5.0
|
48
63
|
- !ruby/object:Gem::Dependency
|
49
64
|
name: pusher
|
50
|
-
requirement:
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
51
66
|
none: false
|
52
67
|
requirements:
|
53
68
|
- - ! '>='
|
@@ -55,10 +70,15 @@ dependencies:
|
|
55
70
|
version: '0'
|
56
71
|
type: :runtime
|
57
72
|
prerelease: false
|
58
|
-
version_requirements:
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
59
79
|
- !ruby/object:Gem::Dependency
|
60
80
|
name: rspec
|
61
|
-
requirement:
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
62
82
|
none: false
|
63
83
|
requirements:
|
64
84
|
- - ! '>='
|
@@ -66,7 +86,12 @@ dependencies:
|
|
66
86
|
version: '0'
|
67
87
|
type: :development
|
68
88
|
prerelease: false
|
69
|
-
version_requirements:
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
70
95
|
description: Smooth activity tracking for your ActiveRecord models. Provides Activity
|
71
96
|
model with details about actions performed by your users, like adding comments,
|
72
97
|
responding etc.
|
@@ -122,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
147
|
version: '0'
|
123
148
|
requirements: []
|
124
149
|
rubyforge_project:
|
125
|
-
rubygems_version: 1.8.
|
150
|
+
rubygems_version: 1.8.19
|
126
151
|
signing_key:
|
127
152
|
specification_version: 3
|
128
153
|
summary: Smooth activity tracking for ActiveRecord models
|