Class: Asset

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/asset.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.approved_content_typesObject



38
39
40
# File 'app/models/asset.rb', line 38

def self.approved_content_types
  AssetType.known_mimetypes
end

.count_with_asset_types(asset_types, *args) ⇒ Object



319
320
321
# File 'app/models/asset.rb', line 319

def count_with_asset_types(asset_types, *args)
  with_asset_types(asset_types) { where(*args).count }
end

.define_class_method(name, &block) ⇒ Object

called from AssetType to set type_condition? methods on Asset



330
331
332
# File 'app/models/asset.rb', line 330

def self.define_class_method(name, &block)
  eigenclass.send :define_method, name, &block
end

.describe_style(style) ⇒ Object

Renders a style definition into a short human-readable description for a picker. ActiveStorage styles are hashes (e.g. '100x100#', format: :png); older definitions may be arrays or plain strings.



366
367
368
369
370
371
372
373
374
375
# File 'app/models/asset.rb', line 366

def self.describe_style(style)
  case style
  when Hash
    [style[:geometry], style[:format]].compact.join(' as ')
  when Array
    style.join(' as ')
  else
    style.to_s
  end
end

.eigenclassObject

returns the return value of class << self block, which is self (as defined within that block)



335
336
337
338
339
# File 'app/models/asset.rb', line 335

def self.eigenclass
  class << self
    self;
  end
end

.find_all_by_asset_types(asset_types, *args) ⇒ Object

searching and pagination moved to the controller



315
316
317
# File 'app/models/asset.rb', line 315

def find_all_by_asset_types(asset_types, *args)
  with_asset_types(asset_types) { where *args }
end

.known_typesObject



309
310
311
# File 'app/models/asset.rb', line 309

def known_types
  AssetType.known_types
end

.ransackable_attributes(auth_object = nil) ⇒ Object



123
124
125
# File 'app/models/asset.rb', line 123

def self.ransackable_attributes(auth_object = nil)
  %w[asset_content_type asset_file_name asset_file_size caption created_at created_by_id id original_extension original_height original_width title updated_at updated_by_id uuid]
end

.thumbnail_namesObject



346
347
348
# File 'app/models/asset.rb', line 346

def self.thumbnail_names
  thumbnail_sizes.keys
end

.thumbnail_optionsObject

this is a convenience for image-pickers



351
352
353
354
355
356
357
358
359
360
361
# File 'app/models/asset.rb', line 351

def self.thumbnail_options
  # The :original style is represented by the explicit entry prepended below,
  # so skip it here to avoid a duplicate (and blank) "original" option.
  asset_sizes = thumbnail_sizes.reject { |k, _| k.to_sym == :original }.map do |k, v|
    size_id = k
    size_description = "#{k}: #{describe_style(v)}"
    [size_description, size_id]
  end.sort_by { |pair| pair.last.to_s }
  asset_sizes.unshift ['Original (as uploaded)', 'original']
  asset_sizes
end

.thumbnail_sizesObject

for backwards compatibility



342
343
344
# File 'app/models/asset.rb', line 342

def self.thumbnail_sizes
  AssetType.find(:image).active_storage_styles
end

.with_asset_types(asset_types, &block) ⇒ Object



323
324
325
326
# File 'app/models/asset.rb', line 323

def with_asset_types(asset_types, &block)
  w_asset_types = AssetType.conditions_for(asset_types)
  with_scope(where(conditions: ["#{w_asset_types} = ?", block]))
end

Instance Method Details

#active_storage_stylesObject



86
87
88
# File 'app/models/asset.rb', line 86

def active_storage_styles
  asset_type&.active_storage_styles || {}
end

#aspect(style_name = 'original') ⇒ Object



198
199
200
# File 'app/models/asset.rb', line 198

def aspect(style_name = 'original')
  geometry(style_name).aspect
end

#asset_typeObject



64
65
66
# File 'app/models/asset.rb', line 64

def asset_type
  AssetType.for(asset)
end

#asset_variant(style_name) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
145
# File 'app/models/asset.rb', line 134

def asset_variant(style_name)
  style = active_storage_styles[style_name.to_sym]
  return unless style

  transformations = active_storage_transformations(style[:geometry])
  transformations[:format] = style[:format] if style[:format]
  if asset.variable?
    asset.variant(transformations)
  elsif asset.previewable?
    asset.preview(transformations)
  end
end

#asset_within_configured_sizeObject



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/models/asset.rb', line 50

def asset_within_configured_size
  limit_mb =
    if video_content_type?
      TrustyCms.config['assets.max_video_size'].to_i
    else
      TrustyCms.config['assets.max_asset_size'].to_i
    end

  limit_bytes = limit_mb.megabytes
  return if asset.blob.byte_size.between?(1, limit_bytes)

  errors.add(:asset, :wrong_size_error, limit_mb: limit_mb)
end

#attached_to?(page) ⇒ Boolean

Returns:

  • (Boolean)


169
170
171
# File 'app/models/asset.rb', line 169

def attached_to?(page)
  pages.include?(page)
end

#basenameObject



151
152
153
# File 'app/models/asset.rb', line 151

def basename
  File.basename(filename, '.*') if filename
end

#byte_sizeObject



80
81
82
83
84
# File 'app/models/asset.rb', line 80

def byte_size
  return asset.blob.byte_size if asset.attached?

  self[:asset_file_size]
end

#content_typeObject



74
75
76
77
78
# File 'app/models/asset.rb', line 74

def content_type
  return asset.content_type if asset.attached?

  self[:asset_content_type]
end

#dimensions_known?Boolean

Returns:

  • (Boolean)


235
236
237
# File 'app/models/asset.rb', line 235

def dimensions_known?
  original_dimensions.all?(&:positive?)
end

#extension(style_name = 'original') ⇒ Object



155
156
157
158
159
160
161
162
163
# File 'app/models/asset.rb', line 155

def extension(style_name = 'original')
  if style_name == 'original'
    original_extension
  elsif style = active_storage_styles[style_name.to_sym]
    style[:format]
  else
    original_extension
  end
end

#filenameObject



68
69
70
71
72
# File 'app/models/asset.rb', line 68

def filename
  return asset.filename.to_s if asset.attached?

  self[:asset_file_name]
end

#geometry(style_name = 'original') ⇒ Object



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'app/models/asset.rb', line 177

def geometry(style_name = 'original')
  unless style?(style_name)
    raise TrustyCms::StyleError,
          "Requested style #{style_name} is not defined for this asset."
  end

  @geometry ||= {}
  begin
    @geometry[style_name] ||= if style_name.to_s == 'original'
                                original_geometry
                              else
                                style = active_storage_styles[style_name.to_sym]
                                original_geometry.transformed_by(style[:geometry])
                                # this can return dimensions for fully specified style sizes but not for relative sizes when there are no original dimensions
                              end
  rescue TrustyCms::TransformationError => e
    Rails.logger.warn "geometry transformation error: #{e}"
    original_geometry # returns a blank geometry if the real geometry cannot be calculated
  end
end

#height(style_name = 'original') ⇒ Object



219
220
221
# File 'app/models/asset.rb', line 219

def height(style_name = 'original')
  geometry(style_name).height.to_i
end

#horizontal?(style_name = 'original') ⇒ Boolean

Returns:

  • (Boolean)


231
232
233
# File 'app/models/asset.rb', line 231

def horizontal?(style_name = 'original')
  geometry(style_name).horizontal?
end

#orientation(style_name = 'original') ⇒ Object



202
203
204
205
206
207
208
209
210
211
212
213
# File 'app/models/asset.rb', line 202

def orientation(style_name = 'original')
  a = aspect(style_name)
  if a == nil?
    'unknown'
  elsif a < 1.0
    'vertical'
  elsif a > 1.0
    'horizontal'
  else
    'square'
  end
end

#original_extensionObject



165
166
167
# File 'app/models/asset.rb', line 165

def original_extension
  return filename.split('.').last.downcase if filename
end

#original_geometryObject



173
174
175
# File 'app/models/asset.rb', line 173

def original_geometry
  @original_geometry ||= TrustyCms::Geometry.new(*original_dimensions)
end

#pdf?Boolean

Returns:

  • (Boolean)


98
99
100
# File 'app/models/asset.rb', line 98

def pdf?
  content_type == 'application/pdf'
end

#public_url(style_name = 'normal') ⇒ Object



112
113
114
115
116
117
118
119
120
121
# File 'app/models/asset.rb', line 112

def public_url(style_name = 'normal')
  if style_name.to_s == 'original' || render_original(style_name)
    return rewrite_cloud_url(asset.url)
  end

  variant = asset_variant(style_name.to_s)
  return rewrite_cloud_url(variant.processed.url) if variant

  rewrite_cloud_url(asset.url)
end

#render_original(_style_name) ⇒ Object



127
128
129
130
131
132
# File 'app/models/asset.rb', line 127

def render_original(_style_name)
  return false unless asset.attached?

  prefix = TrustyCms::Config['assets.storage.prefix'].presence
  prefix ? asset.key.start_with?(prefix) : asset.key.include?('/')
end

#square?(style_name = 'original') ⇒ Boolean

Returns:

  • (Boolean)


223
224
225
# File 'app/models/asset.rb', line 223

def square?(style_name = 'original')
  geometry(style_name).square?
end

#style?(style_name = 'original') ⇒ Boolean

Returns:

  • (Boolean)


147
148
149
# File 'app/models/asset.rb', line 147

def style?(style_name = 'original')
  style_name == 'original' || active_storage_styles.keys.include?(style_name.to_sym)
end

#style_dimensions(style_name) ⇒ Object



90
91
92
# File 'app/models/asset.rb', line 90

def style_dimensions(style_name)
  asset_type&.style_dimensions(style_name)
end

#style_format(style_name) ⇒ Object



94
95
96
# File 'app/models/asset.rb', line 94

def style_format(style_name)
  asset_type&.style_format(style_name)
end

#thumbnail(style_name = 'normal') ⇒ Object



102
103
104
105
106
107
108
109
110
# File 'app/models/asset.rb', line 102

def thumbnail(style_name = 'normal')
  if asset.attached? && pdf?
    return style_name.to_s == 'thumbnail' ? asset_type.icon('thumbnail') : rewrite_cloud_url(asset.url)
  end

  variant = asset_variant(style_name.to_s)
  return rewrite_cloud_url(variant.processed.url) if variant
  asset_type.icon(style_name.to_s)
end

#vertical?(style_name = 'original') ⇒ Boolean

Returns:

  • (Boolean)


227
228
229
# File 'app/models/asset.rb', line 227

def vertical?(style_name = 'original')
  geometry(style_name).vertical?
end

#width(style_name = 'original') ⇒ Object



215
216
217
# File 'app/models/asset.rb', line 215

def width(style_name = 'original')
  geometry(style_name).width.to_i
end