Class: Alchemy::Picture
- Inherits:
 - 
      BaseRecord
      
        
- Object
 - ActiveRecord::Base
 - BaseRecord
 - Alchemy::Picture
 
 
- Includes:
 - Logger, NameConversions, Calculations, Taggable, TouchElements
 
- Defined in:
 - app/models/alchemy/picture.rb,
app/models/alchemy/picture/url.rb,
app/models/alchemy/picture/calculations.rb,
app/models/alchemy/picture/preprocessor.rb 
Defined Under Namespace
Modules: Calculations, Transformations Classes: Preprocessor, Url
Constant Summary collapse
- THUMBNAIL_SIZES =
 { small: "80x60", medium: "160x120", large: "240x180" }.with_indifferent_access.freeze
- CONVERTIBLE_FILE_FORMATS =
 %w[gif jpg jpeg png webp].freeze
- TRANSFORMATION_OPTIONS =
 [ :crop, :crop_from, :crop_size, :flatten, :format, :quality, :size, :upsample ]
Constants included from SearchableResource
SearchableResource::SEARCHABLE_COLUMN_TYPES
Class Method Summary collapse
- .alchemy_resource_filters ⇒ Object
 - .allowed_filetypes ⇒ Object
 - .last_upload ⇒ Object
 - 
  
    
      .preprocessor_class  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Image preprocessing class.
 - 
  
    
      .preprocessor_class=(klass)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Set a image preprocessing class.
 - .searchable_alchemy_resource_attributes ⇒ Object
 - 
  
    
      .url_class  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
The class used to generate URLs for pictures.
 - 
  
    
      .url_class=(klass)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Set a different picture url class.
 
Instance Method Summary collapse
- 
  
    
      #convertible?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
Returns true if the image can be converted.
 - 
  
    
      #default_render_format  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Returns the format the image should be rendered with.
 - 
  
    
      #deletable?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
Returns true if picture is not assigned to any Picture ingredient.
 - 
  
    
      #description_for(language)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Returns the picture description for a given language.
 - 
  
    
      #has_convertible_format?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
Returns true if the image can be converted into other formats.
 - 
  
    
      #humanized_name  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Returns a humanized, readable name from image filename.
 - 
  
    
      #image_file_dimensions  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
A size String from original image file values.
 - 
  
    
      #restricted?  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
Checks if the picture is restricted.
 - 
  
    
      #suffix  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Returns the suffix of the filename.
 - 
  
    
      #thumbnail_url(size: "160x120")  ⇒ String 
    
    
  
  
  
  
  
  
  
  
  
    
Returns an url for the thumbnail representation of the picture.
 - 
  
    
      #update_name_and_tag_list!(params)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Updates name and tag_list attributes.
 - 
  
    
      #url(options = {})  ⇒ String|Nil 
    
    
  
  
  
  
  
  
  
  
  
    
Returns an url (or relative path) to a processed image for use inside an image_tag helper.
 - 
  
    
      #urlname  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Returns an uri escaped name.
 
Methods included from Calculations
#can_be_cropped_to?, #image_size, #is_bigger_than?, #is_smaller_than?, #sizes_from_string
Methods included from TouchElements
Methods included from Taggable
Methods included from NameConversions
#convert_to_humanized_name, #convert_to_urlname
Methods included from Logger
Methods included from SearchableResource
#ransackable_associations, #ransackable_attributes, #ransortable_attributes
Class Method Details
.alchemy_resource_filters ⇒ Object
      143 144 145 146 147 148 149 150 151 152 153 154 155  | 
    
      # File 'app/models/alchemy/picture.rb', line 143 def alchemy_resource_filters @_file_formats ||= distinct.pluck(:image_file_format).compact.presence || [] [ { name: :by_file_format, values: @_file_formats }, { name: :misc, values: %w[recent last_upload without_tag deletable] } ] end  | 
  
.allowed_filetypes ⇒ Object
      102 103 104  | 
    
      # File 'app/models/alchemy/picture.rb', line 102 def allowed_filetypes Config.get(:uploader).fetch("allowed_filetypes", {}).fetch("alchemy/pictures", []) end  | 
  
.last_upload ⇒ Object
      161 162 163 164 165 166  | 
    
      # File 'app/models/alchemy/picture.rb', line 161 def last_upload last_picture = Picture.last return Picture.all unless last_picture Picture.where(upload_hash: last_picture.upload_hash) end  | 
  
.preprocessor_class ⇒ Object
Image preprocessing class
      74 75 76  | 
    
      # File 'app/models/alchemy/picture.rb', line 74 def self.preprocessor_class @_preprocessor_class ||= Preprocessor end  | 
  
.preprocessor_class=(klass) ⇒ Object
Set a image preprocessing class
# config/initializers/alchemy.rb
Alchemy::Picture.preprocessor_class = My::ImagePreprocessor
  
      83 84 85  | 
    
      # File 'app/models/alchemy/picture.rb', line 83 def self.preprocessor_class=(klass) @_preprocessor_class = klass end  | 
  
.searchable_alchemy_resource_attributes ⇒ Object
      157 158 159  | 
    
      # File 'app/models/alchemy/picture.rb', line 157 def searchable_alchemy_resource_attributes %w[name image_file_name] end  | 
  
.url_class ⇒ Object
The class used to generate URLs for pictures
      132 133 134  | 
    
      # File 'app/models/alchemy/picture.rb', line 132 def url_class @_url_class ||= Alchemy::Picture::Url end  | 
  
.url_class=(klass) ⇒ Object
Set a different picture url class
      139 140 141  | 
    
      # File 'app/models/alchemy/picture.rb', line 139 def url_class=(klass) @_url_class = klass end  | 
  
Instance Method Details
#convertible? ⇒ Boolean
Returns true if the image can be converted
If the image_output_format is set to nil or original or the image has not a convertible file format (i.e. SVG) this returns false
      274 275 276 277 278  | 
    
      # File 'app/models/alchemy/picture.rb', line 274 def convertible? Config.get(:image_output_format) && Config.get(:image_output_format) != "original" && has_convertible_format? end  | 
  
#default_render_format ⇒ Object
Returns the format the image should be rendered with
Only returns a format differing from original if an image_output_format is set in config and the image has a convertible file format.
      261 262 263 264 265 266 267  | 
    
      # File 'app/models/alchemy/picture.rb', line 261 def default_render_format if convertible? Config.get(:image_output_format) else image_file_format end end  | 
  
#deletable? ⇒ Boolean
Returns true if picture is not assigned to any Picture ingredient.
      300 301 302  | 
    
      # File 'app/models/alchemy/picture.rb', line 300 def deletable? picture_ingredients.empty? end  | 
  
#description_for(language) ⇒ Object
Returns the picture description for a given language.
      228 229 230  | 
    
      # File 'app/models/alchemy/picture.rb', line 228 def description_for(language) descriptions.find_by(language: language)&.text end  | 
  
#has_convertible_format? ⇒ Boolean
Returns true if the image can be converted into other formats
      282 283 284  | 
    
      # File 'app/models/alchemy/picture.rb', line 282 def has_convertible_format? image_file_format.in?(CONVERTIBLE_FILE_FORMATS) end  | 
  
#humanized_name ⇒ Object
Returns a humanized, readable name from image filename.
      250 251 252 253 254  | 
    
      # File 'app/models/alchemy/picture.rb', line 250 def humanized_name return "" if image_file_name.blank? convert_to_humanized_name(image_file_name, suffix) end  | 
  
#image_file_dimensions ⇒ Object
A size String from original image file values.
Example
200 x 100
      310 311 312  | 
    
      # File 'app/models/alchemy/picture.rb', line 310 def image_file_dimensions "#{image_file_width}x#{image_file_height}" end  | 
  
#restricted? ⇒ Boolean
Checks if the picture is restricted.
A picture is only restricted if it’s assigned on restricted pages only.
Once a picture is assigned on a not restricted page, it is considered public and therefore not restricted any more, even if it is also assigned on a restricted page.
      294 295 296  | 
    
      # File 'app/models/alchemy/picture.rb', line 294 def restricted? pages.any? && pages.not_restricted.blank? end  | 
  
#suffix ⇒ Object
Returns the suffix of the filename.
      244 245 246  | 
    
      # File 'app/models/alchemy/picture.rb', line 244 def suffix image_file.ext end  | 
  
#thumbnail_url(size: "160x120") ⇒ String
Returns an url for the thumbnail representation of the picture
      203 204 205 206 207 208 209 210 211  | 
    
      # File 'app/models/alchemy/picture.rb', line 203 def thumbnail_url(size: "160x120") return if image_file.nil? url( flatten: true, format: image_file_format || "jpg", size: size ) end  | 
  
#update_name_and_tag_list!(params) ⇒ Object
Updates name and tag_list attributes.
Used by Admin::PicturesController#update_multiple
Note: Does not delete name value, if the form field is blank.
      219 220 221 222 223 224 225  | 
    
      # File 'app/models/alchemy/picture.rb', line 219 def update_name_and_tag_list!(params) if params[:pictures_name].present? self.name = params[:pictures_name] end self.tag_list = params[:pictures_tag_list] save! end  | 
  
#url(options = {}) ⇒ String|Nil
Returns an url (or relative path) to a processed image for use inside an image_tag helper.
Any additional options are passed to the url method, so you can add params to your url.
Example:
<%= image_tag picture.url(size: '320x200', format: 'png') %>
  
      182 183 184 185 186 187 188 189 190 191 192 193 194 195 196  | 
    
      # File 'app/models/alchemy/picture.rb', line 182 def url( = {}) return unless image_file variant = PictureVariant.new(self, .slice(*TRANSFORMATION_OPTIONS)) self.class.url_class.new(variant).call( .except(*TRANSFORMATION_OPTIONS).merge( basename: name, ext: variant.render_format, name: name ) ) rescue ::Dragonfly::Job::Fetch::NotFound => e log_warning(e.) nil end  | 
  
#urlname ⇒ Object
Returns an uri escaped name.
      234 235 236 237 238 239 240  | 
    
      # File 'app/models/alchemy/picture.rb', line 234 def urlname if name.blank? "image_#{id}" else ::CGI.escape(name.gsub(/\.(gif|png|jpe?g|tiff?)/i, "").tr(".", " ")) end end  |