Lock the post during replacement to ensure we have the latest version of the tags and to ensure nobody else can modify the post until after the replacement is finished.
50 lines
1.3 KiB
Ruby
50 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class PostReplacement < ApplicationRecord
|
|
belongs_to :post
|
|
belongs_to :creator, class_name: "User"
|
|
|
|
before_validation :initialize_fields, on: :create
|
|
before_create :process!
|
|
|
|
attr_accessor :replacement_file, :final_source, :tags
|
|
attribute :replacement_url, default: ""
|
|
|
|
def initialize_fields
|
|
self.original_url = post.source
|
|
self.old_file_ext = post.file_ext
|
|
self.old_file_size = post.file_size
|
|
self.old_image_width = post.image_width
|
|
self.old_image_height = post.image_height
|
|
self.old_md5 = post.md5
|
|
end
|
|
|
|
concerning :Search do
|
|
class_methods do
|
|
def search(params = {})
|
|
q = search_attributes(params, :id, :created_at, :updated_at, :md5, :old_md5, :file_ext, :old_file_ext, :original_url, :replacement_url, :creator, :post)
|
|
q.apply_default_order(params)
|
|
end
|
|
end
|
|
end
|
|
|
|
def process!
|
|
PostReplacementProcessor.new(post: post, replacement: self).process!
|
|
end
|
|
|
|
def suggested_tags_for_removal
|
|
tags = post.tag_array.select do |tag|
|
|
Danbooru.config.post_replacement_tag_removals.any? do |pattern|
|
|
tag.match?(/\A#{pattern}\z/i)
|
|
end
|
|
end
|
|
|
|
tags = tags.map { |tag| "-#{tag}" }
|
|
tags.join(" ")
|
|
end
|
|
|
|
def self.available_includes
|
|
[:creator, :post]
|
|
end
|
|
end
|