aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/track_mailer.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/track_mailer.rb')
-rw-r--r--app/models/track_mailer.rb134
1 files changed, 0 insertions, 134 deletions
diff --git a/app/models/track_mailer.rb b/app/models/track_mailer.rb
deleted file mode 100644
index 7262c82f3..000000000
--- a/app/models/track_mailer.rb
+++ /dev/null
@@ -1,134 +0,0 @@
-# models/track_mailer.rb:
-# Emails which go to users who are tracking things.
-#
-# Copyright (c) 2008 UK Citizens Online Democracy. All rights reserved.
-# Email: francis@mysociety.org; WWW: http://www.mysociety.org/
-
-class TrackMailer < ApplicationMailer
- def event_digest(user, email_about_things)
- post_redirect = PostRedirect.new(
- :uri => user_url(user) + "#email_subscriptions",
- :user_id => user.id)
- post_redirect.save!
- unsubscribe_url = confirm_url(:email_token => post_redirect.email_token)
-
- @from = contact_from_name_and_email
- headers 'Auto-Submitted' => 'auto-generated', # http://tools.ietf.org/html/rfc3834
- 'Precedence' => 'bulk' # http://www.vbulletin.com/forum/project.php?issueid=27687 (Exchange hack)
- # 'Return-Path' => blackhole_email, 'Reply-To' => @from # we don't care about bounces for tracks
- # (We let it return bounces for now, so we can manually kill the tracks that bounce so Yahoo
- # etc. don't decide we are spammers.)
-
- @recipients = user.name_and_email
- @subject = _("Your {{site_name}} email alert", :site_name => site_name)
- @body = { :user => user, :email_about_things => email_about_things, :unsubscribe_url => unsubscribe_url }
- end
-
- def contact_from_name_and_email
- "#{Configuration::track_sender_name} <#{Configuration::track_sender_email}>"
- end
-
- # Send email alerts for tracked things. Never more than one email
- # a day, nor about events which are more than a week old, nor
- # events about which emails have been sent within the last two
- # weeks.
-
- # Useful query to run by hand to see how many alerts are due:
- # User.find(:all, :conditions => [ "last_daily_track_email < ?", Time.now - 1.day ]).size
- def self.alert_tracks
- done_something = false
- now = Time.now()
- users = User.find(:all, :conditions => [ "last_daily_track_email < ?", now - 1.day ])
- if users.empty?
- return done_something
- end
- for user in users
- next if !user.should_be_emailed? || !user.receive_email_alerts
-
- email_about_things = []
- track_things = TrackThing.find(:all, :conditions => [ "tracking_user_id = ? and track_medium = ?", user.id, 'email_daily' ])
- for track_thing in track_things
- # What have we alerted on already?
- #
- # We only use track_things_sent_emails records which are less than 14 days old.
- # In the search query loop below, we also only use items described in last 7 days.
- # An item described that recently definitely can't appear in track_things_sent_emails
- # earlier, so this is safe (with a week long margin of error). If the alerts break
- # for a whole week, then they will miss some items. Tough.
- done_info_request_events = {}
- tt_sent = track_thing.track_things_sent_emails.find(:all, :conditions => ['created_at > ?', now - 14.days])
- for t in tt_sent
- if not t.info_request_event_id.nil?
- done_info_request_events[t.info_request_event_id] = 1
- end
- end
-
- # Query for things in this track. We use described_at for the
- # ordering, so we catch anything new (before described), or
- # anything whose new status has been described.
- xapian_object = InfoRequest.full_search([InfoRequestEvent], track_thing.track_query, 'described_at', true, nil, 100, 1)
- # Go through looking for unalerted things
- alert_results = []
- for result in xapian_object.results
- if result[:model].class.to_s != "InfoRequestEvent"
- raise "need to add other types to TrackMailer.alert_tracks (unalerted)"
- end
-
- next if track_thing.created_at >= result[:model].described_at # made before the track was created
- next if result[:model].described_at < now - 7.days # older than 1 week (see 14 days / 7 days in comment above)
- next if done_info_request_events.include?(result[:model].id) # definitely already done
-
- # OK alert this one
- alert_results.push(result)
- end
- # If there were more alerts for this track, then store them
- if alert_results.size > 0
- email_about_things.push([track_thing, alert_results, xapian_object])
- end
- end
-
- # If we have anything to send, then send everything for the user in one mail
- if email_about_things.size > 0
- # Send the email
-
- I18n.with_locale(user.get_locale) do
- TrackMailer.deliver_event_digest(user, email_about_things)
- end
- end
-
- # Record that we've now sent those alerts to that user
- for track_thing, alert_results in email_about_things
- for result in alert_results
- track_things_sent_email = TrackThingsSentEmail.new
- track_things_sent_email.track_thing_id = track_thing.id
- if result[:model].class.to_s == "InfoRequestEvent"
- track_things_sent_email.info_request_event_id = result[:model].id
- else
- raise "need to add other types to TrackMailer.alert_tracks (mark alerted)"
- end
- track_things_sent_email.save!
- end
- end
- user.last_daily_track_email = now
- user.no_xapian_reindex = true
- user.save!
- done_something = true
- end
- return done_something
- end
-
- def self.alert_tracks_loop
- # Run alert_tracks in an endless loop, sleeping when there is nothing to do
- while true
- sleep_seconds = 1
- while !alert_tracks
- sleep sleep_seconds
- sleep_seconds *= 2
- sleep_seconds = 300 if sleep_seconds > 300
- end
- end
- end
-
-end
-
-