mirror of
https://github.com/redmine/redmine.git
synced 2025-11-03 20:06:24 +01:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user