mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
77 lines
3.0 KiB
Ruby
77 lines
3.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Spree
|
|
class Image < Asset
|
|
validates_attachment_presence :attachment
|
|
validate :no_attachment_errors
|
|
|
|
has_attached_file :attachment,
|
|
styles: { mini: '48x48>', small: '100x100>',
|
|
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 RGB' }
|
|
|
|
# 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
|
|
|
|
Spree::Image.attachment_definitions[:attachment][:styles] =
|
|
ActiveSupport::JSON.decode(Spree::Config[:attachment_styles]).symbolize_keys!
|
|
Spree::Image.attachment_definitions[:attachment][:path] = Spree::Config[:attachment_path]
|
|
Spree::Image.attachment_definitions[:attachment][:url] = Spree::Config[:attachment_url]
|
|
Spree::Image.attachment_definitions[:attachment][:default_url] =
|
|
Spree::Config[:attachment_default_url]
|
|
Spree::Image.attachment_definitions[:attachment][:default_style] =
|
|
Spree::Config[:attachment_default_style]
|
|
|
|
# used by admin products autocomplete
|
|
def mini_url
|
|
attachment.url(:mini, false)
|
|
end
|
|
|
|
def find_dimensions
|
|
temporary = attachment.queued_for_write[:original]
|
|
filename = temporary.path unless temporary.nil?
|
|
filename = attachment.path if filename.blank?
|
|
geometry = Paperclip::Geometry.from_file(filename)
|
|
self.attachment_width = geometry.width
|
|
self.attachment_height = geometry.height
|
|
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
|
|
|
|
# Spree stores attachent definitions in JSON. This converts the style name and format to
|
|
# strings. However, when paperclip encounters these, it doesn't recognise the format.
|
|
# Here we solve that problem by converting format and style name to symbols.
|
|
# See also: ImageSettingsController decorator.
|
|
#
|
|
# eg. {'mini' => ['48x48>', 'png']} is converted to {mini: ['48x48>', :png]}
|
|
def self.format_styles(styles)
|
|
styles_a = styles.map do |name, style|
|
|
style[1] = style[1].to_sym if style.is_a? Array
|
|
[name.to_sym, style]
|
|
end
|
|
|
|
Hash[styles_a]
|
|
end
|
|
|
|
def self.reformat_styles
|
|
Spree::Image.attachment_definitions[:attachment][:styles] =
|
|
format_styles(Spree::Image.attachment_definitions[:attachment][:styles])
|
|
end
|
|
|
|
reformat_styles
|
|
end
|
|
end
|