#9 Active Storage - Mime type removed from the revision
This commit is contained in:
parent
deb63e2b03
commit
4a9f806783
@ -140,7 +140,6 @@ class DmsfFilesController < ApplicationController
|
|||||||
if upload
|
if upload
|
||||||
revision.size = upload.size
|
revision.size = upload.size
|
||||||
revision.disk_filename = revision.new_storage_filename
|
revision.disk_filename = revision.new_storage_filename
|
||||||
revision.mime_type = upload.mime_type
|
|
||||||
revision.file.attach(
|
revision.file.attach(
|
||||||
io: File.open(upload.tempfile_path),
|
io: File.open(upload.tempfile_path),
|
||||||
filename: revision.disk_filename,
|
filename: revision.disk_filename,
|
||||||
@ -151,7 +150,6 @@ class DmsfFilesController < ApplicationController
|
|||||||
else
|
else
|
||||||
revision.size = last_revision.size
|
revision.size = last_revision.size
|
||||||
revision.disk_filename = last_revision.disk_filename
|
revision.disk_filename = last_revision.disk_filename
|
||||||
revision.mime_type = last_revision.mime_type
|
|
||||||
end
|
end
|
||||||
# Custom fields
|
# Custom fields
|
||||||
revision.copy_custom_field_values(params[:dmsf_file_revision][:custom_field_values], last_revision)
|
revision.copy_custom_field_values(params[:dmsf_file_revision][:custom_field_values], last_revision)
|
||||||
|
|||||||
@ -113,7 +113,6 @@ class DmsfUploadController < ApplicationController
|
|||||||
uploaded_file[:disk_filename] = upload.disk_filename
|
uploaded_file[:disk_filename] = upload.disk_filename
|
||||||
uploaded_file[:tempfile_path] = upload.tempfile_path
|
uploaded_file[:tempfile_path] = upload.tempfile_path
|
||||||
uploaded_file[:size] = upload.size
|
uploaded_file[:size] = upload.size
|
||||||
uploaded_file[:digest] = upload.digest
|
|
||||||
uploaded_file[:mime_type] = upload.mime_type
|
uploaded_file[:mime_type] = upload.mime_type
|
||||||
end
|
end
|
||||||
commit_files_internal uploaded_files
|
commit_files_internal uploaded_files
|
||||||
|
|||||||
@ -68,7 +68,6 @@ module DmsfUploadHelper
|
|||||||
new_revision.patch_version = if committed_file[:version_patch].present?
|
new_revision.patch_version = if committed_file[:version_patch].present?
|
||||||
DmsfUploadHelper.db_version committed_file[:version_patch]
|
DmsfUploadHelper.db_version committed_file[:version_patch]
|
||||||
end
|
end
|
||||||
new_revision.mime_type = committed_file[:mime_type]
|
|
||||||
new_revision.size = committed_file[:size]
|
new_revision.size = committed_file[:size]
|
||||||
# Custom fields
|
# Custom fields
|
||||||
new_revision.copy_custom_field_values(committed_file[:custom_field_values])
|
new_revision.copy_custom_field_values(committed_file[:custom_field_values])
|
||||||
|
|||||||
@ -115,7 +115,11 @@ class DmsfFileRevision < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def checksum
|
def checksum
|
||||||
file.blob.checksum
|
file.blob&.checksum
|
||||||
|
end
|
||||||
|
|
||||||
|
def mime_type
|
||||||
|
file.blob&.content_type
|
||||||
end
|
end
|
||||||
|
|
||||||
def visible?(_user = nil)
|
def visible?(_user = nil)
|
||||||
@ -231,7 +235,6 @@ class DmsfFileRevision < ApplicationRecord
|
|||||||
new_revision.dmsf_file = dmsf_file
|
new_revision.dmsf_file = dmsf_file
|
||||||
new_revision.disk_filename = disk_filename
|
new_revision.disk_filename = disk_filename
|
||||||
new_revision.size = size
|
new_revision.size = size
|
||||||
new_revision.mime_type = mime_type
|
|
||||||
new_revision.title = title
|
new_revision.title = title
|
||||||
new_revision.description = description
|
new_revision.description = description
|
||||||
new_revision.workflow = workflow
|
new_revision.workflow = workflow
|
||||||
@ -322,7 +325,7 @@ class DmsfFileRevision < ApplicationRecord
|
|||||||
file.attach(
|
file.attach(
|
||||||
io: open_file,
|
io: open_file,
|
||||||
filename: dmsf_file.name,
|
filename: dmsf_file.name,
|
||||||
content_type: mime_type,
|
content_type: mime_type.presence || Redmine::MimeType.of(disk_filename),
|
||||||
identify: false
|
identify: false
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -32,7 +32,7 @@ class DmsfUpload
|
|||||||
if a
|
if a
|
||||||
uploaded = {
|
uploaded = {
|
||||||
disk_filename: DmsfHelper.temp_filename(a.filename),
|
disk_filename: DmsfHelper.temp_filename(a.filename),
|
||||||
content_type: a.content_type,
|
content_type: a.content_type.presence || 'application/octet-stream',
|
||||||
original_filename: a.filename,
|
original_filename: a.filename,
|
||||||
comment: uploaded_file[:description],
|
comment: uploaded_file[:description],
|
||||||
tempfile_path: a.diskfile,
|
tempfile_path: a.diskfile,
|
||||||
@ -53,7 +53,6 @@ class DmsfUpload
|
|||||||
@size = 0
|
@size = 0
|
||||||
@tempfile_path = ''
|
@tempfile_path = ''
|
||||||
@token = ''
|
@token = ''
|
||||||
@digest = ''
|
|
||||||
if RedmineDmsf.empty_minor_version_by_default?
|
if RedmineDmsf.empty_minor_version_by_default?
|
||||||
@major_version = 1
|
@major_version = 1
|
||||||
@minor_version = nil
|
@minor_version = nil
|
||||||
@ -85,7 +84,6 @@ class DmsfUpload
|
|||||||
end
|
end
|
||||||
@tempfile_path = uploaded[:tempfile_path]
|
@tempfile_path = uploaded[:tempfile_path]
|
||||||
@token = uploaded[:token]
|
@token = uploaded[:token]
|
||||||
@digest = uploaded[:digest]
|
|
||||||
|
|
||||||
if file.nil? || file.last_revision.nil?
|
if file.nil? || file.last_revision.nil?
|
||||||
@title = DmsfFileRevision.filename_to_title(@name)
|
@title = DmsfFileRevision.filename_to_title(@name)
|
||||||
|
|||||||
@ -35,7 +35,7 @@ api.dmsf_file do
|
|||||||
api.dmsf_workflow_started_by_user_id r.dmsf_workflow_started_by_user_id
|
api.dmsf_workflow_started_by_user_id r.dmsf_workflow_started_by_user_id
|
||||||
api.dmsf_workflow_started_at r.dmsf_workflow_started_at
|
api.dmsf_workflow_started_at r.dmsf_workflow_started_at
|
||||||
api.dmsf_worklfow_state r.workflow_str(false)
|
api.dmsf_worklfow_state r.workflow_str(false)
|
||||||
api.digest r.digest
|
api.digest r.checksum
|
||||||
render_api_custom_values r.visible_custom_field_values, api
|
render_api_custom_values r.visible_custom_field_values, api
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -18,13 +18,17 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
# Add column
|
# Add column
|
||||||
class RemoveDigestFromRevision < ActiveRecord::Migration[7.0]
|
class RemoveDuplicitiesFromRevision < ActiveRecord::Migration[7.0]
|
||||||
def up
|
def up
|
||||||
remove_column :dmsf_file_revisions, :digest
|
remove_column :dmsf_file_revisions, :digest
|
||||||
|
remove_column :dmsf_file_revisions, :mime_type
|
||||||
|
# We need to keep the size despite the fact that it's duplicated in active_storage_blobs to speed up the main
|
||||||
|
# document view
|
||||||
end
|
end
|
||||||
|
|
||||||
def down
|
def down
|
||||||
add_column :dmsf_file_revisions, :digest, :string, limit: 64, default: '', null: false
|
add_column :dmsf_file_revisions, :digest, :string, limit: 64, default: '', null: false
|
||||||
# Recalculation of checksums for all revisions is technically possible but costs are too high.
|
add_column :dmsf_file_revisions, :mime_type, :string
|
||||||
|
# Recalculation of these columns for all revisions is technically possible but costs are too high.
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -599,7 +599,6 @@ module RedmineDmsf
|
|||||||
new_revision.dmsf_file = f
|
new_revision.dmsf_file = f
|
||||||
new_revision.user = User.current
|
new_revision.user = User.current
|
||||||
new_revision.name = basename
|
new_revision.name = basename
|
||||||
new_revision.mime_type = Redmine::MimeType.of(new_revision.name)
|
|
||||||
|
|
||||||
# Phusion passenger does not have a method "length" in its model
|
# Phusion passenger does not have a method "length" in its model
|
||||||
# however, includes a size method - so we instead use reflection
|
# however, includes a size method - so we instead use reflection
|
||||||
@ -786,9 +785,7 @@ module RedmineDmsf
|
|||||||
r.dmsf_file = f
|
r.dmsf_file = f
|
||||||
r.user = User.current
|
r.user = User.current
|
||||||
r.name = basename
|
r.name = basename
|
||||||
r.mime_type = Redmine::MimeType.of(r.name)
|
|
||||||
r.size = 0
|
r.size = 0
|
||||||
r.digest = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
|
|
||||||
r.disk_filename = r.new_storage_filename
|
r.disk_filename = r.new_storage_filename
|
||||||
r.available_custom_fields.each do |cf| # Add default value for CFs not existing
|
r.available_custom_fields.each do |cf| # Add default value for CFs not existing
|
||||||
next unless cf.default_value
|
next unless cf.default_value
|
||||||
|
|||||||
2
test/fixtures/active_storage_blobs.yml
vendored
2
test/fixtures/active_storage_blobs.yml
vendored
@ -3,7 +3,7 @@ active_storage_blob_1:
|
|||||||
id: 1
|
id: 1
|
||||||
key: '5lge4yv88jwzt7xl76vri2be1v01'
|
key: '5lge4yv88jwzt7xl76vri2be1v01'
|
||||||
filename: 'test.txt'
|
filename: 'test.txt'
|
||||||
content_type: 'tect/plain'
|
content_type: 'text/plain'
|
||||||
metadata: '{"identified":true,"analyzed":true}'
|
metadata: '{"identified":true,"analyzed":true}'
|
||||||
service_name: 'test'
|
service_name: 'test'
|
||||||
byte_size: 3
|
byte_size: 3
|
||||||
|
|||||||
@ -150,6 +150,6 @@ class DmsfFilesControllerTest < RedmineDmsf::Test::TestCase
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
assert_redirected_to dmsf_folder_path(id: @file1.project)
|
assert_redirected_to dmsf_folder_path(id: @file1.project)
|
||||||
assert_not_nil @file1.last_revision.digest
|
assert_not_nil @file1.last_revision.checksum
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -90,7 +90,7 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
|
|||||||
params: '1234',
|
params: '1234',
|
||||||
headers: @jsmith.merge!({ content_type: :text })
|
headers: @jsmith.merge!({ content_type: :text })
|
||||||
assert_response :forbidden
|
assert_response :forbidden
|
||||||
# Lets check for our file
|
# Let's check for our file
|
||||||
file = DmsfFile.find_file_by_name @project2, nil, 'test-1234.txt'
|
file = DmsfFile.find_file_by_name @project2, nil, 'test-1234.txt'
|
||||||
assert_nil file, 'Check for files existance'
|
assert_nil file, 'Check for files existance'
|
||||||
end
|
end
|
||||||
@ -112,7 +112,6 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
|
|||||||
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt'
|
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt'
|
||||||
assert file, 'File test-1234 was not found in projects dmsf folder.'
|
assert file, 'File test-1234 was not found in projects dmsf folder.'
|
||||||
assert file.last_revision
|
assert file.last_revision
|
||||||
assert_equal 'MD5', file.last_revision.digest_type
|
|
||||||
|
|
||||||
with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1',
|
with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1',
|
||||||
'dmsf_webdav' => '1',
|
'dmsf_webdav' => '1',
|
||||||
@ -381,8 +380,8 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
|
|||||||
headers: @jsmith.merge!({ content_type: :text })
|
headers: @jsmith.merge!({ content_type: :text })
|
||||||
assert_response :created
|
assert_response :created
|
||||||
end
|
end
|
||||||
sha = @file1.last_revision.file.checksum
|
checksum = Digest::MD5.base64digest('1234')
|
||||||
assert_equal sha, @file1.last_revision.digest
|
assert_equal checksum, @file1.last_revision.checksum
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_put_version
|
def test_put_version
|
||||||
|
|||||||
@ -89,7 +89,6 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
|
|||||||
r1.title = DmsfFileRevision.filename_to_title(r1.name)
|
r1.title = DmsfFileRevision.filename_to_title(r1.name)
|
||||||
r1.description = nil
|
r1.description = nil
|
||||||
r1.comment = nil
|
r1.comment = nil
|
||||||
r1.mime_type = nil
|
|
||||||
r1.size = 4
|
r1.size = 4
|
||||||
|
|
||||||
r2 = r1.clone
|
r2 = r1.clone
|
||||||
@ -132,7 +131,6 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
|
|||||||
r1.title = DmsfFileRevision.filename_to_title(r1.name)
|
r1.title = DmsfFileRevision.filename_to_title(r1.name)
|
||||||
r1.description = nil
|
r1.description = nil
|
||||||
r1.comment = nil
|
r1.comment = nil
|
||||||
r1.mime_type = nil
|
|
||||||
r1.size = 4
|
r1.size = 4
|
||||||
assert r1.invalid?
|
assert r1.invalid?
|
||||||
message = ['Attachment extension .png is not allowed']
|
message = ['Attachment extension .png is not allowed']
|
||||||
@ -215,32 +213,32 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_protocol_doc
|
def test_protocol_doc
|
||||||
@revision1.mime_type = Redmine::MimeType.of('test.doc')
|
@revision1.file.blob.content_type = Redmine::MimeType.of('test.doc')
|
||||||
assert_equal 'ms-word', @revision1.protocol
|
assert_equal 'ms-word', @revision1.protocol
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_protocol_docx
|
def test_protocol_docx
|
||||||
@revision1.mime_type = Redmine::MimeType.of('test.docx')
|
@revision1.file.blob.content_type = Redmine::MimeType.of('test.docx')
|
||||||
assert_equal 'ms-word', @revision1.protocol
|
assert_equal 'ms-word', @revision1.protocol
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_protocol_odt
|
def test_protocol_odt
|
||||||
@revision1.mime_type = Redmine::MimeType.of('test.odt')
|
@revision1.file.blob.content_type = Redmine::MimeType.of('test.odt')
|
||||||
assert_equal 'ms-word', @revision1.protocol
|
assert_equal 'ms-word', @revision1.protocol
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_protocol_xls
|
def test_protocol_xls
|
||||||
@revision1.mime_type = Redmine::MimeType.of('test.xls')
|
@revision1.file.blob.content_type = Redmine::MimeType.of('test.xls')
|
||||||
assert_equal 'ms-excel', @revision1.protocol
|
assert_equal 'ms-excel', @revision1.protocol
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_protocol_xlsx
|
def test_protocol_xlsx
|
||||||
@revision1.mime_type = Redmine::MimeType.of('test.xlsx')
|
@revision1.file.blob.content_type = Redmine::MimeType.of('test.xlsx')
|
||||||
assert_equal 'ms-excel', @revision1.protocol
|
assert_equal 'ms-excel', @revision1.protocol
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_protocol_ods
|
def test_protocol_ods
|
||||||
@revision1.mime_type = Redmine::MimeType.of('test.ods')
|
@revision1.file.blob.content_type = Redmine::MimeType.of('test.ods')
|
||||||
assert_equal 'ms-excel', @revision1.protocol
|
assert_equal 'ms-excel', @revision1.protocol
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user