mail_manager 3.2.5 → 3.2.6
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.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/app/controllers/mail_manager/bounces_controller.rb +13 -1
- data/app/controllers/mail_manager/contacts_controller.rb +1 -2
- data/app/controllers/mail_manager/mailings_controller.rb +2 -4
- data/app/controllers/mail_manager/subscriptions_controller.rb +0 -2
- data/app/models/mail_manager/bounce.rb +9 -7
- data/app/models/mail_manager/contactable_registry.rb +2 -1
- data/app/models/mail_manager/mailable.rb +11 -9
- data/app/models/mail_manager/mailer.rb +13 -5
- data/app/models/mail_manager/mailing.rb +13 -25
- data/app/models/mail_manager/mailing_list.rb +17 -0
- data/app/models/mail_manager/message.rb +12 -1
- data/app/models/mail_manager/subscription.rb +12 -0
- data/app/views/mail_manager/bounces/_email_parts.html.erb +3 -1
- data/app/views/mail_manager/bounces/index.html.erb +1 -1
- data/app/views/mail_manager/bounces/show.html.erb +2 -2
- data/app/views/mail_manager/contacts/_form.html.erb +1 -1
- data/app/views/mail_manager/mailings/index.html.erb +3 -3
- data/app/views/mail_manager/messages/index.html.erb +1 -1
- data/app/views/mail_manager/subscriptions/_subscriptions.html.erb +6 -3
- data/config/routes.rb +2 -2
- data/lib/delayed/status.rb +5 -2
- data/lib/delayed/status_job.rb +5 -21
- data/lib/delayed_overrides/job.rb +6 -0
- data/lib/mail_manager/engine.rb +23 -1
- data/lib/mail_manager/version.rb +1 -1
- data/mail_manager.gemspec +10 -3
- data/spec/test_app/Procfile +5 -3
- data/spec/test_app/config/mail_manager.yml +3 -0
- data/spec/test_app/features/contact_management.feature +7 -0
- data/spec/test_app/features/message_management.feature +8 -1
- data/spec/test_app/features/step_definitions/webrat_steps.rb +6 -2
- data/spec/test_app/lib/debugging.rb +2 -2
- data/spec/test_app/script/full_suite +7 -5
- data/spec/test_app/spec/controllers/mail_manager/bounces_controller_spec.rb +39 -0
- data/spec/test_app/spec/controllers/mail_manager/mailings_controller_spec.rb +12 -0
- data/spec/test_app/spec/models/mail_manager/bounce_spec.rb +31 -0
- data/spec/test_app/spec/models/mail_manager/engine_spec.rb +25 -0
- data/spec/test_app/spec/models/mail_manager/mailing_list_spec.rb +39 -0
- data/spec/test_app/spec/models/mail_manager/mailing_spec.rb +43 -1
- data/spec/test_app/spec/models/mail_manager/message_spec.rb +19 -0
- data/spec/test_app/spec/models/mail_manager/subscription_spec.rb +17 -0
- data/spec/test_app/spec/support/files/bounce-400.txt +73 -0
- data/spec/test_app/spec/support/files/bounce-500.txt +75 -0
- data/spec/test_app/spec/support/files/bounce-invalid-address.txt +73 -0
- data/spec/test_app/spec/support/files/bounce-invalid.txt +113 -0
- data/spec/test_app/spec/support/files/bounce-invalid2.txt +29 -0
- data/spec/test_app/spec/support/files/bounce-invalid3.txt +29 -0
- data/spec/test_app/spec/support/files/bounce-mail-box-full.txt +1178 -0
- data/spec/test_app/spec/support/files/bounce-over-quota.txt +1173 -0
- data/spec/test_app/spec/support/files/bounce-smtp-timeout.txt +73 -0
- data/spec/test_app/spec/support/files/bounce-unknown_domain.txt +73 -0
- data/spec/test_app/spec/support/files/mail_manager_empty_table_prefix.yml +85 -0
- data/spec/test_app/spec/support/files/mail_manager_use_generic_mailables.yml +86 -0
- metadata +36 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5b18070eb704e09c4abee8c914aaa548deb43e6
|
4
|
+
data.tar.gz: 9b29f0f717833d1a4c3b8fa0d2858592b4823195
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18a71c74071f945dcfd0cf5590395f72648e82a13222abb83205702c32446de593dbe9a69d9d310dc8b2ae8e021aee3d6a61d850f050d2c4c6efb7829f16926e
|
7
|
+
data.tar.gz: 751c9ef49582c67528776bf9e0e573316e539a38382df09fd59e7a0ac272b98d661aded4c3bbab1ccfb4e4e1dbd5bd550bf1ed105ef0aca10a4ea9cdee4ac8e3
|
data/README.md
CHANGED
@@ -5,7 +5,10 @@ The gem provides an interface to manage mailing lists, scheduling of email maili
|
|
5
5
|
|
6
6
|
Also available as a stand alone application called [iReach](https://github.com/LoneStarInternet/iReach/releases) including the newsletter manager (newsletter template and elements manager, simple wysiwyg interface to create newsletters, and newsletter archive) and user access management. There is also the i_reach gem that ties mail_manager and newsletter together into one gem.
|
7
7
|
|
8
|
-
|
8
|
+
Online Documentation
|
9
|
+
--------------------
|
10
|
+
* [Homepage](http://ireachnews.com/mail_manager_documentation.html)
|
11
|
+
* [Changelog](http://www.ireachnews.com/index.html#changelog)
|
9
12
|
|
10
13
|
Requirements
|
11
14
|
------------
|
@@ -9,11 +9,23 @@ module MailManager
|
|
9
9
|
@bounces = Bounce.scoped
|
10
10
|
@bounces = @bounces.by_mailing_id(@mailing.id) if @mailing.present?
|
11
11
|
@bounces = @bounces.by_status(status) if status.present?
|
12
|
-
@bounces = @bounces.
|
12
|
+
@bounces = @bounces.order("created_at desc").paginate(
|
13
|
+
:page => (params[:page] || 1)
|
14
|
+
)
|
13
15
|
end
|
14
16
|
|
15
17
|
def show
|
16
18
|
end
|
19
|
+
|
20
|
+
def dismiss
|
21
|
+
@bounce.dismiss
|
22
|
+
redirect_to @bounce
|
23
|
+
end
|
24
|
+
|
25
|
+
def fail_address
|
26
|
+
@bounce.fail_address
|
27
|
+
redirect_to @bounce
|
28
|
+
end
|
17
29
|
|
18
30
|
protected
|
19
31
|
|
@@ -1,8 +1,6 @@
|
|
1
1
|
module MailManager
|
2
2
|
class ContactsController < ::MailManager::ApplicationController
|
3
3
|
|
4
|
-
skip_before_filter :authorize, only: [:subscribe,:double_opt_in,:thank_you]
|
5
|
-
|
6
4
|
include DeleteableActions
|
7
5
|
|
8
6
|
def subscribe
|
@@ -19,6 +17,7 @@ module MailManager
|
|
19
17
|
end
|
20
18
|
|
21
19
|
def thank_you
|
20
|
+
render layout: MailManager.public_layout
|
22
21
|
end
|
23
22
|
|
24
23
|
def double_opt_in
|
@@ -92,10 +92,8 @@ module MailManager
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def get_mailables_for_select
|
95
|
-
|
96
|
-
|
97
|
-
# [mailable.name,"#{mailable.class.name}_#{mailable.id}"]}
|
98
|
-
@mailables_for_select = @mailables.collect{|mailable|
|
95
|
+
@mailables_for_select = @mailables.sort{|a,b| b.created_at <=> a.created_at}.
|
96
|
+
collect{|mailable|
|
99
97
|
[mailable.name,"#{mailable.class.name}_#{mailable.id}"]}
|
100
98
|
end
|
101
99
|
end
|
@@ -22,7 +22,7 @@ module MailManager
|
|
22
22
|
belongs_to :message, :class_name => 'MailManager::Message'
|
23
23
|
belongs_to :mailing, :class_name => 'MailManager::Mailing', counter_cache: true
|
24
24
|
include StatusHistory
|
25
|
-
override_statuses(['needs_manual_intervention','unprocessed','dismissed','resolved','invalid'],'unprocessed')
|
25
|
+
override_statuses(['needs_manual_intervention','unprocessed','dismissed','resolved','invalid','removed','deferred'],'unprocessed')
|
26
26
|
before_create :set_default_status
|
27
27
|
#default_scope :order => "#{MailManager.table_prefix}contacts.last_name, #{MailManager.table_prefix}contacts.first_name, #{MailManager.table_prefix}contacts.email_address",
|
28
28
|
# :joins =>
|
@@ -47,11 +47,11 @@ module MailManager
|
|
47
47
|
change_status(:invalid)
|
48
48
|
elsif delivery_error_code =~ /4\.\d\.\d/ || delivery_error_message.to_s =~ /quota/i
|
49
49
|
update_attribute(:comments, delivery_error_message)
|
50
|
-
change_status(:
|
50
|
+
change_status(:deferred)
|
51
51
|
elsif delivery_error_code =~ /5\.\d\.\d/ && delivery_error_message.present?
|
52
52
|
transaction do
|
53
53
|
update_attribute(:comments, delivery_error_message)
|
54
|
-
change_status(:
|
54
|
+
change_status(:removed)
|
55
55
|
message.change_status(:failed)
|
56
56
|
message.update_attribute(:result,"Failure Message from Bounce: #{delivery_error_message}")
|
57
57
|
Subscription.fail_by_email_address(contact_email_address)
|
@@ -82,10 +82,12 @@ module MailManager
|
|
82
82
|
raise "Status cannot be manually changed unless it needs manual intervention!" unless
|
83
83
|
status.eql?('needs_manual_intervention')
|
84
84
|
transaction do
|
85
|
-
Subscription.fail_by_email_address(contact_email_address)
|
86
|
-
|
87
|
-
|
88
|
-
|
85
|
+
Subscription.fail_by_email_address(contact_email_address) if contact.present?
|
86
|
+
if message.present?
|
87
|
+
message.result = message.result.to_s + "Failed by Administrator: (bounced, not auto resolved) "
|
88
|
+
message.change_status(:failed)
|
89
|
+
end
|
90
|
+
change_status(:removed)
|
89
91
|
end
|
90
92
|
end
|
91
93
|
|
@@ -96,7 +96,8 @@ module MailManager
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def subscribe(mailing_list, status='active')
|
99
|
-
set_contactable_data
|
99
|
+
set_contactable_data
|
100
|
+
MailManager::Subscription.subscribe(contact,mailing_list, status)
|
100
101
|
end
|
101
102
|
|
102
103
|
def unsubscribe(mailing_list)
|
@@ -1,14 +1,16 @@
|
|
1
1
|
class MailManager::Mailable < ActiveRecord::Base
|
2
|
+
self.table_name = "#{MailManager.table_prefix}mailables"
|
2
3
|
attr_accessible :name, :email_text, :email_html
|
3
4
|
default_scope where(reusable: true)
|
4
5
|
include MailManager::MailableRegistry::Mailable
|
5
6
|
end
|
6
|
-
|
7
|
-
MailManager::MailableRegistry.register('MailManager::Mailable',{
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
})
|
7
|
+
if MailManager.register_generic_mailable
|
8
|
+
MailManager::MailableRegistry.register('MailManager::Mailable',{
|
9
|
+
:find_mailables => :all,
|
10
|
+
:name => :name,
|
11
|
+
:parts => [
|
12
|
+
['text/plain', :email_text],
|
13
|
+
['text/html', :email_html]
|
14
|
+
]
|
15
|
+
})
|
16
|
+
end
|
@@ -202,26 +202,34 @@ module MailManager
|
|
202
202
|
if(index % 4 == 2)
|
203
203
|
image = Hash.new()
|
204
204
|
image[:cid] = Base64.encode64(data).gsub(/\s*/,'').reverse[0..59]
|
205
|
-
|
205
|
+
if images.detect{|this_image| this_image[:cid].eql?(image[:cid])}
|
206
|
+
final_html << "cid:#{image[:cid]}"
|
207
|
+
next
|
208
|
+
end
|
206
209
|
#only attach new images!
|
207
|
-
next if images.detect{|this_image| this_image[:cid].eql?(image[:cid])}
|
208
210
|
begin
|
209
211
|
image[:content] = fetch(data)
|
210
212
|
rescue => e
|
211
|
-
image_errors += "Couldn't fetch url '#{data}'<!--, #{e.message} - #{e.backtrace.join("\n")}-->\n"
|
213
|
+
image_errors += "\n Couldn't fetch url '#{data}'<!--, #{e.message} - #{e.backtrace.join("\n")}-->\n"
|
214
|
+
end
|
215
|
+
if image[:content].blank?
|
216
|
+
final_html << data
|
217
|
+
next
|
212
218
|
end
|
213
219
|
image[:filename] = filename = File.basename(data)
|
214
220
|
extension = filename.gsub(/^.*\./,'').downcase
|
215
221
|
Rails.logger.debug "Fetching Image for: #{filename} #{image[:content].to_s[0..30]}"
|
216
222
|
extension = get_extension_from_data(image[:content]) if image_mime_types(extension).blank?
|
217
|
-
image_errors += "Couldn't find mime type for #{extension} on #{data}" if image_mime_types(extension).blank?
|
223
|
+
image_errors += "\n Couldn't find mime type for #{extension} on #{data}" if image_mime_types(extension).blank?
|
218
224
|
image[:content_type] = image_mime_types(extension)
|
225
|
+
final_html << "cid:#{image[:cid]}"
|
219
226
|
images << image
|
220
227
|
else
|
221
228
|
final_html << data
|
222
229
|
end
|
223
230
|
end
|
224
|
-
|
231
|
+
# FIXME: add warnings for missing images email or on the newsletter/mailing page
|
232
|
+
# raise image_errors unless image_errors.eql?('')
|
225
233
|
[final_html,images]
|
226
234
|
end
|
227
235
|
|
@@ -149,31 +149,19 @@ module MailManager
|
|
149
149
|
|
150
150
|
# creates all of the Messages that will be sent for this mailing
|
151
151
|
def initialize_messages
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
emails_hash[email_address] = 1
|
166
|
-
message = Message.new
|
167
|
-
message.subscription = subscription
|
168
|
-
message.contact = contact
|
169
|
-
message.mailing = self
|
170
|
-
message.save
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
save
|
176
|
-
end
|
152
|
+
emails_hash = MailManager::Message.email_address_hash_for_mailing_id(self.id)
|
153
|
+
emails_hash.merge!(MailManager::Subscription.unsubscribed_emails_hash)
|
154
|
+
ids = self.mailing_lists.select('id').map(&:id)
|
155
|
+
active_subscriptions_hash = MailManager::MailingList.
|
156
|
+
active_email_addresses_contact_ids_subscription_ids_for_mailing_list_ids(ids)
|
157
|
+
active_subscriptions_hash.each_pair do | email, data |
|
158
|
+
next if emails_hash[email.to_s.strip.downcase].present?
|
159
|
+
message = MailManager::Message.create({
|
160
|
+
:subscription_id => data[:subscription_id],
|
161
|
+
:contact_id => data[:contact_id],
|
162
|
+
:mailing_id => self.id
|
163
|
+
})
|
164
|
+
end
|
177
165
|
end
|
178
166
|
|
179
167
|
# clean up an email address for sending FIXME - maybe do a bit more
|
@@ -23,6 +23,23 @@ module MailManager
|
|
23
23
|
before_create :set_default_status
|
24
24
|
|
25
25
|
attr_protected :id
|
26
|
+
|
27
|
+
def self.active_email_addresses_contact_ids_subscription_ids_for_mailing_list_ids(mailing_list_ids)
|
28
|
+
results = MailManager::MailingList.connection.execute(
|
29
|
+
%Q|select c.email_address as email_address, c.id as contact_id,
|
30
|
+
s.id as subscription_id from #{MailManager.table_prefix}contacts c
|
31
|
+
inner join #{MailManager.table_prefix}subscriptions s on c.id=s.contact_id
|
32
|
+
where s.status in ('active') and mailing_list_id in (#{
|
33
|
+
mailing_list_ids.join(',')})|
|
34
|
+
)
|
35
|
+
results = results.map(&:values) if results.first.is_a?(Hash)
|
36
|
+
results.inject(Hash.new){ |h,r|
|
37
|
+
h.merge!(r[0].to_s.strip.downcase => {
|
38
|
+
contact_id: r[1].to_i, subscription_id: r[2].to_i
|
39
|
+
})
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
26
43
|
|
27
44
|
def active?
|
28
45
|
deleted_at.nil?
|
@@ -34,6 +34,17 @@ module MailManager
|
|
34
34
|
|
35
35
|
attr_protected :id
|
36
36
|
|
37
|
+
def self.email_address_hash_for_mailing_id(mailing_id)
|
38
|
+
results = MailManager::Message.connection.execute(
|
39
|
+
%Q|select distinct c.email_address
|
40
|
+
from #{MailManager.table_prefix}contacts c
|
41
|
+
inner join #{MailManager.table_prefix}messages m
|
42
|
+
on c.id=m.contact_id where m.mailing_id=#{mailing_id}|
|
43
|
+
)
|
44
|
+
results = results.map(&:values) if results.first.is_a?(Hash)
|
45
|
+
results.inject(Hash.new){|h,r|h.merge!(r[0].to_s.strip.downcase => true)}
|
46
|
+
end
|
47
|
+
|
37
48
|
def initialize(*args)
|
38
49
|
super
|
39
50
|
set_type
|
@@ -45,7 +56,7 @@ module MailManager
|
|
45
56
|
conditions[0] += " AND #{MailManager.table_prefix}messages.mailing_id=?"
|
46
57
|
conditions << params[:mailing_id]
|
47
58
|
end
|
48
|
-
if params[:status]
|
59
|
+
if params[:status].present?
|
49
60
|
conditions[0] += " AND #{MailManager.table_prefix}messages.status=?"
|
50
61
|
conditions << params[:status]
|
51
62
|
end
|
@@ -50,6 +50,17 @@ module MailManager
|
|
50
50
|
attr_protected :id
|
51
51
|
|
52
52
|
#acts_as_audited rescue Rails.logger.warn "Audit Table not defined!"
|
53
|
+
#
|
54
|
+
|
55
|
+
def self.unsubscribed_emails_hash
|
56
|
+
results = self.connection.execute(%Q|select distinct c.email_address
|
57
|
+
from #{MailManager.table_prefix}contacts c
|
58
|
+
inner join #{MailManager.table_prefix}subscriptions s on c.id=s.contact_id
|
59
|
+
where s.status in ('unsubscribed')|
|
60
|
+
)
|
61
|
+
results = results.map(&:values) if results.first.is_a?(Hash)
|
62
|
+
results.inject(Hash.new){|h,r|h.merge!(r[0].to_s.strip.downcase => true)}
|
63
|
+
end
|
53
64
|
|
54
65
|
def contact_full_name
|
55
66
|
contact.full_name
|
@@ -63,6 +74,7 @@ module MailManager
|
|
63
74
|
subscription.contact = contact
|
64
75
|
subscription.mailing_list = mailing_list
|
65
76
|
subscription.change_status(status)
|
77
|
+
subscription
|
66
78
|
end
|
67
79
|
|
68
80
|
# subscribes the contact to the list
|
@@ -14,7 +14,9 @@
|
|
14
14
|
<hr/>
|
15
15
|
<h3>Headers</h3>
|
16
16
|
<pre>
|
17
|
-
|
17
|
+
<% this_part.header.each_entry do |header| %>
|
18
|
+
<%= header.name %>: <%= header.value %>
|
19
|
+
<% end %>
|
18
20
|
</pre>
|
19
21
|
<% if this_part.header['content-type'].to_s =~ /text\/html/i %>
|
20
22
|
<h3>Body Part</h3>
|
@@ -3,9 +3,9 @@
|
|
3
3
|
|
4
4
|
<% if @bounce.status.eql?('needs_manual_intervention') %>
|
5
5
|
<div>
|
6
|
-
<%= link_to "
|
6
|
+
<%= link_to "Remove Related Email/Subscriptions", mail_manager.fail_address_bounce_path(@bounce), :class => 'button', method: :put %>
|
7
7
|
|
8
|
-
<%= link_to "Dismiss", mail_manager.dismiss_bounce_path(@bounce), :class => 'button' %>
|
8
|
+
<%= link_to "Dismiss", mail_manager.dismiss_bounce_path(@bounce), :class => 'button', method: :put %>
|
9
9
|
</div>
|
10
10
|
<% end %>
|
11
11
|
|
@@ -6,6 +6,6 @@
|
|
6
6
|
<%= f.text_field :last_name, :style => 'width: 300px;' %><br />
|
7
7
|
<%= f.label :email_address %>
|
8
8
|
<%= f.text_field :email_address, :style => 'width: 300px;' %><br />
|
9
|
-
<%= contactable_subscriptions_selector(f) %>
|
9
|
+
<%= contactable_subscriptions_selector(f, 'admin_unsubscribed') %>
|
10
10
|
<div class="submit_button"><%= f.submit "Submit", :class => 'button' %></div>
|
11
11
|
<% end %>
|
@@ -16,7 +16,7 @@
|
|
16
16
|
<td><%=l(mailing.scheduled_at) rescue '' %></td>
|
17
17
|
<td><b><%=h mailing.status %></b></td>
|
18
18
|
<td align="center"><nobr><%= link_to 'Send Test', mail_manager.test_mailing_path(mailing), :id => 'Send_Test', :class => 'button' %></nobr></td>
|
19
|
-
<td>
|
19
|
+
<td><div class="mailing_buttons">
|
20
20
|
<% if mailing.can_edit? %>
|
21
21
|
<%= link_to 'Edit', mail_manager.edit_mailing_path(mailing), :class => 'button' %>
|
22
22
|
<% if mailing.can_schedule? %>
|
@@ -33,7 +33,7 @@
|
|
33
33
|
<%= link_to 'Bounces', mail_manager.bounces_path(:mailing_id => mailing.id), :class => 'button' %>
|
34
34
|
<% end %>
|
35
35
|
<%= link_to 'Delete', mail_manager.mailing_path(mailing), :method => :delete, :confirm => "Are you sure?", :class => 'button' %>
|
36
|
-
</td>
|
36
|
+
</div></td>
|
37
37
|
</tr>
|
38
38
|
<% end %>
|
39
39
|
</table>
|
@@ -43,7 +43,7 @@ No mailings exist.<br /><br />
|
|
43
43
|
|
44
44
|
<%= content_for :page_navigation do %>
|
45
45
|
<div>
|
46
|
-
<%= will_paginate @mailings
|
46
|
+
<%= will_paginate @mailings %><br /><br />
|
47
47
|
<%= link_to "New Mailing", mail_manager.new_mailing_path, :class => 'button' %>
|
48
48
|
</div>
|
49
49
|
<% end %>
|
@@ -1,9 +1,12 @@
|
|
1
1
|
<% unsubscribed_status ||= 'unsubscribed' %>
|
2
2
|
<%= contactable_form.fields_for :subscriptions do |subscription_fields| %>
|
3
3
|
<% subscription = subscription_fields.object %>
|
4
|
-
<div class="field">
|
4
|
+
<div class="field subscription_status_<%= subscription.status %>">
|
5
5
|
<%= subscription_fields.label :status, subscription.mailing_list.try(:name) %>
|
6
|
-
<%= subscription_fields.check_box :status, {}, 'active', subscription.status.eql?('active') ? unsubscribed_status : subscription.status
|
7
|
-
<%= subscription_fields.hidden_field :mailing_list_id %>
|
6
|
+
<%= subscription_fields.check_box :status, {}, 'active', subscription.status.eql?('active') ? unsubscribed_status : subscription.status %>
|
7
|
+
<%= subscription_fields.hidden_field :mailing_list_id %>
|
8
|
+
<% unless ['pending','active'].include?(subscription.status) %>
|
9
|
+
<%= subscription.status.humanize %>
|
10
|
+
<% end %><br />
|
8
11
|
</div>
|
9
12
|
<% end %>
|
data/config/routes.rb
CHANGED
data/lib/delayed/status.rb
CHANGED
@@ -3,15 +3,18 @@ module ::Delayed
|
|
3
3
|
end
|
4
4
|
class Status
|
5
5
|
def self.ok?(overdue=15.minutes)
|
6
|
-
job = ::Delayed::StatusJob.first || ::Delayed::StatusJob.enqueue(::Delayed::StatusJob.new)
|
7
6
|
failed_count = Delayed::Job.where('failed_at is not null').count
|
8
7
|
raise(::Delayed::StatusException, "There are #{failed_count} failed jobs!"
|
9
8
|
) if failed_count > 0
|
10
|
-
elapsed_time = (Time.now -
|
9
|
+
elapsed_time = (Time.now - status_job.updated_at).to_i
|
11
10
|
raise(::Delayed::StatusException,
|
12
11
|
"Rails3 Status job hasn't run for #{elapsed_time} seconds"
|
13
12
|
) if elapsed_time > overdue
|
14
13
|
true
|
15
14
|
end
|
15
|
+
def self.status_job
|
16
|
+
status_job = Job.where("handler like '%StatusJob%'").first
|
17
|
+
status_job ||= Job.enqueue StatusJob.new(1.minute.from_now)
|
18
|
+
end
|
16
19
|
end
|
17
20
|
end
|