DEV: Improve uploads_importer script (#25971)

* Print instructions when the `sqlite3` gem can't be loaded
* Use `display_filename` instead of `filename` if available
* Support uploading for a multisite
This commit is contained in:
Gerhard Schlager 2024-03-05 16:27:45 +01:00 committed by GitHub
parent ccf0b61fe3
commit 38ff1a38bd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 51 additions and 7 deletions

View File

@ -3,9 +3,22 @@ puts "Loading application..."
require_relative "../../config/environment"
require "etc"
require "sqlite3"
require "colored2"
begin
require "sqlite3"
rescue LoadError
STDERR.puts "",
"ERROR: Failed to load required gems.",
"",
"You need to enable the `generic_import` group in your Gemfile.",
"Execute the following command to do so:",
"",
"\tbundle config set --local with generic_import && bundle install",
""
exit 1
end
module BulkImport
class UploadsImporter
TRANSACTION_SIZE = 1000
@ -183,9 +196,11 @@ module BulkImport
upload =
copy_to_tempfile(path) do |file|
begin
UploadCreator.new(file, row["filename"], type: row["type"]).create_for(
Discourse::SYSTEM_USER_ID,
)
UploadCreator.new(
file,
row["display_filename"] || row["filename"],
type: row["type"],
).create_for(Discourse::SYSTEM_USER_ID)
rescue StandardError => e
error_message = e.message
nil
@ -193,7 +208,7 @@ module BulkImport
end
if (upload_okay = upload.present? && upload.persisted? && upload.errors.blank?)
upload_path = store.get_path_for_upload(upload)
upload_path = add_multisite_prefix(store.get_path_for_upload(upload))
file_exists =
if store.external?
@ -313,7 +328,7 @@ module BulkImport
begin
upload = JSON.parse(row["upload"])
fake_upload.url = upload["url"]
path = store.get_path_for_upload(fake_upload)
path = add_multisite_prefix(store.get_path_for_upload(fake_upload))
file_exists =
if store.external?
@ -504,7 +519,8 @@ module BulkImport
if optimized_images.present?
optimized_images.map! do |optimized_image|
next unless optimized_image.present?
optimized_image_path = store.get_path_for_optimized_image(optimized_image)
optimized_image_path =
add_multisite_prefix(store.get_path_for_optimized_image(optimized_image))
file_exists =
if store.external?
@ -627,6 +643,22 @@ module BulkImport
SiteSetting.max_attachment_size_kb = settings[:max_attachment_size_kb]
SiteSetting.max_image_size_kb = settings[:max_image_size_kb]
if settings[:multisite]
# rubocop:disable Discourse/NoDirectMultisiteManipulation
Rails.configuration.multisite = true
# rubocop:enable Discourse/NoDirectMultisiteManipulation
RailsMultisite::ConnectionManagement.class_eval do
def self.current_db_override=(value)
@current_db_override = value
end
def self.current_db
@current_db_override
end
end
RailsMultisite::ConnectionManagement.current_db_override = settings[:multisite_db_name]
end
if settings[:enable_s3_uploads]
SiteSetting.s3_access_key_id = settings[:s3_access_key_id]
SiteSetting.s3_secret_access_key = settings[:s3_secret_access_key]
@ -655,6 +687,14 @@ module BulkImport
end
end
end
def add_multisite_prefix(path)
if Rails.configuration.multisite
File.join("uploads", RailsMultisite::ConnectionManagement.current_db, path)
else
path
end
end
end
end

View File

@ -35,6 +35,10 @@ site_settings:
s3_secret_access_key: "your-secret-access-key"
s3_cdn_url: "https://your-cdn-url.com"
# Set this to true if the site is a multisite and configure the `multisite_db_name` accordingly
multisite: false
multisite_db_name: "default"
# Sometimes a file can be found at one of many locations. Here's a list of transformations that can
# be applied to the path to try and find the file. The first transformation that results in a file
# being found will be used.