2007-03-12 20:59:02 +03:00
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Mailer < ActionMailer :: Base
2008-02-21 22:30:27 +03:00
helper :application
helper :issues
helper :custom_fields
2007-05-27 14:57:13 +04:00
2007-11-04 13:43:39 +03:00
include ActionController :: UrlWriter
def issue_add ( issue )
2008-03-16 19:52:49 +03:00
redmine_headers 'Project' = > issue . project . identifier ,
'Issue-Id' = > issue . id ,
'Issue-Author' = > issue . author . login
redmine_headers 'Issue-Assignee' = > issue . assigned_to . login if issue . assigned_to
2007-11-04 13:43:39 +03:00
recipients issue . recipients
2008-01-20 13:42:16 +03:00
subject " [ #{ issue . project . name } - #{ issue . tracker . name } # #{ issue . id } ] ( #{ issue . status . name } ) #{ issue . subject } "
2007-11-04 13:43:39 +03:00
body :issue = > issue ,
:issue_url = > url_for ( :controller = > 'issues' , :action = > 'show' , :id = > issue )
2007-03-12 20:59:02 +03:00
end
def issue_edit ( journal )
issue = journal . journalized
2008-03-16 19:52:49 +03:00
redmine_headers 'Project' = > issue . project . identifier ,
'Issue-Id' = > issue . id ,
'Issue-Author' = > issue . author . login
redmine_headers 'Issue-Assignee' = > issue . assigned_to . login if issue . assigned_to
2007-11-04 13:43:39 +03:00
recipients issue . recipients
2007-04-21 16:08:31 +04:00
# Watchers in cc
2007-11-04 13:43:39 +03:00
cc ( issue . watcher_recipients - @recipients )
2008-01-20 13:42:16 +03:00
s = " [ #{ issue . project . name } - #{ issue . tracker . name } # #{ issue . id } ] "
s << " ( #{ issue . status . name } ) " if journal . new_value_for ( 'status_id' )
s << issue . subject
subject s
2007-11-04 13:43:39 +03:00
body :issue = > issue ,
:journal = > journal ,
:issue_url = > url_for ( :controller = > 'issues' , :action = > 'show' , :id = > issue )
2007-03-12 20:59:02 +03:00
end
2008-05-25 21:31:50 +04:00
def reminder ( user , issues , days )
set_language_if_valid user . language
recipients user . mail
subject l ( :mail_subject_reminder , issues . size )
body :issues = > issues ,
:days = > days ,
:issues_url = > url_for ( :controller = > 'issues' , :action = > 'index' , :set_filter = > 1 , :assigned_to_id = > user . id , :sort_key = > 'issues.due_date' , :sort_order = > 'asc' )
end
2007-10-12 22:04:56 +04:00
def document_added ( document )
2008-03-16 19:52:49 +03:00
redmine_headers 'Project' = > document . project . identifier
2007-11-04 13:43:39 +03:00
recipients document . project . recipients
subject " [ #{ document . project . name } ] #{ l ( :label_document_new ) } : #{ document . title } "
body :document = > document ,
:document_url = > url_for ( :controller = > 'documents' , :action = > 'show' , :id = > document )
2007-03-12 20:59:02 +03:00
end
2007-10-12 22:04:56 +04:00
def attachments_added ( attachments )
2007-03-12 20:59:02 +03:00
container = attachments . first . container
2007-08-26 00:09:33 +04:00
added_to = ''
2007-11-04 13:43:39 +03:00
added_to_url = ''
2007-08-26 00:09:33 +04:00
case container . class . name
2007-03-12 20:59:02 +03:00
when 'Version'
2007-11-04 13:43:39 +03:00
added_to_url = url_for ( :controller = > 'projects' , :action = > 'list_files' , :id = > container . project_id )
2007-03-12 20:59:02 +03:00
added_to = " #{ l ( :label_version ) } : #{ container . name } "
when 'Document'
2007-11-04 13:43:39 +03:00
added_to_url = url_for ( :controller = > 'documents' , :action = > 'show' , :id = > container . id )
2007-03-12 20:59:02 +03:00
added_to = " #{ l ( :label_document ) } : #{ container . title } "
end
2008-03-16 19:52:49 +03:00
redmine_headers 'Project' = > container . project . identifier
2007-11-04 13:43:39 +03:00
recipients container . project . recipients
subject " [ #{ container . project . name } ] #{ l ( :label_attachment_new ) } "
body :attachments = > attachments ,
:added_to = > added_to ,
:added_to_url = > added_to_url
2007-03-12 20:59:02 +03:00
end
2007-09-14 19:30:46 +04:00
def news_added ( news )
2008-03-16 19:52:49 +03:00
redmine_headers 'Project' = > news . project . identifier
2007-11-04 13:43:39 +03:00
recipients news . project . recipients
subject " [ #{ news . project . name } ] #{ l ( :label_news ) } : #{ news . title } "
body :news = > news ,
:news_url = > url_for ( :controller = > 'news' , :action = > 'show' , :id = > news )
2007-09-14 19:30:46 +04:00
end
2007-11-04 13:43:39 +03:00
def message_posted ( message , recipients )
2008-03-16 19:52:49 +03:00
redmine_headers 'Project' = > message . project . identifier ,
'Topic-Id' = > ( message . parent_id || message . id )
2007-11-04 13:43:39 +03:00
recipients ( recipients )
subject " [ #{ message . board . project . name } - #{ message . board . name } ] #{ message . subject } "
body :message = > message ,
:message_url = > url_for ( :controller = > 'messages' , :action = > 'show' , :board_id = > message . board_id , :id = > message . root )
end
def account_information ( user , password )
set_language_if_valid user . language
recipients user . mail
2008-03-15 12:40:16 +03:00
subject l ( :mail_subject_register , Setting . app_title )
2007-11-04 13:43:39 +03:00
body :user = > user ,
:password = > password ,
:login_url = > url_for ( :controller = > 'account' , :action = > 'login' )
end
2007-11-18 20:46:55 +03:00
def account_activation_request ( user )
# Send the email to all active administrators
recipients User . find_active ( :all , :conditions = > { :admin = > true } ) . collect { | u | u . mail } . compact
2008-03-15 12:40:16 +03:00
subject l ( :mail_subject_account_activation_request , Setting . app_title )
2007-11-18 20:46:55 +03:00
body :user = > user ,
:url = > url_for ( :controller = > 'users' , :action = > 'index' , :status = > User :: STATUS_REGISTERED , :sort_key = > 'created_on' , :sort_order = > 'desc' )
end
2007-11-04 13:43:39 +03:00
2007-03-12 20:59:02 +03:00
def lost_password ( token )
set_language_if_valid ( token . user . language )
2007-11-04 13:43:39 +03:00
recipients token . user . mail
2008-03-15 12:40:16 +03:00
subject l ( :mail_subject_lost_password , Setting . app_title )
2007-11-04 13:43:39 +03:00
body :token = > token ,
:url = > url_for ( :controller = > 'account' , :action = > 'lost_password' , :token = > token . value )
2006-07-29 13:32:58 +04:00
end
2007-03-12 20:59:02 +03:00
def register ( token )
set_language_if_valid ( token . user . language )
2007-11-04 13:43:39 +03:00
recipients token . user . mail
2008-03-15 12:40:16 +03:00
subject l ( :mail_subject_register , Setting . app_title )
2007-11-04 13:43:39 +03:00
body :token = > token ,
2007-11-18 20:46:55 +03:00
:url = > url_for ( :controller = > 'account' , :action = > 'activate' , :token = > token . value )
2007-05-14 21:03:59 +04:00
end
2007-08-14 14:36:19 +04:00
def test ( user )
set_language_if_valid ( user . language )
2007-11-04 13:43:39 +03:00
recipients user . mail
subject 'Redmine test'
body :url = > url_for ( :controller = > 'welcome' )
end
2008-02-26 21:30:24 +03:00
# Overrides default deliver! method to prevent from sending an email
# with no recipient, cc or bcc
def deliver! ( mail = @mail )
return false if ( recipients . nil? || recipients . empty? ) &&
( cc . nil? || cc . empty? ) &&
( bcc . nil? || bcc . empty? )
super
end
2008-05-25 21:31:50 +04:00
# Sends reminders to issue assignees
# Available options:
# * :days => how many days in the future to remind about (defaults to 7)
# * :tracker => id of tracker for filtering issues (defaults to all trackers)
# * :project => id or identifier of project to process (defaults to all projects)
def self . reminders ( options = { } )
days = options [ :days ] || 7
project = options [ :project ] ? Project . find ( options [ :project ] ) : nil
tracker = options [ :tracker ] ? Tracker . find ( options [ :tracker ] ) : nil
s = ARCondition . new [ " #{ IssueStatus . table_name } .is_closed = ? AND #{ Issue . table_name } .due_date <= ? AND #{ Issue . table_name } .assigned_to_id IS NOT NULL " , false , days . day . from_now . to_date ]
s << " #{ Issue . table_name } .project_id = #{ project . id } " if project
s << " #{ Issue . table_name } .tracker_id = #{ tracker . id } " if tracker
issues_by_assignee = Issue . find ( :all , :include = > [ :status , :assigned_to , :project , :tracker ] ,
:conditions = > s . conditions
) . group_by ( & :assigned_to )
issues_by_assignee . each do | assignee , issues |
deliver_reminder ( assignee , issues , days ) unless assignee . nil?
end
end
2008-02-26 21:30:24 +03:00
2007-11-04 13:43:39 +03:00
private
def initialize_defaults ( method_name )
super
set_language_if_valid Setting . default_language
from Setting . mail_from
default_url_options [ :host ] = Setting . host_name
default_url_options [ :protocol ] = Setting . protocol
2008-03-16 19:52:49 +03:00
# Common headers
headers 'X-Mailer' = > 'Redmine' ,
'X-Redmine-Host' = > Setting . host_name ,
'X-Redmine-Site' = > Setting . app_title
end
# Appends a Redmine header field (name is prepended with 'X-Redmine-')
def redmine_headers ( h )
h . each { | k , v | headers [ " X-Redmine- #{ k } " ] = v }
2007-11-04 13:43:39 +03:00
end
2007-12-02 16:52:16 +03:00
# Overrides the create_mail method
2007-11-12 19:43:49 +03:00
def create_mail
2007-12-02 16:52:16 +03:00
# Removes the current user from the recipients and cc
# if he doesn't want to receive notifications about what he does
if User . current . pref [ :no_self_notified ]
recipients . delete ( User . current . mail ) if recipients
cc . delete ( User . current . mail ) if cc
end
# Blind carbon copy recipients
if Setting . bcc_recipients?
bcc ( [ recipients , cc ] . flatten . compact . uniq )
recipients [ ]
cc [ ]
end
2007-11-12 19:43:49 +03:00
super
end
2007-11-04 13:43:39 +03:00
# Renders a message with the corresponding layout
def render_message ( method_name , body )
layout = method_name . match ( %r{ text \ .html \ .(rhtml|rxml) } ) ? 'layout.text.html.rhtml' : 'layout.text.plain.rhtml'
body [ :content_for_layout ] = render ( :file = > method_name , :body = > body )
2007-12-10 20:58:07 +03:00
ActionView :: Base . new ( template_root , body , self ) . render ( :file = > " mailer/ #{ layout } " )
2007-08-14 14:36:19 +04:00
end
2007-12-10 20:58:07 +03:00
# Makes partial rendering work with Rails 1.2 (retro-compatibility)
def self . controller_path
''
end unless respond_to? ( 'controller_path' )
2006-06-28 22:11:03 +04:00
end