mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
97 lines
3.4 KiB
Ruby
97 lines
3.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spree/core/s3_support'
|
|
|
|
module Spree
|
|
class Image < Asset
|
|
validates_attachment_presence :attachment
|
|
validate :no_attachment_errors
|
|
|
|
# This is where the styles are used in the app:
|
|
# - mini: used in the BackOffice: Bulk Product Edit page and Order Cycle edit page
|
|
# - small: used in the FrontOffice: Product List page
|
|
# - product: used in the BackOffice: Product Image upload modal in the Bulk Product Edit page
|
|
# and Product image edit page
|
|
# - large: used in the FrontOffice: product modal
|
|
has_attached_file :attachment,
|
|
styles: { mini: "48x48#", small: "227x227#",
|
|
product: "240x240>", large: "600x600>" },
|
|
default_style: :product,
|
|
url: '/spree/products/:id/:style/:basename.:extension',
|
|
path: ':rails_root/public/spree/products/:id/:style/:basename.:extension',
|
|
convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
|
|
|
|
# save the w,h of the original image (from which others can be calculated)
|
|
# we need to look at the write-queue for images which have not been saved yet
|
|
after_post_process :find_dimensions
|
|
|
|
include Spree::Core::S3Support
|
|
supports_s3 :attachment
|
|
|
|
# used by admin products autocomplete
|
|
def mini_url
|
|
attachment.url(:mini, false)
|
|
end
|
|
|
|
def find_dimensions
|
|
return if attachment.errors.present?
|
|
|
|
geometry = Paperclip::Geometry.from_file(local_filename_of_original)
|
|
|
|
self.attachment_width = geometry.width
|
|
self.attachment_height = geometry.height
|
|
end
|
|
|
|
def local_filename_of_original
|
|
temporary = attachment.queued_for_write[:original]
|
|
|
|
if temporary&.path.present?
|
|
temporary.path
|
|
else
|
|
attachment.path
|
|
end
|
|
end
|
|
|
|
# if there are errors from the plugin, then add a more meaningful message
|
|
def no_attachment_errors
|
|
return if attachment.errors.empty?
|
|
|
|
errors.add :attachment,
|
|
"Paperclip returned errors for file '#{attachment_file_name}' - check ImageMagick installation or image source file."
|
|
false
|
|
end
|
|
|
|
def self.set_attachment_attribute(attribute_name, attribute_value)
|
|
attachment_definitions[:attachment][attribute_name] = attribute_value
|
|
end
|
|
|
|
def self.set_storage_attachment_attributes
|
|
if Spree::Config[:use_s3]
|
|
set_s3_attachment_attributes
|
|
else
|
|
attachment_definitions[:attachment].delete(:storage)
|
|
end
|
|
end
|
|
|
|
def self.set_s3_attachment_attributes
|
|
set_attachment_attribute(:storage, :s3)
|
|
set_attachment_attribute(:s3_credentials, s3_credentials)
|
|
set_attachment_attribute(:s3_headers,
|
|
ActiveSupport::JSON.decode(Spree::Config[:s3_headers]))
|
|
set_attachment_attribute(:bucket, Spree::Config[:s3_bucket])
|
|
|
|
# We use :s3_alias_url (virtual host url style) and set the URL on property s3_host_alias
|
|
set_attachment_attribute(:s3_host_alias, attachment_definitions[:attachment][:url])
|
|
set_attachment_attribute(:url, ":s3_alias_url")
|
|
end
|
|
private_class_method :set_s3_attachment_attributes
|
|
|
|
def self.s3_credentials
|
|
{ access_key_id: Spree::Config[:s3_access_key],
|
|
secret_access_key: Spree::Config[:s3_secret],
|
|
bucket: Spree::Config[:s3_bucket] }
|
|
end
|
|
private_class_method :s3_credentials
|
|
end
|
|
end
|