Class: Asset
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Asset
- Defined in:
- app/models/asset.rb
Class Method Summary collapse
- .approved_content_types ⇒ Object
- .count_with_asset_types(asset_types, *args) ⇒ Object
-
.define_class_method(name, &block) ⇒ Object
called from AssetType to set type_condition? methods on Asset.
-
.describe_style(style) ⇒ Object
Renders a style definition into a short human-readable description for a picker.
-
.eigenclass ⇒ Object
returns the return value of class << self block, which is self (as defined within that block).
-
.find_all_by_asset_types(asset_types, *args) ⇒ Object
searching and pagination moved to the controller.
- .known_types ⇒ Object
- .ransackable_attributes(auth_object = nil) ⇒ Object
- .thumbnail_names ⇒ Object
-
.thumbnail_options ⇒ Object
this is a convenience for image-pickers.
-
.thumbnail_sizes ⇒ Object
for backwards compatibility.
- .with_asset_types(asset_types, &block) ⇒ Object
Instance Method Summary collapse
- #active_storage_styles ⇒ Object
- #aspect(style_name = 'original') ⇒ Object
- #asset_type ⇒ Object
- #asset_variant(style_name) ⇒ Object
- #asset_within_configured_size ⇒ Object
- #attached_to?(page) ⇒ Boolean
- #basename ⇒ Object
- #byte_size ⇒ Object
- #content_type ⇒ Object
- #dimensions_known? ⇒ Boolean
- #extension(style_name = 'original') ⇒ Object
- #filename ⇒ Object
- #geometry(style_name = 'original') ⇒ Object
- #height(style_name = 'original') ⇒ Object
- #horizontal?(style_name = 'original') ⇒ Boolean
- #orientation(style_name = 'original') ⇒ Object
- #original_extension ⇒ Object
- #original_geometry ⇒ Object
- #pdf? ⇒ Boolean
- #public_url(style_name = 'normal') ⇒ Object
- #render_original(_style_name) ⇒ Object
- #square?(style_name = 'original') ⇒ Boolean
- #style?(style_name = 'original') ⇒ Boolean
- #style_dimensions(style_name) ⇒ Object
- #style_format(style_name) ⇒ Object
- #thumbnail(style_name = 'normal') ⇒ Object
- #vertical?(style_name = 'original') ⇒ Boolean
- #width(style_name = 'original') ⇒ Object
Class Method Details
.approved_content_types ⇒ Object
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 |
.eigenclass ⇒ Object
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_types ⇒ Object
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_names ⇒ Object
346 347 348 |
# File 'app/models/asset.rb', line 346 def self.thumbnail_names thumbnail_sizes.keys end |
.thumbnail_options ⇒ Object
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. # 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_sizes ⇒ Object
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_styles ⇒ Object
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_type ⇒ Object
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_size ⇒ Object
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
169 170 171 |
# File 'app/models/asset.rb', line 169 def attached_to?(page) pages.include?(page) end |
#basename ⇒ Object
151 152 153 |
# File 'app/models/asset.rb', line 151 def basename File.basename(filename, '.*') if filename end |
#byte_size ⇒ Object
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_type ⇒ Object
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
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 |
#filename ⇒ Object
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
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_extension ⇒ Object
165 166 167 |
# File 'app/models/asset.rb', line 165 def original_extension return filename.split('.').last.downcase if filename end |
#original_geometry ⇒ Object
173 174 175 |
# File 'app/models/asset.rb', line 173 def original_geometry @original_geometry ||= TrustyCms::Geometry.new(*original_dimensions) end |
#pdf? ⇒ 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
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
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
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 |