app/models/quadro/page.rb
module Quadro
class Page < ActiveRecord::Base
# constants
PAGE_TEMPLATES_PATH = 'app/views/quadro/shared/templates/'
SITEMAP_FREQUENCY = %w(always hourly daily weekly monthly yearly never).freeze
SITEMAP_PRIORITY = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0].freeze
# attributes
store :settings, accessors: [:template, :frequency, :priority]
# validations
validates :title, presence: true, length: { maximum: 60 }
validates :slug, uniqueness: true
validates :summary, length: { maximum: 155 }
# associations
belongs_to :author, class_name: Quadro::User
has_many :widgets, dependent: :destroy
has_many :assets, as: :assetable, dependent: :destroy
has_many :images, as: :assetable, class_name: Quadro::Asset::Image
has_one :cover, as: :assetable, class_name: Quadro::Asset::Cover
# nested attributes
accepts_nested_attributes_for :cover, allow_destroy: false
# behaviours
has_ancestry orphan_strategy: :destroy
acts_as_url :title, url_attribute: :slug, sync_url: true
# callbacks
after_initialize :initialize_defaults, if: :new_record?
after_save :ensure_cover
# delegation
delegate :name, :email, to: :author, prefix: true, allow_nil: true
# scopes
scope :ordered, -> { order('quadro_pages.published_at DESC, quadro_pages.created_at DESC') }
scope :published, -> { where('quadro_pages.published_at IS NOT NULL') }
# methods
def publish!
self.update_column(:published_at, Time.zone.now)
end
def unpublish!
self.update_column(:published_at, nil)
end
def published?
!self.published_at.nil?
end
def unpublished?
self.published_at.nil?
end
def to_param
self.slug
end
def to_s
self.title
end
def templates
templates = []
Dir.glob("#{PAGE_TEMPLATES_PATH}*.html.haml").each do |file|
file = File.basename(file, '.html.haml')
templates << file[1..-1] if file.start_with?('_')
end
templates
end
def find_asset(asset_id)
new_asset = assets.find(asset_id) rescue nil
new_asset.becomes(new_asset.type.constantize) unless new_asset.nil?
new_asset
end
def ensure_cover
generate_cover if self.cover.nil?
end
private
def initialize_defaults
self.template = Quadro.config.template if self.template.blank?
self.frequency = Quadro.config.frequency if self.frequency.blank?
self.priority = Quadro.config.priority if self.priority.blank?
end
def generate_cover
self.build_cover
self.cover.save
end
class << self
def short_name
'page'
end
end
end
end