Skip to content

Instantly share code, notes, and snippets.

@radar
Forked from anonymous/gist:13399
Created September 28, 2008 02:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save radar/13400 to your computer and use it in GitHub Desktop.
Save radar/13400 to your computer and use it in GitHub Desktop.
class SubscriptionConfirm < ActiveRecord::Base
@@confirm_sent = Hash.new
def initialize(params = nil)
super(params)
set_default_values
end
def self.subscribe_to_newsletter(params = nil)
return nil if params.nil?
subscription_confirm = self.find(:first, :conditions => ["email = ?", params[:email]])
if !subscription_confirm.nil?
subscription_confirm.attributes = params
else
subscription_confirm ||= self.new(params)
end
dada_subscription = DadaSubscriber.find(:first, :conditions => ["email = ?", params[:email]])
if !dada_subscription.nil? then
subscription_confirm.action = "update"
else
subscription_confirm.action = "insert"
end
@@confirm_sent[subscription_confirm.object_id] = true
if subscription_confirm.save then
# Should send out confirmation email
case subscription_confirm.action
when "insert"
NewsletterConfirmations.deliver_confirm_insert_subscription(subscription_confirm)
when "update"
NewsletterConfirmations.deliver_confirm_update_subscription(subscription_confirm)
end
end
return subscription_confirm
end
def self.unsubscribe_from_newsletter(email = nil)
return nil if email.nil?
subscription_confirm = self.find(:first, :conditions => ["email = ?", email])
subscription_confirm ||= self.new
dada_subscription = DadaSubscriber.find(:first, :conditions => ["email = ?", email])
if !dada_subscription.nil? then
subscription_confirm.action = "delete"
subscription_confirm.email = dada_subscription.email
subscription_confirm.first_name = dada_subscription.first_name
subscription_confirm.last_name = dada_subscription.last_name
else
return nil
end
@@confirm_sent[subscription_confirm.object_id] = true
if subscription_confirm.save then
# Should send out confirmation email
NewsletterConfirmations.deliver_confirm_delete_subscription(subscription_confirm)
end
return subscription_confirm
end
def self.find_by_confirmation(params = nil)
return if params.nil?
return self.find(:first, :conditions => params.merge(:commited => "N"))
end
def confirmation_hash
return {:email => self.email, :confirm_code => self.confirm_code}
end
def commit_action
return false if self.commited == "Y"
dada_subscriber = DadaSubscriber.find(:first, :conditions => ["email = ?", self.email])
case self.action
when "insert"
return false unless dada_subscriber.nil?
dada_subscriber = DadaSubscriber.new(:first_name => self.first_name, :last_name => self.last_name, :email => self.email,
:vegan => self.vegan, :gluten_free => self.gluten_free, :sugar_free => self.sugar_free)
return false if !dada_subscriber.save
self.commited = "Y"
if self.save
# Should send out confirmation succesful email
NewsletterConfirmations.deliver_successful_subscription(dada_subscriber)
self.destroy
else
dada_subscriber.destroy
return false
end
when "update"
return false if dada_subscriber.nil?
old_attributes = dada_subscriber.attributes #save attributes incase of rollback
dada_subscriber.attributes = {:first_name => self.first_name, :last_name => self.last_name, :email => self.email,
:vegan => self.vegan, :gluten_free => self.gluten_free, :sugar_free => self.sugar_free}
return false if !dada_subscriber.save
self.commited = "Y"
if self.save
# Should send out confirmation succesful email
NewsletterConfirmations.deliver_successful_subscription_update(dada_subscriber)
self.destroy
else
dada_subscriber.attributes = old_attributes
dada_subscriber.save
return false
end
when "delete"
return false if dada_subscriber.nil?
old_attributes = dada_subscriber.attributes #save attributes incase of rollback
return false if !dada_subscriber.destroy
self.commited = "Y"
if self.save
# Should send out confirmation succesful email
NewsletterConfirmations.deliver_successful_subscription_removal(dada_subscriber)
self.destroy
else
DadaSubscriber.create(old_attributes)
return false
end
end
return true
end
before_validation :increment_confirms_sent
#before_create :increment_confirms_sent
#before_update :increment_confirms_sent
before_create :clean_fields
before_update :clean_fields
validates_presence_of :vegan, :gluten_free, :sugar_free, :first_name, :last_name
validates_uniqueness_of :email
validates_email_format_of :email, :on => :create
validates_length_of :confirm_code, :is => 32
validates_inclusion_of :action, :in => ["insert", "update", "delete"]
validates_inclusion_of :commited, :in => ["N", "Y"]
validates_numericality_of :confirms_sent, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 3, :allow_nil => false
private
def set_default_values
self.vegan ||= "N"
self.gluten_free ||= "N"
self.sugar_free ||= "N"
self.confirm_code ||= generate_confirm_code
self.confirms_sent = 0 if self.confirms_sent.nil?
self.commited ||= "N"
end
def increment_confirms_sent
if @@confirm_sent[self.object_id]
self.confirms_sent = self.confirms_sent+1
@@confirm_sent.delete(self.object_id)
end
end
def clean_fields
self.first_name = self.first_name.capitalize
self.last_name = self.last_name.capitalize
self.vegan = self.vegan.capitalize
self.gluten_free = self.gluten_free.capitalize
self.sugar_free = self.sugar_free.capitalize
self.commited = self.commited.capitalize
end
def generate_confirm_code
code_chars = ("A".."Z").to_a + ("a".."z").to_a + ("0".."9").to_a + ["-","_"]
code = Array.new(32) { code_chars[rand(code_chars.size)] }.join
return code
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment