2010-06-01 00:06:46 +00:00
|
|
|
class ContentType
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-06-01 00:06:46 +00:00
|
|
|
include Locomotive::Mongoid::Document
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-24 00:18:23 +00:00
|
|
|
## fields ##
|
|
|
|
field :name
|
|
|
|
field :description
|
|
|
|
field :slug
|
|
|
|
field :order_by
|
2011-03-09 23:54:38 +00:00
|
|
|
field :order_direction, :default => 'asc'
|
2010-05-25 00:32:12 +00:00
|
|
|
field :highlighted_field_name
|
2010-06-16 14:43:29 +00:00
|
|
|
field :group_by_field_name
|
2010-06-10 14:50:50 +00:00
|
|
|
field :api_enabled, :type => Boolean, :default => false
|
2011-01-18 14:24:42 +00:00
|
|
|
field :api_accounts, :type => Array
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-24 00:18:23 +00:00
|
|
|
## associations ##
|
2010-07-31 02:15:24 +00:00
|
|
|
referenced_in :site
|
2011-03-04 23:29:40 +00:00
|
|
|
embeds_many :contents, :class_name => 'ContentInstance', :validate => false do
|
2010-07-19 00:09:10 +00:00
|
|
|
def visible
|
|
|
|
@target.find_all { |c| c.visible? }
|
|
|
|
end
|
|
|
|
end
|
2010-05-24 00:18:23 +00:00
|
|
|
|
2011-03-04 23:29:40 +00:00
|
|
|
## named scopes ##
|
2011-03-08 15:05:07 +00:00
|
|
|
scope :ordered, :order_by => :updated_at.desc
|
|
|
|
|
2011-03-04 23:29:40 +00:00
|
|
|
|
2010-09-15 16:09:07 +00:00
|
|
|
## indexes ##
|
|
|
|
index [[:site_id, Mongo::ASCENDING], [:slug, Mongo::ASCENDING]]
|
|
|
|
|
2010-05-24 00:18:23 +00:00
|
|
|
## callbacks ##
|
2010-07-20 10:15:53 +00:00
|
|
|
before_validation :normalize_slug
|
2010-05-26 00:41:10 +00:00
|
|
|
before_save :set_default_values
|
2010-10-29 14:19:41 +00:00
|
|
|
after_destroy :remove_uploaded_files
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-24 00:18:23 +00:00
|
|
|
## validations ##
|
|
|
|
validates_presence_of :site, :name, :slug
|
2010-07-06 00:05:47 +00:00
|
|
|
validates_uniqueness_of :slug, :scope => :site_id
|
2010-05-26 00:41:10 +00:00
|
|
|
validates_size_of :content_custom_fields, :minimum => 1, :message => :array_too_short
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-24 00:18:23 +00:00
|
|
|
## behaviours ##
|
2010-05-25 00:32:12 +00:00
|
|
|
custom_fields_for :contents
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-24 00:18:23 +00:00
|
|
|
## methods ##
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-06-16 14:43:29 +00:00
|
|
|
def groupable?
|
|
|
|
self.group_by_field && group_by_field.category?
|
|
|
|
end
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2011-03-09 23:54:38 +00:00
|
|
|
def order_manually?
|
|
|
|
self.order_by == '_position_in_list'
|
|
|
|
end
|
|
|
|
|
|
|
|
def asc_order?
|
|
|
|
self.order_direction.blank? || self.order_direction == 'asc'
|
|
|
|
end
|
|
|
|
|
2010-06-16 14:43:29 +00:00
|
|
|
def list_or_group_contents
|
|
|
|
if self.groupable?
|
|
|
|
groups = self.contents.klass.send(:"group_by_#{self.group_by_field._alias}", :ordered_contents)
|
|
|
|
|
|
|
|
# look for items with no category or unknown ones
|
|
|
|
items_without_category = self.contents.find_all { |c| !self.group_by_field.category_ids.include?(c.send(self.group_by_field_name)) }
|
|
|
|
if not items_without_category.empty?
|
|
|
|
groups << { :name => nil, :items => items_without_category }
|
|
|
|
else
|
|
|
|
groups
|
|
|
|
end
|
|
|
|
else
|
|
|
|
self.ordered_contents
|
|
|
|
end
|
|
|
|
end
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-30 23:57:33 +00:00
|
|
|
def ordered_contents(conditions = {})
|
2010-05-26 00:41:10 +00:00
|
|
|
column = self.order_by.to_sym
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2011-03-09 23:54:38 +00:00
|
|
|
list = (if conditions.nil? || conditions.empty?
|
2010-05-30 23:57:33 +00:00
|
|
|
self.contents
|
|
|
|
else
|
2010-10-28 23:36:45 +00:00
|
|
|
conditions_with_names = {}
|
|
|
|
|
|
|
|
conditions.each do |key, value|
|
|
|
|
# convert alias (key) to name
|
|
|
|
field = self.content_custom_fields.detect { |f| f._alias == key }
|
|
|
|
|
|
|
|
conditions_with_names[field._name.to_sym] = value
|
|
|
|
end
|
|
|
|
|
|
|
|
self.contents.where(conditions_with_names)
|
2010-05-30 23:57:33 +00:00
|
|
|
end).sort { |a, b| (a.send(column) || 0) <=> (b.send(column) || 0) }
|
2011-03-09 23:54:38 +00:00
|
|
|
|
|
|
|
return list if self.order_manually?
|
|
|
|
|
|
|
|
self.asc_order? ? list : list.reverse
|
2010-05-25 00:32:12 +00:00
|
|
|
end
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-26 00:41:10 +00:00
|
|
|
def sort_contents!(order)
|
|
|
|
order.split(',').each_with_index do |id, position|
|
2010-10-19 10:20:09 +00:00
|
|
|
self.contents.find(BSON::ObjectId(id))._position_in_list = position
|
2010-05-26 00:41:10 +00:00
|
|
|
end
|
|
|
|
self.save
|
2010-05-25 00:32:12 +00:00
|
|
|
end
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-25 00:32:12 +00:00
|
|
|
def highlighted_field
|
|
|
|
self.content_custom_fields.detect { |f| f._name == self.highlighted_field_name }
|
|
|
|
end
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-06-16 14:43:29 +00:00
|
|
|
def group_by_field
|
|
|
|
@group_by_field ||= self.content_custom_fields.detect { |f| f._name == self.group_by_field_name }
|
|
|
|
end
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-24 00:18:23 +00:00
|
|
|
protected
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-26 00:41:10 +00:00
|
|
|
def set_default_values
|
2010-10-30 22:30:30 +00:00
|
|
|
self.order_by ||= 'created_at'
|
2010-05-26 00:41:10 +00:00
|
|
|
self.highlighted_field_name ||= self.content_custom_fields.first._name
|
|
|
|
end
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-05-24 00:18:23 +00:00
|
|
|
def normalize_slug
|
2010-07-23 20:09:54 +00:00
|
|
|
self.slug = self.name.clone if self.slug.blank? && self.name.present?
|
2010-05-24 00:18:23 +00:00
|
|
|
self.slug.slugify! if self.slug.present?
|
|
|
|
end
|
2010-07-23 20:09:54 +00:00
|
|
|
|
2010-10-29 14:19:41 +00:00
|
|
|
def remove_uploaded_files # callbacks are not called on each content so we do it manually
|
|
|
|
self.contents.each do |content|
|
|
|
|
self.content_custom_fields.each do |field|
|
|
|
|
content.send(:"remove_#{field._name}!") if field.kind == 'file'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-07-23 20:09:54 +00:00
|
|
|
end
|