mailboxer 0.1.4 → 0.2.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.
- data/.gitignore +1 -0
- data/VERSION +1 -1
- data/app/models/conversation.rb +1 -1
- data/app/models/message.rb +1 -1
- data/app/models/receipt.rb +80 -64
- data/lib/mailboxer/models/messageable.rb +3 -3
- data/mailboxer.gemspec +3 -4
- data/spec/models/conversation_spec.rb +9 -0
- metadata +26 -25
data/.gitignore
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/app/models/conversation.rb
CHANGED
@@ -87,7 +87,7 @@ class Conversation < ActiveRecord::Base
|
|
87
87
|
|
88
88
|
#Returns the receipts of the conversation for one participants
|
89
89
|
def receipts_for(participant)
|
90
|
-
|
90
|
+
return Receipt.conversation(self).receiver(participant)
|
91
91
|
end
|
92
92
|
|
93
93
|
#Returns the number of messages of the conversation
|
data/app/models/message.rb
CHANGED
@@ -3,7 +3,7 @@ class Message < Notification
|
|
3
3
|
belongs_to :conversation, :validate => true, :autosave => true
|
4
4
|
validates_presence_of :sender
|
5
5
|
|
6
|
-
|
6
|
+
class_attribute :on_deliver_callback
|
7
7
|
protected :on_deliver_callback
|
8
8
|
scope :conversation, lambda { |conversation|
|
9
9
|
where(:conversation_id => conversation.id)
|
data/app/models/receipt.rb
CHANGED
@@ -1,93 +1,109 @@
|
|
1
1
|
class Receipt < ActiveRecord::Base
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
validates_presence_of :receiver
|
2
|
+
belongs_to :notification, :validate => true, :autosave => true
|
3
|
+
belongs_to :receiver, :polymorphic => :true
|
4
|
+
belongs_to :message, :foreign_key => "notification_id"
|
7
5
|
|
8
|
-
|
6
|
+
validates_presence_of :receiver
|
7
|
+
|
8
|
+
scope :receiver, lambda { |receiver|
|
9
9
|
where(:receiver_id => receiver.id,:receiver_type => receiver.class.to_s)
|
10
10
|
}
|
11
11
|
#Notifications Scope checks type to be nil, not Notification because of STI behaviour
|
12
12
|
#with the primary class (no type is saved)
|
13
13
|
scope :notifications_receipts, joins(:notification).where('notifications.type' => nil)
|
14
14
|
scope :messages_receipts, joins(:notification).where('notifications.type' => Message.to_s)
|
15
|
-
|
15
|
+
scope :notification, lambda { |notification|
|
16
16
|
where(:notification_id => notification.id)
|
17
17
|
}
|
18
|
-
|
19
|
-
joins(:
|
18
|
+
scope :conversation, lambda { |conversation|
|
19
|
+
joins(:message).where('notifications.conversation_id' => conversation.id)
|
20
20
|
}
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
scope :sentbox, where(:mailbox_type => "sentbox")
|
22
|
+
scope :inbox, where(:mailbox_type => "inbox")
|
23
|
+
scope :trash, where(:trashed => true)
|
24
|
+
scope :not_trash, where(:trashed => false)
|
25
|
+
scope :read, where(:read => true)
|
26
|
+
scope :unread, where(:read => false)
|
27
|
+
|
28
|
+
after_validation :remove_duplicate_errors
|
29
|
+
class << self
|
31
30
|
#Marks all the receipts from the relation as read
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
def mark_as_read(options={})
|
32
|
+
update_receipts({:read => true}, options)
|
33
|
+
end
|
35
34
|
|
36
35
|
#Marks all the receipts from the relation as unread
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
def mark_as_unread(options={})
|
37
|
+
update_receipts({:read => false}, options)
|
38
|
+
end
|
40
39
|
|
41
40
|
#Marks all the receipts from the relation as trashed
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
def move_to_trash(options={})
|
42
|
+
update_receipts({:trashed => true}, options)
|
43
|
+
end
|
45
44
|
|
46
45
|
#Marks all the receipts from the relation as not trashed
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
def untrash(options={})
|
47
|
+
update_receipts({:trashed => false}, options)
|
48
|
+
end
|
50
49
|
|
51
50
|
#Moves all the receipts from the relation to inbox
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
def move_to_inbox(options={})
|
52
|
+
update_receipts({:mailbox_type => :inbox, :trashed => false}, options)
|
53
|
+
end
|
55
54
|
|
56
55
|
#Moves all the receipts from the relation to sentbox
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
56
|
+
def move_to_sentbox(options={})
|
57
|
+
update_receipts({:mailbox_type => :sentbox, :trashed => false}, options)
|
58
|
+
end
|
59
|
+
|
60
|
+
#This methods helps to do a update_all with table joins, not currently supported by rails.
|
61
|
+
#Acording to the github ticket https://github.com/rails/rails/issues/522 it should be
|
62
|
+
#supported with 3.2.
|
63
|
+
def update_receipts(updates,options={})
|
64
|
+
ids = Array.new
|
65
|
+
where(options).each do |rcp|
|
66
|
+
ids << rcp.id
|
67
|
+
end
|
68
|
+
temp_ids = ids.clone
|
69
|
+
condition = "id = ? "
|
70
|
+
temp_ids.drop(1).each do
|
71
|
+
condition << "OR id = ? "
|
72
|
+
end
|
73
|
+
conditions = [condition].concat(ids)
|
74
|
+
Receipt.except(:where).except(:joins).where(conditions).update_all(updates)
|
75
|
+
end
|
76
|
+
end
|
61
77
|
|
62
78
|
#Marks the receipt as read
|
63
|
-
|
64
|
-
|
65
|
-
|
79
|
+
def mark_as_read
|
80
|
+
update_attributes(:read => true)
|
81
|
+
end
|
66
82
|
|
67
83
|
#Marks the receipt as unread
|
68
|
-
|
69
|
-
|
70
|
-
|
84
|
+
def mark_as_unread
|
85
|
+
update_attributes(:read => false)
|
86
|
+
end
|
71
87
|
|
72
88
|
#Marks the receipt as trashed
|
73
|
-
|
74
|
-
|
75
|
-
|
89
|
+
def move_to_trash
|
90
|
+
update_attributes(:trashed => true)
|
91
|
+
end
|
76
92
|
|
77
93
|
#Marks the receipt as not trashed
|
78
|
-
|
79
|
-
|
80
|
-
|
94
|
+
def untrash
|
95
|
+
update_attributes(:trashed => false)
|
96
|
+
end
|
81
97
|
|
82
98
|
#Moves the receipt to inbox
|
83
|
-
|
84
|
-
|
85
|
-
|
99
|
+
def move_to_inbox
|
100
|
+
update_attributes(:mailbox_type => :inbox, :trashed => false)
|
101
|
+
end
|
86
102
|
|
87
103
|
#Moves the receipt to sentbox
|
88
|
-
|
89
|
-
|
90
|
-
|
104
|
+
def move_to_sentbox
|
105
|
+
update_attributes(:mailbox_type => :sentbox, :trashed => false)
|
106
|
+
end
|
91
107
|
|
92
108
|
#Returns the conversation associated to the receipt if the notification is a Message
|
93
109
|
def conversation
|
@@ -95,16 +111,16 @@ class Receipt < ActiveRecord::Base
|
|
95
111
|
return nil
|
96
112
|
end
|
97
113
|
|
98
|
-
|
114
|
+
protected
|
99
115
|
|
100
116
|
#Removes the duplicate error about not present subject from Conversation if it has been already
|
101
117
|
#raised by Message
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
118
|
+
def remove_duplicate_errors
|
119
|
+
if self.errors["notification.conversation.subject"].present? and self.errors["notification.subject"].present?
|
120
|
+
self.errors["notification.conversation.subject"].each do |msg|
|
121
|
+
self.errors["notification.conversation.subject"].delete(msg)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
109
125
|
|
110
126
|
end
|
@@ -20,21 +20,21 @@ module Mailboxer
|
|
20
20
|
#Returning any kind of indentification you want for the model
|
21
21
|
def name
|
22
22
|
super
|
23
|
-
rescue
|
23
|
+
rescue NameError
|
24
24
|
return "You should add method :name in your Messageable model"
|
25
25
|
end
|
26
26
|
|
27
27
|
#Returning the email address of the model
|
28
28
|
def email
|
29
29
|
super
|
30
|
-
rescue
|
30
|
+
rescue NameError
|
31
31
|
return "define_email@on_your.model"
|
32
32
|
end
|
33
33
|
|
34
34
|
#Returning whether an email should be sent for this object (Message or Notification)
|
35
35
|
def should_email?(object)
|
36
36
|
super
|
37
|
-
rescue
|
37
|
+
rescue NameError
|
38
38
|
return true
|
39
39
|
end
|
40
40
|
|
data/mailboxer.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "mailboxer"
|
3
|
-
s.version = "0.
|
3
|
+
s.version = "0.2.0"
|
4
4
|
s.authors = ["Eduardo Casanova Cuesta"]
|
5
5
|
s.summary = "Messaging system for rails apps."
|
6
6
|
s.description = "A Rails engine that allows any model to act as messageable, permitting it interchange messages with any other messageable model." +
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
# Development Gem dependencies
|
18
18
|
#
|
19
|
-
|
19
|
+
s.add_runtime_dependency('rails', '3.1.0.rc4')
|
20
20
|
# Testing database
|
21
21
|
s.add_development_dependency('sqlite3-ruby')
|
22
22
|
# Debugging
|
@@ -24,13 +24,12 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_development_dependency('ruby-debug', '~> 0.10.3')
|
25
25
|
end
|
26
26
|
# Specs
|
27
|
-
s.add_development_dependency('rspec-rails', '~> 2.
|
27
|
+
s.add_development_dependency('rspec-rails', '~> 2.6.1')
|
28
28
|
# Fixtures
|
29
29
|
s.add_development_dependency('factory_girl', '~> 1.3.2')
|
30
30
|
# Population
|
31
31
|
s.add_development_dependency('forgery', '~> 0.3.6')
|
32
32
|
# Integration testing
|
33
33
|
s.add_development_dependency('capybara', '~> 0.3.9')
|
34
|
-
|
35
34
|
end
|
36
35
|
|
@@ -37,4 +37,13 @@ describe Conversation do
|
|
37
37
|
@conversation.recipients.count(@entity2).should==1
|
38
38
|
end
|
39
39
|
|
40
|
+
it "should be able to be marked as read" do
|
41
|
+
@conversation.move_to_trash(@entity1)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should be able to be marked as unread" do
|
45
|
+
@conversation.move_to_trash(@entity1)
|
46
|
+
@conversation.untrash(@entity1)
|
47
|
+
end
|
48
|
+
|
40
49
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailboxer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Eduardo Casanova Cuesta
|
@@ -15,10 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-23 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
+
prerelease: false
|
22
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
24
|
none: false
|
24
25
|
requirements:
|
@@ -32,25 +33,27 @@ dependencies:
|
|
32
33
|
version: 0.9.1
|
33
34
|
type: :runtime
|
34
35
|
name: foreigner
|
35
|
-
prerelease: false
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
|
+
prerelease: false
|
38
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
41
|
requirements:
|
41
|
-
- -
|
42
|
+
- - "="
|
42
43
|
- !ruby/object:Gem::Version
|
43
|
-
hash:
|
44
|
+
hash: 15424109
|
44
45
|
segments:
|
45
46
|
- 3
|
47
|
+
- 1
|
46
48
|
- 0
|
47
|
-
-
|
48
|
-
|
49
|
-
|
49
|
+
- rc
|
50
|
+
- 4
|
51
|
+
version: 3.1.0.rc4
|
52
|
+
type: :runtime
|
50
53
|
name: rails
|
51
|
-
prerelease: false
|
52
54
|
version_requirements: *id002
|
53
55
|
- !ruby/object:Gem::Dependency
|
56
|
+
prerelease: false
|
54
57
|
requirement: &id003 !ruby/object:Gem::Requirement
|
55
58
|
none: false
|
56
59
|
requirements:
|
@@ -62,9 +65,9 @@ dependencies:
|
|
62
65
|
version: "0"
|
63
66
|
type: :development
|
64
67
|
name: sqlite3-ruby
|
65
|
-
prerelease: false
|
66
68
|
version_requirements: *id003
|
67
69
|
- !ruby/object:Gem::Dependency
|
70
|
+
prerelease: false
|
68
71
|
requirement: &id004 !ruby/object:Gem::Requirement
|
69
72
|
none: false
|
70
73
|
requirements:
|
@@ -78,25 +81,25 @@ dependencies:
|
|
78
81
|
version: 0.10.3
|
79
82
|
type: :development
|
80
83
|
name: ruby-debug
|
81
|
-
prerelease: false
|
82
84
|
version_requirements: *id004
|
83
85
|
- !ruby/object:Gem::Dependency
|
86
|
+
prerelease: false
|
84
87
|
requirement: &id005 !ruby/object:Gem::Requirement
|
85
88
|
none: false
|
86
89
|
requirements:
|
87
90
|
- - ~>
|
88
91
|
- !ruby/object:Gem::Version
|
89
|
-
hash:
|
92
|
+
hash: 21
|
90
93
|
segments:
|
91
94
|
- 2
|
92
|
-
-
|
93
|
-
-
|
94
|
-
version: 2.
|
95
|
+
- 6
|
96
|
+
- 1
|
97
|
+
version: 2.6.1
|
95
98
|
type: :development
|
96
99
|
name: rspec-rails
|
97
|
-
prerelease: false
|
98
100
|
version_requirements: *id005
|
99
101
|
- !ruby/object:Gem::Dependency
|
102
|
+
prerelease: false
|
100
103
|
requirement: &id006 !ruby/object:Gem::Requirement
|
101
104
|
none: false
|
102
105
|
requirements:
|
@@ -110,9 +113,9 @@ dependencies:
|
|
110
113
|
version: 1.3.2
|
111
114
|
type: :development
|
112
115
|
name: factory_girl
|
113
|
-
prerelease: false
|
114
116
|
version_requirements: *id006
|
115
117
|
- !ruby/object:Gem::Dependency
|
118
|
+
prerelease: false
|
116
119
|
requirement: &id007 !ruby/object:Gem::Requirement
|
117
120
|
none: false
|
118
121
|
requirements:
|
@@ -126,9 +129,9 @@ dependencies:
|
|
126
129
|
version: 0.3.6
|
127
130
|
type: :development
|
128
131
|
name: forgery
|
129
|
-
prerelease: false
|
130
132
|
version_requirements: *id007
|
131
133
|
- !ruby/object:Gem::Dependency
|
134
|
+
prerelease: false
|
132
135
|
requirement: &id008 !ruby/object:Gem::Requirement
|
133
136
|
none: false
|
134
137
|
requirements:
|
@@ -142,7 +145,6 @@ dependencies:
|
|
142
145
|
version: 0.3.9
|
143
146
|
type: :development
|
144
147
|
name: capybara
|
145
|
-
prerelease: false
|
146
148
|
version_requirements: *id008
|
147
149
|
description: A Rails engine that allows any model to act as messageable, permitting it interchange messages with any other messageable model.It also supports sending system notifications to messageable models.
|
148
150
|
email: ecasanovac@gmail.com
|
@@ -181,7 +183,6 @@ files:
|
|
181
183
|
- lib/mailboxer/exceptions.rb
|
182
184
|
- lib/mailboxer/models/messageable.rb
|
183
185
|
- mailboxer.gemspec
|
184
|
-
- spec/dummy/.project
|
185
186
|
- spec/dummy/Gemfile
|
186
187
|
- spec/dummy/Gemfile.lock
|
187
188
|
- spec/dummy/Rakefile
|
@@ -270,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
270
271
|
requirements: []
|
271
272
|
|
272
273
|
rubyforge_project:
|
273
|
-
rubygems_version: 1.
|
274
|
+
rubygems_version: 1.6.2
|
274
275
|
signing_key:
|
275
276
|
specification_version: 3
|
276
277
|
summary: Messaging system for rails apps.
|