FEATURE: add support for "skip_validations" option in UploadCreator (#13094)

FIX: do not validate uploads when running `uploads:fix_missing_s3` task
This commit is contained in:
Arpit Jalan 2021-05-19 20:54:52 +05:30 committed by GitHub
parent 075cd07a07
commit 130160537c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 3 deletions

View File

@ -1024,7 +1024,7 @@ def fix_missing_s3
Upload.transaction do Upload.transaction do
begin begin
upload.update_column(:sha1, SecureRandom.hex) upload.update_column(:sha1, SecureRandom.hex)
fixed_upload = UploadCreator.new(tempfile, "temp.#{upload.extension}").create_for(Discourse.system_user.id) fixed_upload = UploadCreator.new(tempfile, "temp.#{upload.extension}", skip_validations: true).create_for(Discourse.system_user.id)
rescue => fix_error rescue => fix_error
# invalid extension is the most common issue # invalid extension is the most common issue
end end

View File

@ -24,11 +24,13 @@ class UploadCreator
# - pasted (boolean) # - pasted (boolean)
# - for_export (boolean) # - for_export (boolean)
# - for_gravatar (boolean) # - for_gravatar (boolean)
# - skip_validations (boolean)
def initialize(file, filename, opts = {}) def initialize(file, filename, opts = {})
@file = file @file = file
@filename = (filename || "").gsub(/[^[:print:]]/, "") @filename = (filename || "").gsub(/[^[:print:]]/, "")
@upload = Upload.new(original_filename: @filename, filesize: 0) @upload = Upload.new(original_filename: @filename, filesize: 0)
@opts = opts @opts = opts
@opts[:validate] = opts[:skip_validations].present? ? !ActiveRecord::Type::Boolean.new.cast(opts[:skip_validations]) : true
end end
def create_for(user_id) def create_for(user_id)
@ -151,7 +153,7 @@ class UploadCreator
@upload.assign_attributes(attrs) @upload.assign_attributes(attrs)
end end
return @upload unless @upload.save return @upload unless @upload.save(validate: @opts[:validate])
DiscourseEvent.trigger(:before_upload_creation, @file, is_image, @opts[:for_export]) DiscourseEvent.trigger(:before_upload_creation, @file, is_image, @opts[:for_export])
@ -161,7 +163,7 @@ class UploadCreator
if url.present? if url.present?
@upload.url = url @upload.url = url
@upload.save! @upload.save!(validate: @opts[:validate])
else else
@upload.errors.add(:url, I18n.t("upload.store_failure", upload_id: @upload.id, user_id: user_id)) @upload.errors.add(:url, I18n.t("upload.store_failure", upload_id: @upload.id, user_id: user_id))
end end

View File

@ -504,6 +504,32 @@ RSpec.describe UploadCreator do
expect(FastImage.size(Discourse.store.path_for(upload))).to eq([320, 320]) expect(FastImage.size(Discourse.store.path_for(upload))).to eq([320, 320])
end end
end end
describe 'skip validations' do
let(:filename) { "small.pdf" }
let(:file) { file_from_fixtures(filename, "pdf") }
before do
SiteSetting.authorized_extensions = 'png|jpg'
end
it 'creates upload when skip_validations is true' do
upload = UploadCreator.new(file, filename,
skip_validations: true
).create_for(user.id)
expect(upload.persisted?).to eq(true)
expect(upload.original_filename).to eq(filename)
end
it 'does not create upload when skip_validations is false' do
upload = UploadCreator.new(file, filename,
skip_validations: false
).create_for(user.id)
expect(upload.persisted?).to eq(false)
end
end
end end
describe '#clean_svg!' do describe '#clean_svg!' do