module Locmare
module ListGroupModule
class Base
- class ListResult
- attr :items, :paginate
- def initialize items, paginate
- @items = items
- @paginate = paginate
- end
-
- end
+ attr_accessor :list_group_name, :list_name, :operators, :options, :item_name,
+ :controller_manifest, :action_manifest, :list_manifest, :model, :table_name,
+ :page_status, :item_wheres, :list_wheres, :wheres
- attr :item_name, :list_name,
- :model_manifest, :model_list_manifest, :model,
- :default_page_size, :max_page_size
- def initialize item_name, list_name
- @item_name = item_name
+ def initialize list_group_name, list_name, operators, options = {}
+ @list_group_name = list_group_name
@list_name = list_name
- self.init
- end
-
- def init
- @list_group_manifest = LocalManifest.manifest.list_groups[@item_name]
+ @operators = operators
+ @options = options
+
+ @list_group_manifest = LocalManifest.manifest.list_groups[@list_group_name]
@list_manifest = @list_group_manifest.lists[@list_name]
- @where = @list_manifest.where
+ @wheres = @list_manifest.wheres
@includes = @list_manifest.includes
- @model_manifest = ::Manifest.manifest.models[@item_name]
- @model_list_manifest = @model_manifest.list
+
+ @controller_name = @list_group_name
+ @action_name = @list_name
+ @controller_manifest = ::Manifest.manifest.controllers[@controller_name]
+ @action_manifest = @controller_manifest.actions[@action_name]
+ @item_name = @action_manifest.item_name
@model = ::Manifest.item_name_to_model @item_name
@table_name = @model.table_name
+ self.init
end
- def model_name
- @model.model_name
+ def init
end
- def model_manifest
- @model.model_manifest
+ def reset
+ @page_status = nil
+ @item = nil
+ @total = nil
end
- def page_number prm = nil
- page = prm.to_i
- page = 1 if page < 1
- page
+ def page_status
+ @page_status ||= LibModule::PageStatus.load(self, self.total, @options)
end
- def page_size prm
- page_size = prm.to_i
- page_size = self.max_page_size if page_size > self.max_page_size
- page_size = self.default_page_size if page_size < 1
- page_size
+ def model_name
+ @model.model_name
+ end
+
+ def limited?
+ self.max_page_size > 0
+ end
+
+ def unlimited?
+ !self.limited?
end
def default_page_size
- @model_list_manifest.default_page_size
+ @action_manifest.default_page_size
end
def max_page_size
- @model_list_manifest.max_page_size
+ @action_manifest.max_page_size
end
- def base_where_condition
- method_name = @where.conditions do |name|
- name
+ def order
+ order = @options['order'] || @options[:order] || @action_manifest.order
+ order = 'updated_at' unless ::Manifest.manifest.models[@item_name].attributes[order]
+ @table_name + '.' + order
+ end
+
+ def direction
+ direction = @options['direction'] || @options[:direction] || @action_manifest.direction
+ if direction < 0
+ 'desc'
+ elsif direction > 0
+ 'asc'
+ else
+ ''
end
- @model.__send__ method_name
end
- def where_condition
- base_where_condition
+ def filter_id
+ @options['id'] || @options[:id]
+ end
+
+ def order_by
+ self.order + ' ' + self.direction
end
def include_hash
@includes.includes
end
- def order
- @model.list_order
+ def arel
+ r = @model
+ return @model.__send__('find_' + @action_name)
end
- def items operators, options, offset, page_size
- @model.where(self.where_condition).includes(self.include_hash).order(self.order).offset(offset).limit(page_size)
+ def items
+ self.total # get total
+ return [] unless self.page_status #.pager
+ @items ||= self.arel.order(
+ self.order_by
+ ).offset(self.page_status.offset).limit(self.page_status.limit)
+ self.boost
+ @items
end
- def count operators, options
- @model.where(self.where_condition).includes(self.include_hash).count
+ def total
+ @total ||= self.arel.count
end
- def paginate count, offset, page_size
- c = count ? count.to_i : 0
- Kaminari.paginate_array(Array.new(c, nil)).page(offset).per(page_size)
+ def boost_manifests
+ @model.my_peta.boost.select do |boost_name, boost_manifest|
+ boost_manifest.level == 'show'
+ end
end
- def open operators, options
- page = self.page_number(options[:page])
- page_size = self.page_size options[:page_size]
- offset = (page -1) * page_size
- items = self.items operators, options, offset, page_size
- count = self.count operators, options
- pg = self.paginate count, offset, page_size
- ListResult.new items, pg
+ def boost
+ manifests = self.boost_manifests
+ @items.each do |item|
+ manifests.each do |boost_manifest|
+ item.boost_manifest # ?
+ end
+ end
+ end
+
+ def private_list_where
+ owner_model = if @model.element?
+ @model.root_model
+ else
+ @model
+ end
+ case owner_model.owner_type
+ when :author
+ operator = @operators.author
+ when :artist
+ operator = @operators.artist
+ end
+ [owner_model.table_name + '.' + owner_model.owner_type.to_s + '_id = ?', operator.id]
end
end