Fixes:
* email notifications: host name is missing in generated links (#639, #201) * email notifications: referenced changesets, wiki pages, attachments... are not turned into links (only ticket ids are) * attachment links and inline images don't work in issue notes git-svn-id: http://redmine.rubyforge.org/svn/trunk@1161 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
5d6d0136c1
commit
e5daf25618
|
@ -178,16 +178,20 @@ module ApplicationHelper
|
||||||
case args.size
|
case args.size
|
||||||
when 1
|
when 1
|
||||||
obj = nil
|
obj = nil
|
||||||
text = args.shift || ''
|
text = args.shift
|
||||||
when 2
|
when 2
|
||||||
obj = args.shift
|
obj = args.shift
|
||||||
text = obj.send(args.shift)
|
text = obj.send(args.shift).to_s
|
||||||
else
|
else
|
||||||
raise ArgumentError, 'invalid arguments to textilizable'
|
raise ArgumentError, 'invalid arguments to textilizable'
|
||||||
end
|
end
|
||||||
|
return '' if text.blank?
|
||||||
|
|
||||||
|
only_path = options.delete(:only_path) == false ? false : true
|
||||||
|
|
||||||
# when using an image link, try to use an attachment, if possible
|
# when using an image link, try to use an attachment, if possible
|
||||||
attachments = options[:attachments]
|
attachments = options[:attachments] || (obj && obj.respond_to?(:attachments) ? obj.attachments : nil)
|
||||||
|
|
||||||
if attachments
|
if attachments
|
||||||
text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
|
text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
|
||||||
style = $1
|
style = $1
|
||||||
|
@ -195,7 +199,7 @@ module ApplicationHelper
|
||||||
rf = Regexp.new(filename, Regexp::IGNORECASE)
|
rf = Regexp.new(filename, Regexp::IGNORECASE)
|
||||||
# search for the picture in attachments
|
# search for the picture in attachments
|
||||||
if found = attachments.detect { |att| att.filename =~ rf }
|
if found = attachments.detect { |att| att.filename =~ rf }
|
||||||
image_url = url_for :controller => 'attachments', :action => 'download', :id => found.id
|
image_url = url_for :only_path => only_path, :controller => 'attachments', :action => 'download', :id => found.id
|
||||||
"!#{style}#{image_url}!"
|
"!#{style}#{image_url}!"
|
||||||
else
|
else
|
||||||
"!#{style}#{filename}!"
|
"!#{style}#{filename}!"
|
||||||
|
@ -216,10 +220,10 @@ module ApplicationHelper
|
||||||
# used for single-file wiki export
|
# used for single-file wiki export
|
||||||
format_wiki_link = Proc.new {|project, title| "##{title}" }
|
format_wiki_link = Proc.new {|project, title| "##{title}" }
|
||||||
else
|
else
|
||||||
format_wiki_link = Proc.new {|project, title| url_for :controller => 'wiki', :action => 'index', :id => project, :page => title }
|
format_wiki_link = Proc.new {|project, title| url_for(:only_path => only_path, :controller => 'wiki', :action => 'index', :id => project, :page => title) }
|
||||||
end
|
end
|
||||||
|
|
||||||
project = options[:project] || @project
|
project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil)
|
||||||
|
|
||||||
# Wiki links
|
# Wiki links
|
||||||
#
|
#
|
||||||
|
@ -278,7 +282,8 @@ module ApplicationHelper
|
||||||
if esc.nil?
|
if esc.nil?
|
||||||
if prefix.nil? && sep == 'r'
|
if prefix.nil? && sep == 'r'
|
||||||
if project && (changeset = project.changesets.find_by_revision(oid))
|
if project && (changeset = project.changesets.find_by_revision(oid))
|
||||||
link = link_to("r#{oid}", {:controller => 'repositories', :action => 'revision', :id => project.id, :rev => oid}, :class => 'changeset',
|
link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project.id, :rev => oid},
|
||||||
|
:class => 'changeset',
|
||||||
:title => truncate(changeset.comments, 100))
|
:title => truncate(changeset.comments, 100))
|
||||||
end
|
end
|
||||||
elsif sep == '#'
|
elsif sep == '#'
|
||||||
|
@ -286,17 +291,20 @@ module ApplicationHelper
|
||||||
case prefix
|
case prefix
|
||||||
when nil
|
when nil
|
||||||
if issue = Issue.find_by_id(oid, :include => [:project, :status], :conditions => Project.visible_by(User.current))
|
if issue = Issue.find_by_id(oid, :include => [:project, :status], :conditions => Project.visible_by(User.current))
|
||||||
link = link_to("##{oid}", {:controller => 'issues', :action => 'show', :id => oid}, :class => 'issue',
|
link = link_to("##{oid}", {:only_path => only_path, :controller => 'issues', :action => 'show', :id => oid},
|
||||||
|
:class => 'issue',
|
||||||
:title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
|
:title => "#{truncate(issue.subject, 100)} (#{issue.status.name})")
|
||||||
link = content_tag('del', link) if issue.closed?
|
link = content_tag('del', link) if issue.closed?
|
||||||
end
|
end
|
||||||
when 'document'
|
when 'document'
|
||||||
if document = Document.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
|
if document = Document.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
|
||||||
link = link_to h(document.title), {:controller => 'documents', :action => 'show', :id => document}, :class => 'document'
|
link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
|
||||||
|
:class => 'document'
|
||||||
end
|
end
|
||||||
when 'version'
|
when 'version'
|
||||||
if version = Version.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
|
if version = Version.find_by_id(oid, :include => [:project], :conditions => Project.visible_by(User.current))
|
||||||
link = link_to h(version.name), {:controller => 'versions', :action => 'show', :id => version}, :class => 'version'
|
link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
|
||||||
|
:class => 'version'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elsif sep == ':'
|
elsif sep == ':'
|
||||||
|
@ -305,15 +313,18 @@ module ApplicationHelper
|
||||||
case prefix
|
case prefix
|
||||||
when 'document'
|
when 'document'
|
||||||
if project && document = project.documents.find_by_title(name)
|
if project && document = project.documents.find_by_title(name)
|
||||||
link = link_to h(document.title), {:controller => 'documents', :action => 'show', :id => document}, :class => 'document'
|
link = link_to h(document.title), {:only_path => only_path, :controller => 'documents', :action => 'show', :id => document},
|
||||||
|
:class => 'document'
|
||||||
end
|
end
|
||||||
when 'version'
|
when 'version'
|
||||||
if project && version = project.versions.find_by_name(name)
|
if project && version = project.versions.find_by_name(name)
|
||||||
link = link_to h(version.name), {:controller => 'versions', :action => 'show', :id => version}, :class => 'version'
|
link = link_to h(version.name), {:only_path => only_path, :controller => 'versions', :action => 'show', :id => version},
|
||||||
|
:class => 'version'
|
||||||
end
|
end
|
||||||
when 'attachment'
|
when 'attachment'
|
||||||
if attachments && attachment = attachments.detect {|a| a.filename == name }
|
if attachments && attachment = attachments.detect {|a| a.filename == name }
|
||||||
link = link_to h(attachment.filename), {:controller => 'attachments', :action => 'download', :id => attachment}, :class => 'attachment'
|
link = link_to h(attachment.filename), {:only_path => only_path, :controller => 'attachments', :action => 'download', :id => attachment},
|
||||||
|
:class => 'attachment'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -51,7 +51,14 @@ class Journal < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def editable_by?(usr)
|
def editable_by?(usr)
|
||||||
project = journalized.project
|
|
||||||
usr && usr.logged? && (usr.allowed_to?(:edit_issue_notes, project) || (self.user == usr && usr.allowed_to?(:edit_own_issue_notes, project)))
|
usr && usr.logged? && (usr.allowed_to?(:edit_issue_notes, project) || (self.user == usr && usr.allowed_to?(:edit_own_issue_notes, project)))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def project
|
||||||
|
journalized.respond_to?(:project) ? journalized.project : nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def attachments
|
||||||
|
journalized.respond_to?(:attachments) ? journalized.attachments : nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,4 +12,4 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<%= textilizable(issue.description) %>
|
<%= textilizable(issue, :description, :only_path => false) %>
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
<%= link_to @document.title, @document_url %> (<%= @document.category.name %>)<br />
|
<%= link_to @document.title, @document_url %> (<%= @document.category.name %>)<br />
|
||||||
<br />
|
<br />
|
||||||
<%= textilizable(@document.description) %>
|
<%= textilizable(@document, :description, :only_path => false) %>
|
||||||
|
|
|
@ -6,6 +6,6 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<%= textilizable(@journal.notes) %>
|
<%= textilizable(@journal, :notes, :only_path => false) %>
|
||||||
<hr />
|
<hr />
|
||||||
<%= render :partial => "issue_text_html", :locals => { :issue => @issue, :issue_url => @issue_url } %>
|
<%= render :partial => "issue_text_html", :locals => { :issue => @issue, :issue_url => @issue_url } %>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<h1><%=h @message.board.project.name %> - <%=h @message.board.name %>: <%= link_to @message.subject, @message_url %></h1>
|
<h1><%=h @message.board.project.name %> - <%=h @message.board.name %>: <%= link_to @message.subject, @message_url %></h1>
|
||||||
<em><%= @message.author %></em>
|
<em><%= @message.author %></em>
|
||||||
|
|
||||||
<%= textilizable @message.content %>
|
<%= textilizable(@message, :content, :only_path => false) %>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<h1><%= link_to @news.title, @news_url %></h1>
|
<h1><%= link_to @news.title, @news_url %></h1>
|
||||||
<em><%= @news.author.name %></em>
|
<em><%= @news.author.name %></em>
|
||||||
|
|
||||||
<%= textilizable(@news.description) %>
|
<%= textilizable(@news, :description, :only_path => false) %>
|
||||||
|
|
|
@ -8,7 +8,7 @@ journals_001:
|
||||||
journalized_id: 1
|
journalized_id: 1
|
||||||
journals_002:
|
journals_002:
|
||||||
created_on: <%= 1.days.ago.to_date.to_s(:db) %>
|
created_on: <%= 1.days.ago.to_date.to_s(:db) %>
|
||||||
notes: "Some notes"
|
notes: "Some notes with Redmine links: #2, r2."
|
||||||
id: 2
|
id: 2
|
||||||
journalized_type: Issue
|
journalized_type: Issue
|
||||||
user_id: 2
|
user_id: 2
|
||||||
|
|
|
@ -18,7 +18,26 @@
|
||||||
require File.dirname(__FILE__) + '/../test_helper'
|
require File.dirname(__FILE__) + '/../test_helper'
|
||||||
|
|
||||||
class MailerTest < Test::Unit::TestCase
|
class MailerTest < Test::Unit::TestCase
|
||||||
fixtures :projects, :issues, :users, :members, :documents, :attachments, :news, :tokens, :journals, :journal_details, :trackers, :issue_statuses, :enumerations
|
fixtures :projects, :issues, :users, :members, :documents, :attachments, :news, :tokens, :journals, :journal_details, :changesets, :trackers, :issue_statuses, :enumerations
|
||||||
|
|
||||||
|
def test_generated_links_in_emails
|
||||||
|
ActionMailer::Base.deliveries.clear
|
||||||
|
Setting.host_name = 'mydomain.foo'
|
||||||
|
Setting.protocol = 'https'
|
||||||
|
|
||||||
|
journal = Journal.find(2)
|
||||||
|
assert Mailer.deliver_issue_edit(journal)
|
||||||
|
|
||||||
|
mail = ActionMailer::Base.deliveries.last
|
||||||
|
assert_kind_of TMail::Mail, mail
|
||||||
|
# link to the main ticket
|
||||||
|
assert mail.body.include?('<a href="https://mydomain.foo/issues/show/1">Bug #1: Can\'t print recipes</a>')
|
||||||
|
|
||||||
|
# link to a referenced ticket
|
||||||
|
assert mail.body.include?('<a href="https://mydomain.foo/issues/show/2" class="issue" title="Add ingredients categories (Assigned)">#2</a>')
|
||||||
|
# link to a changeset
|
||||||
|
assert mail.body.include?('<a href="https://mydomain.foo/repositories/revision/1?rev=2" class="changeset" title="This commit fixes #1, #2 and references #1 & #3">r2</a>')
|
||||||
|
end
|
||||||
|
|
||||||
# test mailer methods for each language
|
# test mailer methods for each language
|
||||||
def test_issue_add
|
def test_issue_add
|
||||||
|
|
Loading…
Reference in New Issue