#9 Active Storage - Mime type removed from the revision

This commit is contained in:
Karel Pičman 2025-12-01 13:42:50 +01:00
parent deb63e2b03
commit 4a9f806783
12 changed files with 25 additions and 30 deletions

View File

@ -140,7 +140,6 @@ class DmsfFilesController < ApplicationController
if upload
revision.size = upload.size
revision.disk_filename = revision.new_storage_filename
revision.mime_type = upload.mime_type
revision.file.attach(
io: File.open(upload.tempfile_path),
filename: revision.disk_filename,
@ -151,7 +150,6 @@ class DmsfFilesController < ApplicationController
else
revision.size = last_revision.size
revision.disk_filename = last_revision.disk_filename
revision.mime_type = last_revision.mime_type
end
# Custom fields
revision.copy_custom_field_values(params[:dmsf_file_revision][:custom_field_values], last_revision)

View File

@ -113,7 +113,6 @@ class DmsfUploadController < ApplicationController
uploaded_file[:disk_filename] = upload.disk_filename
uploaded_file[:tempfile_path] = upload.tempfile_path
uploaded_file[:size] = upload.size
uploaded_file[:digest] = upload.digest
uploaded_file[:mime_type] = upload.mime_type
end
commit_files_internal uploaded_files

View File

@ -68,7 +68,6 @@ module DmsfUploadHelper
new_revision.patch_version = if committed_file[:version_patch].present?
DmsfUploadHelper.db_version committed_file[:version_patch]
end
new_revision.mime_type = committed_file[:mime_type]
new_revision.size = committed_file[:size]
# Custom fields
new_revision.copy_custom_field_values(committed_file[:custom_field_values])

View File

@ -115,7 +115,11 @@ class DmsfFileRevision < ApplicationRecord
end
def checksum
file.blob.checksum
file.blob&.checksum
end
def mime_type
file.blob&.content_type
end
def visible?(_user = nil)
@ -231,7 +235,6 @@ class DmsfFileRevision < ApplicationRecord
new_revision.dmsf_file = dmsf_file
new_revision.disk_filename = disk_filename
new_revision.size = size
new_revision.mime_type = mime_type
new_revision.title = title
new_revision.description = description
new_revision.workflow = workflow
@ -322,7 +325,7 @@ class DmsfFileRevision < ApplicationRecord
file.attach(
io: open_file,
filename: dmsf_file.name,
content_type: mime_type,
content_type: mime_type.presence || Redmine::MimeType.of(disk_filename),
identify: false
)
end

View File

@ -32,7 +32,7 @@ class DmsfUpload
if a
uploaded = {
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,
comment: uploaded_file[:description],
tempfile_path: a.diskfile,
@ -53,7 +53,6 @@ class DmsfUpload
@size = 0
@tempfile_path = ''
@token = ''
@digest = ''
if RedmineDmsf.empty_minor_version_by_default?
@major_version = 1
@minor_version = nil
@ -85,7 +84,6 @@ class DmsfUpload
end
@tempfile_path = uploaded[:tempfile_path]
@token = uploaded[:token]
@digest = uploaded[:digest]
if file.nil? || file.last_revision.nil?
@title = DmsfFileRevision.filename_to_title(@name)

View File

@ -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_at r.dmsf_workflow_started_at
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
end
end

View File

@ -18,13 +18,17 @@
# <https://www.gnu.org/licenses/>.
# Add column
class RemoveDigestFromRevision < ActiveRecord::Migration[7.0]
class RemoveDuplicitiesFromRevision < ActiveRecord::Migration[7.0]
def up
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
def down
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

View File

@ -599,7 +599,6 @@ module RedmineDmsf
new_revision.dmsf_file = f
new_revision.user = User.current
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
# however, includes a size method - so we instead use reflection
@ -786,9 +785,7 @@ module RedmineDmsf
r.dmsf_file = f
r.user = User.current
r.name = basename
r.mime_type = Redmine::MimeType.of(r.name)
r.size = 0
r.digest = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
r.disk_filename = r.new_storage_filename
r.available_custom_fields.each do |cf| # Add default value for CFs not existing
next unless cf.default_value

View File

@ -3,7 +3,7 @@ active_storage_blob_1:
id: 1
key: '5lge4yv88jwzt7xl76vri2be1v01'
filename: 'test.txt'
content_type: 'tect/plain'
content_type: 'text/plain'
metadata: '{"identified":true,"analyzed":true}'
service_name: 'test'
byte_size: 3

View File

@ -150,6 +150,6 @@ class DmsfFilesControllerTest < RedmineDmsf::Test::TestCase
}
end
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

View File

@ -90,7 +90,7 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
params: '1234',
headers: @jsmith.merge!({ content_type: :text })
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'
assert_nil file, 'Check for files existance'
end
@ -112,7 +112,6 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
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.last_revision
assert_equal 'MD5', file.last_revision.digest_type
with_settings plugin_redmine_dmsf: { 'dmsf_webdav_use_project_names' => '1',
'dmsf_webdav' => '1',
@ -381,8 +380,8 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
headers: @jsmith.merge!({ content_type: :text })
assert_response :created
end
sha = @file1.last_revision.file.checksum
assert_equal sha, @file1.last_revision.digest
checksum = Digest::MD5.base64digest('1234')
assert_equal checksum, @file1.last_revision.checksum
end
def test_put_version

View File

@ -89,7 +89,6 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
r1.title = DmsfFileRevision.filename_to_title(r1.name)
r1.description = nil
r1.comment = nil
r1.mime_type = nil
r1.size = 4
r2 = r1.clone
@ -132,7 +131,6 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
r1.title = DmsfFileRevision.filename_to_title(r1.name)
r1.description = nil
r1.comment = nil
r1.mime_type = nil
r1.size = 4
assert r1.invalid?
message = ['Attachment extension .png is not allowed']
@ -215,32 +213,32 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
end
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
end
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
end
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
end
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
end
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
end
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
end