diff --git a/app/models/mailer.rb b/app/models/mailer.rb index da793740..c17e2aa1 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -20,99 +20,111 @@ class Mailer < ActionMailer::Base helper IssuesHelper helper CustomFieldsHelper - def account_information(user, password) - set_language_if_valid user.language - recipients user.mail - from Setting.mail_from - subject l(:mail_subject_register) - body :user => user, :password => password - end - - def issue_add(issue) - set_language_if_valid(Setting.default_language) - @recipients = issue.recipients - @from = Setting.mail_from - @subject = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.status.name} - #{issue.subject}" - @body['issue'] = issue + include ActionController::UrlWriter + + def issue_add(issue) + recipients issue.recipients + subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.status.name} - #{issue.subject}" + body :issue => issue, + :issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue) end def issue_edit(journal) - set_language_if_valid(Setting.default_language) issue = journal.journalized - @recipients = issue.recipients + recipients issue.recipients # Watchers in cc - @cc = issue.watcher_recipients - @recipients - @from = Setting.mail_from - @subject = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.status.name} - #{issue.subject}" - @body['issue'] = issue - @body['journal']= journal + cc(issue.watcher_recipients - @recipients) + subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.status.name} - #{issue.subject}" + body :issue => issue, + :journal => journal, + :issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue) end def document_added(document) - set_language_if_valid(Setting.default_language) - @recipients = document.project.recipients - @from = Setting.mail_from - @subject = "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}" - @body['document'] = document + 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) end def attachments_added(attachments) - set_language_if_valid(Setting.default_language) container = attachments.first.container - url = '' added_to = '' + added_to_url = '' case container.class.name when 'Version' - url = {:only_path => false, :host => Setting.host_name, :controller => 'projects', :action => 'list_files', :id => container.project_id} + added_to_url = url_for(:controller => 'projects', :action => 'list_files', :id => container.project_id) added_to = "#{l(:label_version)}: #{container.name}" when 'Document' - url = {:only_path => false, :host => Setting.host_name, :controller => 'documents', :action => 'show', :id => container.id} + added_to_url = url_for(:controller => 'documents', :action => 'show', :id => container.id) added_to = "#{l(:label_document)}: #{container.title}" end - @recipients = container.project.recipients - @from = Setting.mail_from - @subject = "[#{container.project.name}] #{l(:label_attachment_new)}" - @body['attachments'] = attachments - @body['url'] = url - @body['added_to'] = added_to + 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 end def news_added(news) - set_language_if_valid(Setting.default_language) - @recipients = news.project.recipients - @from = Setting.mail_from - @subject = "[#{news.project.name}] #{l(:label_news)}: #{news.title}" - @body['news'] = news + 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) end - + + def message_posted(message, recipients) + 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 + subject l(:mail_subject_register) + body :user => user, + :password => password, + :login_url => url_for(:controller => 'account', :action => 'login') + end + def lost_password(token) set_language_if_valid(token.user.language) - @recipients = token.user.mail - @from = Setting.mail_from - @subject = l(:mail_subject_lost_password) - @body['token'] = token + recipients token.user.mail + subject l(:mail_subject_lost_password) + body :token => token, + :url => url_for(:controller => 'account', :action => 'lost_password', :token => token.value) end def register(token) set_language_if_valid(token.user.language) - @recipients = token.user.mail - @from = Setting.mail_from - @subject = l(:mail_subject_register) - @body['token'] = token - end - - def message_posted(message, recipients) - set_language_if_valid(Setting.default_language) - @recipients = recipients - @from = Setting.mail_from - @subject = "[#{message.board.project.name} - #{message.board.name}] #{message.subject}" - @body['message'] = message + recipients token.user.mail + subject l(:mail_subject_register) + body :token => token, + :url => url_for(:controller => 'account', :action => 'register', :token => token.value) end def test(user) set_language_if_valid(user.language) - @recipients = user.mail - @from = Setting.mail_from - @subject = 'Redmine' + recipients user.mail + subject 'Redmine test' + body :url => url_for(:controller => 'welcome') + end + + 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 + end + + # 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) + ActionView::Base.new(File.join(template_root, 'mailer'), body, self).render(:file => layout) end end diff --git a/app/views/mailer/_issue_text_html.rhtml b/app/views/mailer/_issue_text_html.rhtml index 80885eba..a3eb05b0 100644 --- a/app/views/mailer/_issue_text_html.rhtml +++ b/app/views/mailer/_issue_text_html.rhtml @@ -1,5 +1,4 @@ -<%= link_to "#{issue.tracker.name} ##{issue.id}", :only_path => false, :host => Setting.host_name, :controller => 'issues', :action => 'show', :id => issue %>: -<%= issue.subject %> +
<%= l(:mail_body_account_information_external, @user.auth_source.name) %>
+<% else %> +<%= l(:mail_body_account_information) %>:
+<%= l(:label_login) %>: <%= auto_link(@login_url) %>
diff --git a/app/views/mailer/account_information.text.plain.rhtml b/app/views/mailer/account_information.text.plain.rhtml new file mode 100644 index 00000000..0a02566d --- /dev/null +++ b/app/views/mailer/account_information.text.plain.rhtml @@ -0,0 +1,6 @@ +<% if @user.auth_source %><%= l(:mail_body_account_information_external, @user.auth_source.name) %> +<% else %><%= l(:mail_body_account_information) %>: +* <%= l(:field_login) %>: <%= @user.login %> +* <%= l(:field_password) %>: <%= @password %> +<% end %> +<%= l(:label_login) %>: <%= @login_url %> diff --git a/app/views/mailer/account_information_fr.rhtml b/app/views/mailer/account_information_fr.rhtml deleted file mode 100644 index 71df3453..00000000 --- a/app/views/mailer/account_information_fr.rhtml +++ /dev/null @@ -1,12 +0,0 @@ -<% if @user.auth_source %>Vous pouvez utiliser votre compte "<%= @user.auth_source.name %>" pour vous connecter à Redmine. -<% else %>Paramètres de connexion de votre compte Redmine: -* Identifiant: <%= @user.login %> -* Mot de passe: <%= @password %> -<% end %> -Pour se connecter à l'application: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'account', :action => 'login' %> -<% unless @user.auth_source %> -Vous pouvez changer votre mot de passe à l'adresse: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'my', :action => 'account' %> -<% end %> - ----------------------------------------- -<%= Setting.emails_footer %> diff --git a/app/views/mailer/account_information_pl.rhtml b/app/views/mailer/account_information_pl.rhtml deleted file mode 100644 index 7f9060b2..00000000 --- a/app/views/mailer/account_information_pl.rhtml +++ /dev/null @@ -1,12 +0,0 @@ -<% if @user.auth_source %>Możesz użyć twojego "<%= @user.auth_source.name %>" konta do zalogowania do Redmine. -<% else %>Twoje konto w Redmine: -* Login: <%= @user.login %> -* Hasło: <%= @password %> -<% end %> -Zaloguj: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'account', :action => 'login' %> -<% unless @user.auth_source %> -Możesz zmienić swoje hasło tutaj: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'my', :action => 'account' %> -<% end %> - ----------------------------------------- -<%= Setting.emails_footer %> diff --git a/app/views/mailer/account_information_sr.rhtml b/app/views/mailer/account_information_sr.rhtml deleted file mode 100644 index 0acd87d8..00000000 --- a/app/views/mailer/account_information_sr.rhtml +++ /dev/null @@ -1,9 +0,0 @@ -<% if @user.auth_source %>Mozete koristiti vas "<%= @user.auth_source.name %>" nalog da bi ste se prikljucili na Redmine. -<% else %>Informacije o vasem Redmine nalogu: -* Login: <%= @user.login %> -* Password: <%= @password %> -<% end %> -Log in: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'account', :action => 'login' %> -<% unless @user.auth_source %> -Ovde mozete izmeniti svoju lozinku: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'my', :action => 'account' %> -<% end %> diff --git a/app/views/mailer/attachments_added.text.html.rhtml b/app/views/mailer/attachments_added.text.html.rhtml index 9bb30db1..d2355b1c 100644 --- a/app/views/mailer/attachments_added.text.html.rhtml +++ b/app/views/mailer/attachments_added.text.html.rhtml @@ -1,7 +1,5 @@ -<%= link_to @added_to, @url %><%= l(:mail_body_lost_password) %>
+<%= auto_link(@url) %>
<%= l(:mail_body_register) %>
+<%= auto_link(@url) %>
This is a test email sent by Redmine.
-Redmine URL: <%= link_to url_for(:only_path => false, :host => Setting.host_name, :controller => 'welcome'),
- url_for(:only_path => false, :host => Setting.host_name, :controller => 'welcome') %>
<%= text_field_tag 'settings[host_name]', Setting.host_name, :size => 60 %>
++<%= select_tag 'settings[protocol]', options_for_select(['http', 'https'], Setting.protocol) %>
+<%= select_tag 'settings[text_formatting]', options_for_select([[l(:label_none), "0"], ["textile", "textile"]], Setting.text_formatting) %>
@@ -91,4 +94,4 @@ <%= submit_tag l(:button_save) %> -<% end %> \ No newline at end of file +<% end %> diff --git a/config/settings.yml b/config/settings.yml index ff695cc7..333203f0 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -47,6 +47,8 @@ default_language: default: en host_name: default: localhost:3000 +protocol: + default: http feeds_limit: format: int default: 15 diff --git a/lang/bg.yml b/lang/bg.yml index 366aa94a..46979253 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/cs.yml b/lang/cs.yml index 4f35c8a3..d6274663 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/de.yml b/lang/de.yml index 350a86e4..9a5fcee2 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/en.yml b/lang/en.yml index 4a52d281..2ab4c11a 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -80,6 +80,8 @@ mail_subject_lost_password: Your Redmine password mail_body_lost_password: 'To change your Redmine password, click on the following link:' mail_subject_register: Redmine account activation mail_body_register: 'To activate your Redmine account, click on the following link:' +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information gui_validation_error: 1 error gui_validation_error_plural: %d errors @@ -189,6 +191,7 @@ setting_cross_project_issue_relations: Allow cross-project issue relations setting_issue_list_default_columns: Default columns displayed on the issue list setting_repositories_encodings: Repositories encodings setting_emails_footer: Emails footer +setting_protocol: Protocol label_user: User label_user_plural: Users diff --git a/lang/es.yml b/lang/es.yml index 5d1f806c..e93fb5bd 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -537,3 +537,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/fr.yml b/lang/fr.yml index e5a2b843..1f35272c 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -80,6 +80,8 @@ mail_subject_lost_password: Votre mot de passe redMine mail_body_lost_password: 'Pour changer votre mot de passe Redmine, cliquez sur le lien suivant:' mail_subject_register: Activation de votre compte redMine mail_body_register: 'Pour activer votre compte Redmine, cliquez sur le lien suivant:' +mail_body_account_information_external: Vous pouvez utiliser votre compte "%s" pour vous connecter à Redmine. +mail_body_account_information: Paramètres de connexion de votre compte Redmine gui_validation_error: 1 erreur gui_validation_error_plural: %d erreurs @@ -189,6 +191,7 @@ setting_cross_project_issue_relations: Autoriser les relations entre demandes de setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes setting_repositories_encodings: Encodages des dépôts setting_emails_footer: Pied-de-page des emails +setting_protocol: Protocole label_user: Utilisateur label_user_plural: Utilisateurs diff --git a/lang/he.yml b/lang/he.yml index 206d3309..73f72d5b 100644 --- a/lang/he.yml +++ b/lang/he.yml @@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/it.yml b/lang/it.yml index 36475e67..224843e0 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/ja.yml b/lang/ja.yml index 5a3362c2..4ff45f5f 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -535,3 +535,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/nl.yml b/lang/nl.yml index 4d9479f3..f43f5a5b 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -535,3 +535,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/pl.yml b/lang/pl.yml index 6f8d7f2f..e636afe5 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: Możesz użyć twojego "%s" konta do zalogowania do Redmine. +mail_body_account_information: Twoje konto w Redmine +setting_protocol: Protocol diff --git a/lang/pt-br.yml b/lang/pt-br.yml index a0179397..707baffc 100644 --- a/lang/pt-br.yml +++ b/lang/pt-br.yml @@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/pt.yml b/lang/pt.yml index da919938..687ab512 100644 --- a/lang/pt.yml +++ b/lang/pt.yml @@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/ro.yml b/lang/ro.yml index 73280933..f31bd6f8 100644 --- a/lang/ro.yml +++ b/lang/ro.yml @@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/sr.yml b/lang/sr.yml index 96cd9273..d9585573 100644 --- a/lang/sr.yml +++ b/lang/sr.yml @@ -80,6 +80,8 @@ mail_subject_lost_password: Vaša redMine lozinka mail_body_lost_password: 'Da biste izmenili vašu Redmine lozinku, kliknite na sledeći link:' mail_subject_register: aktivacija redMine naloga mail_body_register: 'Da biste aktivirali vaš Redmine nalog, kliknite na sledeći link:' +mail_body_account_information_external: Mozete koristiti vas "%s" nalog da bi ste se prikljucili na Redmine. +mail_body_account_information: Informacije o vasem Redmine nalogu gui_validation_error: 1 greška gui_validation_error_plural: %d grešaka @@ -535,3 +537,4 @@ enumeration_doc_categories: Kategorija dokumenata enumeration_activities: Aktivnosti (praćenje vremena)) label_float: Float button_copy: Copy +setting_protocol: Protocol diff --git a/lang/sv.yml b/lang/sv.yml index ae1329db..0cd4f1a1 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -535,3 +535,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/lang/zh.yml b/lang/zh.yml index a7ce17e1..71501092 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -537,3 +537,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in" setting_emails_footer: Emails footer label_float: Float button_copy: Copy +mail_body_account_information_external: You can use your "%s" account to log into Redmine. +mail_body_account_information: Your Redmine account information +setting_protocol: Protocol diff --git a/test/fixtures/attachments.yml b/test/fixtures/attachments.yml index 6c352e1e..76494875 100644 --- a/test/fixtures/attachments.yml +++ b/test/fixtures/attachments.yml @@ -11,3 +11,16 @@ attachments_001: filesize: 28 filename: error281.txt author_id: 2 +attachments_002: + created_on: 2006-07-19 21:07:27 +02:00 + downloads: 0 + content_type: text/plain + disk_filename: 060719210727_document.txt + container_id: 1 + digest: b91e08d0cf966d5c6ff411bd8c4cc3a2 + id: 2 + container_type: Document + filesize: 28 + filename: document.txt + author_id: 2 + \ No newline at end of file diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb index d92c5837..096551ee 100644 --- a/test/unit/mailer_test.rb +++ b/test/unit/mailer_test.rb @@ -18,7 +18,7 @@ require File.dirname(__FILE__) + '/../test_helper' class MailerTest < Test::Unit::TestCase - fixtures :projects, :issues, :users, :members, :documents, :attachments, :tokens, :journals, :journal_details, :trackers, :issue_statuses, :enumerations + fixtures :projects, :issues, :users, :members, :documents, :attachments, :news, :tokens, :journals, :journal_details, :trackers, :issue_statuses, :enumerations # test mailer methods for each language def test_issue_add @@ -37,18 +37,54 @@ class MailerTest < Test::Unit::TestCase end end - def test_document_add + def test_document_added document = Document.find(1) GLoc.valid_languages.each do |lang| Setting.default_language = lang.to_s assert Mailer.deliver_document_added(document) end end + + def test_attachments_added + attachements = [ Attachment.find_by_container_type('Document') ] + GLoc.valid_languages.each do |lang| + Setting.default_language = lang.to_s + assert Mailer.deliver_attachments_added(attachements) + end + end + + def test_news_added + news = News.find(:first) + GLoc.valid_languages.each do |lang| + Setting.default_language = lang.to_s + assert Mailer.deliver_news_added(news) + end + end + + def test_message_posted + message = Message.find(:first) + recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author} + recipients = recipients.compact.uniq + GLoc.valid_languages.each do |lang| + Setting.default_language = lang.to_s + assert Mailer.deliver_message_posted(message, recipients) + end + end + + def test_account_information + user = User.find(:first) + GLoc.valid_languages.each do |lang| + user.update_attribute :language, lang.to_s + user.reload + assert Mailer.deliver_account_information(user, 'pAsswORd') + end + end def test_lost_password token = Token.find(2) GLoc.valid_languages.each do |lang| token.user.update_attribute :language, lang.to_s + token.reload assert Mailer.deliver_lost_password(token) end end @@ -57,7 +93,8 @@ class MailerTest < Test::Unit::TestCase token = Token.find(1) GLoc.valid_languages.each do |lang| token.user.update_attribute :language, lang.to_s + token.reload assert Mailer.deliver_register(token) end end -end \ No newline at end of file +end