]> source.dussan.org Git - redmine.git/commitdiff
Fixes:
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 17 Feb 2008 14:17:20 +0000 (14:17 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 17 Feb 2008 14:17:20 +0000 (14:17 +0000)
* 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

app/helpers/application_helper.rb
app/models/journal.rb
app/views/mailer/_issue_text_html.rhtml
app/views/mailer/document_added.text.html.rhtml
app/views/mailer/issue_edit.text.html.rhtml
app/views/mailer/message_posted.text.html.rhtml
app/views/mailer/news_added.text.html.rhtml
test/fixtures/journals.yml
test/unit/mailer_test.rb

index b66851eef3be57390faceb78aab56d7820bffb3c..e39ea09069fc52bf885cb608a6a52a14d21c1b7b 100644 (file)
@@ -178,16 +178,20 @@ module ApplicationHelper
     case args.size
     when 1
       obj = nil
-      text = args.shift || ''
+      text = args.shift
     when 2
       obj = args.shift
-      text = obj.send(args.shift)
+      text = obj.send(args.shift).to_s
     else
       raise ArgumentError, 'invalid arguments to textilizable'
     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
-    attachments = options[:attachments]
+    attachments = options[:attachments] || (obj && obj.respond_to?(:attachments) ? obj.attachments : nil)
+    
     if attachments
       text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(gif|jpg|jpeg|png))!/) do |m|
         style = $1
@@ -195,7 +199,7 @@ module ApplicationHelper
         rf = Regexp.new(filename,  Regexp::IGNORECASE)
         # search for the picture in attachments
         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}!"
         else
           "!#{style}#{filename}!"
@@ -216,10 +220,10 @@ module ApplicationHelper
       # used for single-file wiki export
       format_wiki_link = Proc.new {|project, title| "##{title}" }
     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
     
-    project = options[:project] || @project
+    project = options[:project] || @project || (obj && obj.respond_to?(:project) ? obj.project : nil)
     
     # Wiki links
     # 
@@ -278,7 +282,8 @@ module ApplicationHelper
       if esc.nil?
         if prefix.nil? && sep == 'r'
           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))
           end
         elsif sep == '#'
@@ -286,17 +291,20 @@ module ApplicationHelper
           case prefix
           when nil
             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})")
               link = content_tag('del', link) if issue.closed?
             end
           when 'document'
             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
           when 'version'
             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
         elsif sep == ':'
@@ -305,15 +313,18 @@ module ApplicationHelper
           case prefix
           when 'document'
             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
           when 'version'
             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
           when 'attachment'
             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
index 5aebbb7cefbf947ce21797c49ebedf5dace22095..d757ef90da0a57967a27c0831717bd8737bf1161 100644 (file)
@@ -51,7 +51,14 @@ class Journal < ActiveRecord::Base
   end
   
   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)))
   end
+  
+  def project
+    journalized.respond_to?(:project) ? journalized.project : nil
+  end
+  
+  def attachments
+    journalized.respond_to?(:attachments) ? journalized.attachments : nil
+  end
 end
index a3eb05b0180acbd4905b6268bc857653798b34f4..d0f24781279bf8c7f25b98b08622fd053ab7d73d 100644 (file)
@@ -12,4 +12,4 @@
 <% end %>
 </ul>
 
-<%= textilizable(issue.description) %>
+<%= textilizable(issue, :description, :only_path => false) %>
index 2ef63012b97d7ba7a7f20f65d3156e9805c0867a..dc1f659a09750cf1375a70a36fe389c6757f8ab2 100644 (file)
@@ -1,3 +1,3 @@
 <%= link_to @document.title, @document_url %> (<%= @document.category.name %>)<br />
 <br />
-<%= textilizable(@document.description) %>
+<%= textilizable(@document, :description, :only_path => false) %>
index 7ce1f47c440f7748873c03ebfa8067043df0fa5f..48affaf77cf570b9f66d0ceab7e59a445d414b79 100644 (file)
@@ -6,6 +6,6 @@
 <% end %>
 </ul>
 
-<%= textilizable(@journal.notes) %>
+<%= textilizable(@journal, :notes, :only_path => false) %>
 <hr />
 <%= render :partial => "issue_text_html", :locals => { :issue => @issue, :issue_url => @issue_url } %>
index 837272c0a45251cd4d3456aec760d6031699c40a..d91ce5a0418280ed9012c8e9feeeb60f16b20033 100644 (file)
@@ -1,4 +1,4 @@
 <h1><%=h @message.board.project.name %> - <%=h @message.board.name %>: <%= link_to @message.subject, @message_url %></h1>
 <em><%= @message.author %></em>
 
-<%= textilizable @message.content %>
+<%= textilizable(@message, :content, :only_path => false) %>
index 010ef8ee1baf7b75267297db6d6337e91015ca10..15bc89fac71d490ff5af93f026975217c41a7b0c 100644 (file)
@@ -1,4 +1,4 @@
 <h1><%= link_to @news.title, @news_url %></h1>
 <em><%= @news.author.name %></em>
 
-<%= textilizable(@news.description) %>
+<%= textilizable(@news, :description, :only_path => false) %>
index 169713fc5984f0af2b5b05f4e2a0f8d71f4e0ce6..70aa5da73fcc6a9d125cb6178c60201f7b47a5d3 100644 (file)
@@ -8,7 +8,7 @@ journals_001:
   journalized_id: 1\r
 journals_002: \r
   created_on: <%= 1.days.ago.to_date.to_s(:db) %>\r
-  notes: "Some notes"\r
+  notes: "Some notes with Redmine links: #2, r2."\r
   id: 2\r
   journalized_type: Issue\r
   user_id: 2\r
index 096551ee50a84801c6dcce1bd7907e76b3e0411b..dc3fde414f4f5b2a392805120f63f53c75ed80e7 100644 (file)
 require File.dirname(__FILE__) + '/../test_helper'
 
 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 &amp; #3">r2</a>')
+  end
   
   # test mailer methods for each language
   def test_issue_add