diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 8e28194a30..4af060b40c 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -225,7 +225,7 @@ class AttachmentsController < ApplicationController rescue nil end - unless klass && klass.reflect_on_association(:attachments) + unless klass && (klass.reflect_on_association(:attachments) || klass.method_defined?(:attachments)) render_404 return end diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 95f47e360b..c2674a4c42 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -28,6 +28,7 @@ class JournalsController < ApplicationController helper :issues helper :custom_fields helper :queries + helper :attachments include QueriesHelper def index diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 57f3e488bd..536e2fb0c5 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -918,7 +918,11 @@ module ApplicationHelper # when using an image link, try to use an attachment, if possible attachments = options[:attachments] || [] - attachments += obj.attachments if obj.respond_to?(:attachments) + if obj.is_a?(Journal) + attachments += obj.journalized.attachments if obj.journalized.respond_to?(:attachments) + else + attachments += obj.attachments if obj.respond_to?(:attachments) + end if attachments.present? text.gsub!(/src="([^\/"]+\.(bmp|gif|jpg|jpe|jpeg|png))"(\s+alt="([^"]*)")?/i) do |m| filename, ext, alt, alttext = $1, $2, $3, $4 diff --git a/app/helpers/journals_helper.rb b/app/helpers/journals_helper.rb index d95d2b77b1..927cdb6847 100644 --- a/app/helpers/journals_helper.rb +++ b/app/helpers/journals_helper.rb @@ -32,6 +32,14 @@ module JournalsHelper indice = journal.indice || @journal.issue.visible_journals_with_index.find{|j| j.id == @journal.id}.indice dropbown_links << copy_object_url_link(issue_url(issue, anchor: "note-#{indice}", only_path: false)) + if journal.attachments.size > 1 + dropbown_links << link_to(l(:label_download_all_attachments), + container_attachments_download_path(journal), + :title => l(:label_download_all_attachments), + :class => 'icon icon-download' + ) + end + if journal.notes.present? if options[:reply_links] links << link_to(l(:button_quote), diff --git a/app/models/journal.rb b/app/models/journal.rb index a608703d7f..f42394bc91 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -138,7 +138,7 @@ class Journal < ActiveRecord::Base end def attachments - journalized.respond_to?(:attachments) ? journalized.attachments : [] + details.select{ |d| d.property == 'attachment' }.map{ |d| Attachment.find_by(:id => d.prop_key) }.compact end # Returns a string of css classes diff --git a/test/helpers/application_helper_test.rb b/test/helpers/application_helper_test.rb index 730023443c..8d2082135e 100644 --- a/test/helpers/application_helper_test.rb +++ b/test/helpers/application_helper_test.rb @@ -182,6 +182,22 @@ class ApplicationHelperTest < Redmine::HelperTest to_test.each {|text, result| assert_equal "

#{result}

", textilizable(text, :attachments => attachments)} end + def test_attached_images_on_issue + issue = Issue.generate! + attachment_1 = Attachment.generate!(:file => mock_file_with_options(:original_filename => "attached_on_issue.png"), :container => issue) + journal = issue.init_journal(User.find(2), issue) + attachment_2 = Attachment.generate!(:file => mock_file_with_options(:original_filename => "attached_on_journal.png"), :container => issue) + journal.journalize_attachment(attachment_2, :added) + + raw = <<~RAW + !attached_on_issue.png! + !attached_on_journal.png!' + RAW + + assert textilizable(raw, :object => journal).include?("\"\"") + assert textilizable(raw, :object => journal).include?("\"\"") + end + def test_attached_images_with_textile_and_non_ascii_filename to_test = { 'CAFÉ.JPG' => 'CAF%C3%89.JPG', diff --git a/test/unit/journal_test.rb b/test/unit/journal_test.rb index 0962407348..b627702ceb 100644 --- a/test/unit/journal_test.rb +++ b/test/unit/journal_test.rb @@ -222,4 +222,18 @@ class JournalTest < ActiveSupport::TestCase visible_details = journal.visible_details(User.find(2)) assert_equal 2, visible_details.size end + + def test_attachments + journal = Journal.new + 2.times.map{ |i| Attachment.generate!(:file => mock_file_with_options(:original_filename => "image#{i}.png")) }.each do |attachment| + journal.details << JournalDetail.new(:property => 'attachment', :prop_key => attachment.id, :value => attachment.filename) + end + + attachments = journal.attachments + assert_equal 2, attachments.size + attachments.each_with_index do |attachment, i| + assert_kind_of Attachment, attachment + assert_equal "image#{i}.png", attachment.filename + end + end end