app/models/email_campaign/campaign.rb in email_campaign-0.1.2 vs app/models/email_campaign/campaign.rb in email_campaign-0.1.3
- old
+ new
@@ -1,32 +1,52 @@
class EmailCampaign::Campaign < ActiveRecord::Base
- set_table_name "email_campaigns"
+ self.table_name = 'email_campaigns'
attr_accessible :name, :mailer, :method, :params_yaml, :deliver_at,
:finalized, :queued, :delivered,
:delivery_started_at, :delivery_finished_at
has_many :recipients, :class_name => 'EmailCampaign::Recipient', :foreign_key => 'email_campaign_id'
# new_recipients should be an Array of objects that respond to #email, #name, and #subscriber_id
# (falls back to #id if #subscriber_id doesn't exist; either way, id should be unique within campaign)
- def add_recipients(new_recipients, limit = nil)
+ def add_recipients(new_recipients)
new_recipients = [ new_recipients ] unless new_recipients.is_a?(Array)
- count = 0
+ processed = 0
+ skipped = 0
+ valid = 0
+ invalid = 0
+ duplicate = 0
+ unsubscribed = 0
+
new_recipients.each do |rcpt|
subscriber_id = rcpt.subscriber_id || rcpt.id
- # next if subscriber_id && recipients.where(:subscriber_id => subscriber_id).count > 0
+ if subscriber_id && recipients.where(:subscriber_id => subscriber_id).count > 0
+ skipped += 1
+ next
+ end
+
r = recipients.create(:name => rcpt.name.strip, :email_address => rcpt.email_address.strip,
:subscriber_class_name => rcpt.class.name, :subscriber_id => subscriber_id)
- r.queue unless limit && count >= limit
- count += 1
+ processed += 1
+ case
+ when r.unsubscribed then unsubscribed += 1
+ when r.duplicate then duplicate += 1
+ when r.invalid_email then invalid += 1
+ else valid += 1
+ end
+
+ r.queue
end
- recipients.where(:ready => true).count
+ { :processed => processed, :skipped => skipped,
+ :valid => valid, :invalid => invalid,
+ :duplicate => duplicate, :unsubscribed => unsubscribed,
+ :total => recipients.where(:ready => true).count }
end
def queue(deliver_at = Time.now.utc)
# update_attributes(:deliver_at => deliver_at, :queued => true, :queued_at => Time.now.utc)
update_attributes(:deliver_at => deliver_at, :queued => true)
@@ -43,23 +63,13 @@
SanitizeEmail.unsanitary { process_delivery }
else
process_delivery
end
- # update_attributes(:delivered => true, :delivered_at => Time.now.utc)
- update_attributes(:delivered => true, :delivery_finished_at => Time.now.utc)
+ update_attributes(:queued => false, :delivered => true, :delivery_finished_at => Time.now.utc)
end
def process_delivery
- sent = []
- error = []
- recipients.where(:ready => true).each do |r|
- # begin
- mailer.constantize.send(method.to_sym, r).deliver
- sent << r
- # rescue Exception => e
- # error << [ r, e ]
- # end
- end
+ recipients.where(:ready => true).each(&:deliver)
end
end