activity 0.0.1
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 +15 -0
- data/app/models/action.rb +17 -0
- data/lib/activity.rb +70 -0
- data/lib/activity/engine.rb +9 -0
- data/lib/generators/activity.rb +31 -0
- data/lib/generators/activity/activity_generator.rb +24 -0
- data/lib/generators/activity/templates/migration.rb +20 -0
- metadata +86 -0
data/README
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Activity
|
2
|
+
=======
|
3
|
+
|
4
|
+
Activity is a rails engine that enables you to log actions by users on your models.
|
5
|
+
|
6
|
+
|
7
|
+
Example
|
8
|
+
=======
|
9
|
+
|
10
|
+
class Comment < ActiveRecord::Base
|
11
|
+
actionable :user_id
|
12
|
+
# Your comment model here
|
13
|
+
end
|
14
|
+
|
15
|
+
Copyright (c) 2010 Joshua Wood (joshuawood.net), released under the MIT license
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Action < ActiveRecord::Base
|
2
|
+
set_table_name :activity
|
3
|
+
|
4
|
+
belongs_to :model, :polymorphic => true
|
5
|
+
belongs_to :actor, :polymorphic => true
|
6
|
+
|
7
|
+
scope :latest, order("`created_at` DESC, `id` DESC")
|
8
|
+
scope :limit, lambda {|lim| limit(lim) }
|
9
|
+
scope :for_model, lambda {|model| where(:model_id => model.id, :model_type => model.class.name.to_sym) }
|
10
|
+
scope :for_model_type, lambda {|type| where(:model_type => type) }
|
11
|
+
|
12
|
+
def to_s(l=nil)
|
13
|
+
haml = Haml::Engine.new(I18n.t('activity.'+self.model_type.to_s.downcase+'.'+(l.nil? ? '' : l.to_s+'.')+self.action.to_s.downcase))
|
14
|
+
haml.render( Object.new, {:actor => self.actor, :model => self.model} )
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/lib/activity.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# Require Rails engine
|
2
|
+
module Activity
|
3
|
+
require 'activity/engine' if defined?(Rails)
|
4
|
+
require 'generators/activity/activity_generator'
|
5
|
+
|
6
|
+
module Actionable
|
7
|
+
|
8
|
+
def self.included(base)
|
9
|
+
base.extend ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
def actionable
|
14
|
+
has_many :actions, :as => :model, :dependent => :destroy, :order => 'created_at ASC'
|
15
|
+
# after_create :action_after_create
|
16
|
+
include Activity::Actionable::InstanceMethods
|
17
|
+
extend Activity::Actionable::SingletonMethods
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# This module contains class methods
|
22
|
+
module SingletonMethods
|
23
|
+
end
|
24
|
+
|
25
|
+
# This module contains instance methods
|
26
|
+
module InstanceMethods
|
27
|
+
# Method to determine if the model is actionable
|
28
|
+
def actionable
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
module Actable
|
36
|
+
|
37
|
+
def self.included(base)
|
38
|
+
base.extend ClassMethods
|
39
|
+
end
|
40
|
+
|
41
|
+
module ClassMethods
|
42
|
+
def actable
|
43
|
+
has_many :acts, :class_name => 'Action', :as => :actor, :dependent => :destroy, :order => 'created_at ASC'
|
44
|
+
# after_create :action_after_create
|
45
|
+
include Activity::Actable::InstanceMethods
|
46
|
+
extend Activity::Actable::SingletonMethods
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# This module contains class methods
|
51
|
+
module SingletonMethods
|
52
|
+
end
|
53
|
+
|
54
|
+
# This module contains instance methods
|
55
|
+
module InstanceMethods
|
56
|
+
# Method to determine if the model is actable
|
57
|
+
def actable
|
58
|
+
true
|
59
|
+
end
|
60
|
+
# Records the activity to the model
|
61
|
+
def act(action,model)
|
62
|
+
self.acts.create({:action=>action,:model_id=>model.id,:model_type=>model.class.name.to_sym})
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
ActiveRecord::Base.send(:include, Activity::Actionable)
|
70
|
+
ActiveRecord::Base.send(:include, Activity::Actable)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Activity
|
2
|
+
module Activity
|
3
|
+
module Actionable
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def actionable(user_key)
|
11
|
+
has_many :actions, :as => :model, :dependent => :destroy, :order => 'created_at ASC'
|
12
|
+
belongs_to :actioner, :class_name => 'User', :foreign_key => user_key
|
13
|
+
after_create :action_after_create
|
14
|
+
include Activity::Actionable::InstanceMethods
|
15
|
+
extend Activity::Actionable::SingletonMethods
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# This module contains class methods
|
20
|
+
module SingletonMethods
|
21
|
+
end
|
22
|
+
|
23
|
+
# This module contains instance methods
|
24
|
+
module InstanceMethods
|
25
|
+
def action_after_create
|
26
|
+
self.actions.create({:action=>:create,:user_id=>self.actioner.id})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# lib/generators/activity/activity_generator.rb
|
2
|
+
# http://www.themodestrubyist.com/2010/03/16/rails-3-plugins---part-3---rake-tasks-generators-initializers-oh-my/
|
3
|
+
require 'rails/generators'
|
4
|
+
require 'rails/generators/migration'
|
5
|
+
|
6
|
+
class ActivityGenerator < Rails::Generators::Base
|
7
|
+
include Rails::Generators::Migration
|
8
|
+
def self.source_root
|
9
|
+
@source_root ||= File.join(File.dirname(__FILE__), 'templates')
|
10
|
+
end
|
11
|
+
# Implement the required interface for Rails::Generators::Migration.
|
12
|
+
# taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
|
13
|
+
def self.next_migration_number(dirname)
|
14
|
+
if ActiveRecord::Base.timestamped_migrations
|
15
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
16
|
+
else
|
17
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_migration_file
|
22
|
+
migration_template 'migration.rb', 'db/migrate/create_activity.rb'
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class CreateActivity < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :activity do |t|
|
4
|
+
t.integer :model_id
|
5
|
+
t.string :model_type
|
6
|
+
t.string :action
|
7
|
+
t.integer :actor_id
|
8
|
+
t.string :actor_type
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
add_index :activity, :model_id, :name => "index_activity_on_model_id"
|
12
|
+
add_index :activity, :model_type, :name => "index_activity_on_model_type"
|
13
|
+
add_index :activity, :actor_id, :name => "index_activity_on_actor_id"
|
14
|
+
add_index :activity, :actor_type, :name => "index_activity_on_actor_type"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.down
|
18
|
+
drop_table :activity
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activity
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors: []
|
13
|
+
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-11-26 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 3
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :runtime
|
32
|
+
name: haml
|
33
|
+
prerelease: false
|
34
|
+
version_requirements: *id001
|
35
|
+
description:
|
36
|
+
email:
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README
|
43
|
+
files:
|
44
|
+
- app/models/action.rb
|
45
|
+
- lib/activity.rb
|
46
|
+
- lib/activity/engine.rb
|
47
|
+
- lib/generators/activity.rb
|
48
|
+
- lib/generators/activity/activity_generator.rb
|
49
|
+
- lib/generators/activity/templates/migration.rb
|
50
|
+
- README
|
51
|
+
has_rdoc: true
|
52
|
+
homepage:
|
53
|
+
licenses: []
|
54
|
+
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
hash: 3
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
requirements: []
|
79
|
+
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 1.3.7
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: Logging engine for Ruby on Rails 3
|
85
|
+
test_files: []
|
86
|
+
|