Download all attachments in a journal (#35462).

Patch by Takenori TAKAKI.


git-svn-id: http://svn.redmine.org/redmine/trunk@21292 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Go MAEDA
2021-11-22 08:42:44 +00:00
parent d72ae9b32b
commit 0a5ef25e87
7 changed files with 46 additions and 3 deletions

View File

@@ -225,7 +225,7 @@ class AttachmentsController < ApplicationController
rescue rescue
nil nil
end end
unless klass && klass.reflect_on_association(:attachments) unless klass && (klass.reflect_on_association(:attachments) || klass.method_defined?(:attachments))
render_404 render_404
return return
end end

View File

@@ -28,6 +28,7 @@ class JournalsController < ApplicationController
helper :issues helper :issues
helper :custom_fields helper :custom_fields
helper :queries helper :queries
helper :attachments
include QueriesHelper include QueriesHelper
def index def index

View File

@@ -931,7 +931,11 @@ module ApplicationHelper
# 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] || []
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? if attachments.present?
text.gsub!(/src="([^\/"]+\.(bmp|gif|jpg|jpe|jpeg|png))"(\s+alt="([^"]*)")?/i) do |m| text.gsub!(/src="([^\/"]+\.(bmp|gif|jpg|jpe|jpeg|png))"(\s+alt="([^"]*)")?/i) do |m|
filename, ext, alt, alttext = $1, $2, $3, $4 filename, ext, alt, alttext = $1, $2, $3, $4

View File

@@ -32,6 +32,14 @@ module JournalsHelper
indice = journal.indice || @journal.issue.visible_journals_with_index.find{|j| j.id == @journal.id}.indice 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)) 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 journal.notes.present?
if options[:reply_links] if options[:reply_links]
links << link_to(l(:button_quote), links << link_to(l(:button_quote),

View File

@@ -138,7 +138,7 @@ class Journal < ActiveRecord::Base
end end
def attachments 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 end
# Returns a string of css classes # Returns a string of css classes

View File

@@ -184,6 +184,22 @@ class ApplicationHelperTest < Redmine::HelperTest
to_test.each {|text, result| assert_equal "<p>#{result}</p>", textilizable(text, :attachments => attachments)} to_test.each {|text, result| assert_equal "<p>#{result}</p>", textilizable(text, :attachments => attachments)}
end 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?("<img src=\"/attachments/download/#{attachment_1.id}/attached_on_issue.png\" alt=\"\" />")
assert textilizable(raw, :object => journal).include?("<img src=\"/attachments/download/#{attachment_2.id}/attached_on_journal.png\" alt=\"\" />")
end
def test_attached_images_with_textile_and_non_ascii_filename def test_attached_images_with_textile_and_non_ascii_filename
to_test = { to_test = {
'CAFÉ.JPG' => 'CAF%C3%89.JPG', 'CAFÉ.JPG' => 'CAF%C3%89.JPG',

View File

@@ -222,4 +222,18 @@ class JournalTest < ActiveSupport::TestCase
visible_details = journal.visible_details(User.find(2)) visible_details = journal.visible_details(User.find(2))
assert_equal 2, visible_details.size assert_equal 2, visible_details.size
end end
def test_attachments
journal = Journal.new
[0, 1].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 end