Class: MailyHerald::AdHocMailing

Inherits:
Mailing show all
Defined in:
app/models/maily_herald/ad_hoc_mailing.rb

Instance Attribute Summary

Attributes inherited from Dispatch

#absolute_delay, #conditions, #from, #list_id, #mailer_name, #name, #override_subscription, #period, #sequence_id, #state, #subject, #template, #title, #type

Instance Method Summary collapse

Methods inherited from Mailing

#ad_hoc?, #build_mail, #conditions, #conditions=, #conditions_changed?, #conditions_met?, #destination, #general_scheduling?, #generic_mailer?, #has_conditions?, #has_conditions_proc?, #individual_scheduling?, #mailer, #mailer_name, #one_time?, #periodical?, #render_subject, #render_template, #sequence?, #test_conditions

Methods included from Autonaming

included

Methods included from TemplateRenderer

included

Methods inherited from Dispatch

#archive, #archive!, #archived?, #disable, #disable!, #disabled?, #enable, #enable!, #enabled?, #has_start_at_proc?, #in_scope?, #list=, #locked?, #processable?, #start_at, #start_at=, #start_at_changed?, #subscription_valid?

Instance Method Details

#runObject

Sends mailing to all subscribed entities who have delivery scheduled.

Performs actual sending of emails; should be called in background.

Returns array of Log with actual ‘Mail::Message` objects stored in Log.mail attributes.

[View source]

47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'app/models/maily_herald/ad_hoc_mailing.rb', line 47

def run
  # TODO better scope here to exclude schedules for users outside context scope
  schedules.where("processing_at <= (?)", Time.now).collect do |schedule|
    if schedule.entity
      mail = deliver schedule
      schedule.reload
      schedule.mail = mail
      schedule
    else
      MailyHerald.logger.log_processing(schedule.mailing, {class: schedule.entity_type, id: schedule.entity_id}, prefix: "Removing schedule for non-existing entity") 
      schedule.destroy
    end
  end
end

#schedule_delivery_to(entity, time = Time.now) ⇒ Object

Schedules mailing delivery to ‘entity` at given `time`.

This always creates new Log object of type ‘schedule`.

Parameters:

  • entity (ActiveRecord::Base)
  • time (Time) (defaults to: Time.now)

    time of delivery

[View source]

23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'app/models/maily_herald/ad_hoc_mailing.rb', line 23

def schedule_delivery_to entity, time = Time.now
  subscribed = self.list.subscribed?(entity)

  if !enabled? || !(self.override_subscription? || subscribed)
    return
  end

  log = Log.new
  log.with_lock do
    log.set_attributes_for(self, entity, {
      status: :scheduled,
      processing_at: time,
    })
    log.save!
  end
  log
end

#schedule_delivery_to_all(time = Time.now) ⇒ Object

Schedules mailing delivery to all entities in the scope at given ‘time`.

This always creates new Log objects of type ‘schedule`.

Parameters:

  • time (Time) (defaults to: Time.now)

    time of delivery

[View source]

10
11
12
13
14
15
# File 'app/models/maily_herald/ad_hoc_mailing.rb', line 10

def schedule_delivery_to_all time = Time.now
  self.list.context.scope_with_subscription(self.list, :outer).each do |entity|
    MailyHerald.logger.debug "Adding schedule of #{self} ad-hoc for entity ##{entity.id} #{entity}"
    schedule_delivery_to entity, time
  end
end

#schedule_for(entity) ⇒ Object

Returns Log object which is the delivery schedule for given entity.

[View source]

78
79
80
# File 'app/models/maily_herald/ad_hoc_mailing.rb', line 78

def schedule_for entity
  schedules.for_entity(entity).first
end

#schedulesObject

Returns collection of all delivery schedules (Log collection).

[View source]

83
84
85
# File 'app/models/maily_herald/ad_hoc_mailing.rb', line 83

def schedules
  Log.ordered.scheduled.for_mailing(self)
end

#set_schedule_for(entity) ⇒ Object

Sets the delivery schedule for given entity

New schedule will be created or existing one updated.

Schedule is Log object of type “schedule”.

[View source]

67
68
69
70
71
72
73
74
75
# File 'app/models/maily_herald/ad_hoc_mailing.rb', line 67

def set_schedule_for entity
  subscribed = self.list.subscribed?(entity)

  if !enabled? || !(self.override_subscription? || subscribed)
    log = schedule_for(entity)
    log.try(:destroy)
    return
  end
end

#to_sObject

[View source]

87
88
89
# File 'app/models/maily_herald/ad_hoc_mailing.rb', line 87

def to_s
  "<AdHocMailing: #{self.title || self.name}>"
end