Sha256: da807dec8453fb21fd08380b73cf973fad0a4759207c1eea6d8eb0f2de3a7391

Contents?: true

Size: 1.91 KB

Versions: 8

Compression:

Stored size: 1.91 KB

Contents

class AssetCollection

  include Locomotive::Mongoid::Document

  ## fields ##
  field :name
  field :slug
  field :internal, :type => Boolean, :default => false

  ## associations ##
  referenced_in :site
  embeds_many :assets

  ## behaviours ##
  custom_fields_for :assets
  liquid_methods :name, :ordered_assets

  ## callbacks ##
  before_validation :normalize_slug
  before_save :store_asset_positions!
  after_destroy :remove_uploaded_files

  ## validations ##
  validates_presence_of :site, :name, :slug
  validates_uniqueness_of :slug, :scope => :site_id

  ## named scopes ##
  scope :internal, :where => { :internal => true }
  scope :not_internal, :where => { :internal => false }

  ## methods ##

  def ordered_assets
    self.assets.sort { |a, b| (a.position || 0) <=> (b.position || 0) }
  end

  def assets_order
    self.ordered_assets.collect(&:id).join(',')
  end

  def assets_order=(order)
    @assets_order = order
  end

  def self.find_or_create_internal(site)
    site.asset_collections.internal.first || site.asset_collections.create(:name => 'system', :slug => 'system', :internal => true)
  end

  protected

  def normalize_slug
    self.slug = self.name.clone if self.slug.blank? && self.name.present?
    self.slug.slugify! if self.slug.present?
  end

  def store_asset_positions!
    return if @assets_order.blank?

    ids = @assets_order.split(',').collect { |id| BSON::ObjectId(id) }

    ids.each_with_index do |asset_id, index|
      self.assets.find(asset_id).position = index
    end

    self.assets.clone.each do |asset|
      if !ids.include?(asset._id)
        self.assets.delete(asset)
        asset.send(:delete)
      end
    end
  end

  def remove_uploaded_files # callbacks are not called on each asset so we do it manually
    self.assets.each do |asset|
      self.asset_custom_fields.each do |field|
        asset.send(:"remove_#{field._name}!") if field.kind == 'file'
      end
    end
  end

end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
locomotive_cms-1.0.0.beta.2 app/models/asset_collection.rb
locomotive_cms-1.0.0.beta app/models/asset_collection.rb
locomotive_cms-0.0.4.beta12 app/models/asset_collection.rb
locomotive_cms-0.0.4.beta11 app/models/asset_collection.rb
locomotive_cms-0.0.4.beta10 app/models/asset_collection.rb
locomotive_cms-0.0.4.beta9 app/models/asset_collection.rb
locomotive_cms-0.0.4.beta8 app/models/asset_collection.rb
locomotive_cms-0.0.4.beta7 app/models/asset_collection.rb