mysociety/alaveteli

View on GitHub
lib/tasks/translation.rake

Summary

Maintainability
Test Coverage
require File.join(File.dirname(__FILE__), 'usage')
namespace :translation do

  include Usage

  def write_email(email, email_description, output_file)
    mail_object = MailHandler.mail_from_raw_email(email.to_s)
    output_file.write("\n")
    output_file.write("Description of email: #{email_description}\n")
    output_file.write("Subject line: #{mail_object.subject}\n")
    output_file.write("\n")
    if mail_object.parts.empty?
      mail_object.header.fields.each do |field|
        output_file.write("#{field.name}: #{Mail::Encodings.value_decode(field)}\n")
      end
      output_file.write("\n")
      output_file.write(mail_object.decoded)
    else
      mail_object.parts.each do |part|
        output_file.write("Message part **\n")
        output_file.write(part.body.to_s)
      end
    end
    output_file.write("\n")
    output_file.write("********\n")
  end

  desc "Create previews of translated emails"
  task preview_emails: :environment do
    check_for_env_vars(%w[INFO_REQUEST_ID
                          FOLLOW_UP_ID
                          INCOMING_MESSAGE_ID
                          COMMENT_ID
                          TRACK_THING_ID
                          DIR], nil)
    info_request = InfoRequest.find(ENV['INFO_REQUEST_ID'])
    if info_request.outgoing_messages.empty?
      raise "Info request #{info_request.id} does not have any outgoing messages"
    end
    initial_request = info_request.outgoing_messages.first
    follow_up = OutgoingMessage.find(ENV['FOLLOW_UP_ID'])
    incoming_message = IncomingMessage.find(ENV['INCOMING_MESSAGE_ID'])
    comment = Comment.find(ENV['COMMENT_ID'])
    track_thing = TrackThing.find(ENV['TRACK_THING_ID'])

    output_file = File.open(File.join(ENV['DIR'], 'message_preview.txt'), 'w')

    # outgoing mailer
    request_email = OutgoingMailer.initial_request(info_request, initial_request)
    write_email(request_email, 'Initial Request', output_file)

    followup_email = OutgoingMailer.followup(info_request, follow_up, nil)
    write_email(followup_email, 'Follow up', output_file)

    # contact mailer
    contact_email = ContactMailer.to_admin_message(info_request.user_name,
                                                   info_request.user.email,
                                                   'A test message',
                                                   'Hello!',
                                                   info_request.user,
                                                   info_request,
                                                   info_request.public_body)

    write_email(contact_email, 'Contact email (to admin)', output_file)

    user_contact_email = ContactMailer.user_message(info_request.user,
                                                    info_request.user,
                                                    'http://www.example.com/user',
                                                    'A test message',
                                                    'Hello!')
    write_email(user_contact_email, 'Contact email (user to user)', output_file)

    admin_contact_email = ContactMailer.from_admin_message(info_request.user.name,
                                                           info_request.user.email,
                                                           'A test message',
                                                           'Hello!')
    write_email(admin_contact_email, 'Contact email (admin to user)', output_file)

    # request mailer
    fake_response_email = RequestMailer.fake_response(info_request,
                                                      info_request.user,
                                                      "test body",
                                                      "attachment.txt",
                                                      "test attachment text")
    write_email(fake_response_email,
                'Email created when someone uploads a response directly',
                output_file)

    content = File.read(File.join(Rails.root,
                                  'spec',
                                  'fixtures',
                                  'files',
                                  'incoming-request-plain.email'))
    response_mail = MailHandler.mail_from_raw_email(content)

    response_mail.from = "authority@example.com"
    stopped_responses_email = RequestMailer.stopped_responses(info_request,
                                                              response_mail,
                                                              content)
    write_email(stopped_responses_email,
                'Bounce if someone sends email to a request that has had responses stopped',
                output_file)

    requires_admin_email = RequestMailer.requires_admin(info_request)
    write_email(requires_admin_email, 'Drawing admin attention to a response', output_file)


    new_response_email = RequestMailer.new_response(info_request, incoming_message)
    write_email(new_response_email,
                'Telling the requester that a new response has arrived',
                output_file)

    overdue_alert_email = RequestMailer.overdue_alert(info_request, info_request.user)
    write_email(overdue_alert_email,
                'Telling the requester that the public body is late in replying',
                output_file)

    very_overdue_alert_email = RequestMailer.very_overdue_alert(info_request, info_request.user)
    write_email(very_overdue_alert_email,
                'Telling the requester that the public body is very late in replying',
                output_file)

    response_reminder_alert_email = RequestMailer.new_response_reminder_alert(info_request,
                                                                              incoming_message)
    write_email(response_reminder_alert_email,
                'Telling the requester that they need to say if the new response contains info or not',
                output_file)

    old_unclassified_email = RequestMailer.old_unclassified_updated(info_request)
    write_email(old_unclassified_email,
                'Telling the requester that someone updated their old unclassified request',
                output_file)

    not_clarified_alert_email = RequestMailer.not_clarified_alert(info_request, incoming_message)
    write_email(not_clarified_alert_email,
                'Telling the requester that they need to clarify their request',
                output_file)

    comment_on_alert_email = RequestMailer.comment_on_alert(info_request, comment)
    write_email(comment_on_alert_email,
                'Telling requester that somebody added an annotation to their request',
                output_file)

    comment_on_alert_plural_email = RequestMailer.comment_on_alert_plural(info_request, 2, comment)
    write_email(comment_on_alert_plural_email,
                'Telling requester that somebody added multiple annotations to their request',
                output_file)

    # track mailer
    xapian_object = ActsAsXapian::Search.new([InfoRequestEvent], track_thing.track_query,
                                             sort_by_prefix: 'described_at',
                                             sort_by_ascending: true,
                                             collapse_by_prefix: nil,
                                             limit: 100)
    event_digest_email = TrackMailer.event_digest(info_request.user,
                                                  [[track_thing,
                                                    xapian_object.results,
                                                    xapian_object]])
    write_email(event_digest_email, 'Alerts on things the user is tracking', output_file)

    # user mailer
    site_name = AlaveteliConfiguration.site_name
    reasons = {
      web: "",
      email: _("Then you can sign in to {{site_name}}", site_name: site_name),
      email_subject: _("Confirm your account on {{site_name}}", site_name: site_name)
    }
    confirm_login_email = UserMailer.confirm_login(info_request.user,
                                                   reasons,
                                                   'http://www.example.com')
    write_email(confirm_login_email, 'Confirm a user login', output_file)

    already_registered_email = UserMailer.already_registered(info_request.user,
                                                             reasons,
                                                             'http://www.example.com')
    write_email(already_registered_email, 'Tell a user they are already registered', output_file)

    new_email = 'new_email@example.com'
    changeemail_confirm_email = UserMailer.changeemail_confirm(info_request.user,
                                                               new_email,
                                                               'http://www.example.com')
    write_email(changeemail_confirm_email,
                'Confirm that the user wants to change their email',
                output_file)

    changeemail_already_used = UserMailer.changeemail_already_used('old_email@example.com',
                                                                   new_email)
    write_email(changeemail_already_used,
                'Tell a user that the email they want to change to is already used',
                output_file)

    output_file.close
  end

end