mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 07:53:49 +08:00
FEATURE: Pull hotlinked images immediately after posting
Previously, with the default `editing_grace_period`, hotlinked images were pulled 5 minutes after a post is created. This delay was added to reduce the chance of automated edits clashing with user edits. This commit refactors things so that we can pull hotlinked images immediately. URLs are immediately updated in the post's `cooked` HTML. The post's raw markdown is updated later, after the `editing_grace_period`. This involves a number of behind-the-scenes changes including: - Schedule Jobs::PullHotlinkedImages immediately after Jobs::ProcessPost. Move scheduling to after the `update_column` call to avoid race conditions - Move raw changes into a separate job, which is delayed until after the ninja-edit window - Move disable_if_low_on_disk_space logic into the `pull_hotlinked_images` job - Move raw-parsing/replacing logic into `InlineUpload` so it can be easily be shared between `UpdateHotlinkedRaw` and `PullUserProfileHotlinkedImages`
This commit is contained in:
@ -47,7 +47,6 @@ class CookedPostProcessor
|
||||
remove_user_ids
|
||||
update_post_image
|
||||
enforce_nofollow
|
||||
pull_hotlinked_images
|
||||
grant_badges
|
||||
@post.link_post_uploads(fragments: @doc)
|
||||
DiscourseEvent.trigger(:post_process_cooked, @doc, @post)
|
||||
@ -361,41 +360,6 @@ class CookedPostProcessor
|
||||
PrettyText.add_rel_attributes_to_user_content(@doc, add_nofollow)
|
||||
end
|
||||
|
||||
def pull_hotlinked_images
|
||||
return if @opts[:skip_pull_hotlinked_images]
|
||||
# have we enough disk space?
|
||||
disable_if_low_on_disk_space # But still enqueue the job
|
||||
# make sure no other job is scheduled
|
||||
Jobs.cancel_scheduled_job(:pull_hotlinked_images, post_id: @post.id)
|
||||
# schedule the job
|
||||
delay = SiteSetting.editing_grace_period + 1
|
||||
Jobs.enqueue_in(delay.seconds.to_i, :pull_hotlinked_images, post_id: @post.id)
|
||||
end
|
||||
|
||||
def disable_if_low_on_disk_space
|
||||
return if Discourse.store.external?
|
||||
return if !SiteSetting.download_remote_images_to_local
|
||||
return if available_disk_space >= SiteSetting.download_remote_images_threshold
|
||||
|
||||
SiteSetting.download_remote_images_to_local = false
|
||||
|
||||
# log the site setting change
|
||||
reason = I18n.t("disable_remote_images_download_reason")
|
||||
staff_action_logger = StaffActionLogger.new(Discourse.system_user)
|
||||
staff_action_logger.log_site_setting_change("download_remote_images_to_local", true, false, details: reason)
|
||||
|
||||
# also send a private message to the site contact user notify_about_low_disk_space
|
||||
notify_about_low_disk_space
|
||||
end
|
||||
|
||||
def notify_about_low_disk_space
|
||||
SystemMessage.create_from_system_user(Discourse.site_contact_user, :download_remote_images_disabled)
|
||||
end
|
||||
|
||||
def available_disk_space
|
||||
100 - DiskSpace.percent_free("#{Rails.root}/public/uploads")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def post_process_images
|
||||
|
Reference in New Issue
Block a user