module Pettanr
class ListManager
class PublicList
- def initialize page, page_size, operators, item_name, conf, manifest
+ def initialize page, page_size, operators, item_name, list_name, conf, manifest
+ @operators = operators
@item_name = item_name
+ @list_name = list_name
@conf = conf
@manifest = manifest
@default_page_size = @conf['default_page_size'] || 25
@max_page_size = @conf['max_page_size'] || 100
@page = self.page_number(page)
@page_size = self.page_size page_size
- @operators = operators
@model = @item_name.classify.constantize
@offset = (@page -1) * @page_size
end
class PrivateList
- def initialize page, page_size, operators, item_name, conf, manifest
- @page = page
- @page_size = page_size
+ def initialize page, page_size, operators, item_name, list_name, conf, manifest
@operators = operators
@item_name = item_name
@conf = conf
@manifest = manifest
+ @default_page_size = @conf['default_page_size'] || 25
+ @max_page_size = @conf['max_page_size'] || 100
+ @page = self.page_number(page)
+ @page_size = self.page_size page_size
@model = @item_name.classify.constantize
+ @offset = (@page -1) * @page_size
+ end
+
+ def page_number prm = nil
+ page = prm.to_i
+ page = 1 if page < 1
+ page
+ end
+
+ def page_size prm
+ page_size = prm.to_i
+ page_size = @max_page_size if page_size > @max_page_size
+ page_size = @default_page_size if page_size < 1
+ page_size
end
def where
end
def paginate
- Kaminari.paginate_array(Array.new(@model.where(self.where()).includes(@model.list_opt).count, nil)).page(page).per(page_size)
+ Kaminari.paginate_array(Array.new(@model.where(self.where()).includes(@model.list_opt).count, nil)).page(@offset).per(@page_size)
end
end
class HasManyList
- def initialize page, page_size, operators, item_name, conf, manifest
- @page = page
- @page_size = page_size
+ def initialize page, page_size, operators, item_name, list_name, conf, manifest
@operators = operators
@item_name = item_name
+ @list_name = list_name
@conf = conf
@manifest = manifest
+ @default_page_size = @conf['default_page_size'] || 25
+ @max_page_size = @conf['max_page_size'] || 100
+ @page = self.page_number(page)
+ @page_size = self.page_size page_size
@model = @item_name.classify.constantize
+ @offset = (@page -1) * @page_size
@association_name = @conf['association_name']
@has_many_conf = @manifest.model(@item_name).associations['has_many'] || {}
@association_conf = @has_many_conf[@association_name] || {}
@foreign_key = @association_conf['foreign_key']
end
+ def page_number prm = nil
+ page = prm.to_i
+ page = 1 if page < 1
+ page
+ end
+
+ def page_size prm
+ page_size = prm.to_i
+ page_size = @max_page_size if page_size > @max_page_size
+ page_size = @default_page_size if page_size < 1
+ page_size
+ end
+
def where parent_item
w = @model.list_where
w += ' and ' unless w.blank?
end
def paginate
- Kaminari.paginate_array(Array.new(@model.where(self.where(parent_item)).includes(@model.list_opt).count, nil)).page(page).per(page_size)
+ Kaminari.paginate_array(Array.new(@model.where(self.where(parent_item)).includes(@model.list_opt).count, nil)).page(@offset).per(@page_size)
end
end
class FilterList
- def initialize page, page_size, operators, item_name, conf, manifest
- @page = page
- @page_size = page_size
+ def initialize page, page_size, operators, item_name, list_name, conf, manifest
@operators = operators
@item_name = item_name
+ @list_name = list_name
@conf = conf
@manifest = manifest
+ @default_page_size = @conf['default_page_size'] || 25
+ @max_page_size = @conf['max_page_size'] || 100
+ @page = self.page_number(page)
+ @page_size = self.page_size page_size
@model = @item_name.classify.constantize
- @filter_key = @conf['filter_key']
+ @table_name = @model.table_name
+ @offset = (@page -1) * @page_size
+ @list_list_conf = @manifest.list(@item_name).lists[list_name] || {}
+ @from = @list_list_conf['from']
+ @filter_key = @list_list_conf['filter_key']
+ end
+
+ def page_number prm = nil
+ page = prm.to_i
+ page = 1 if page < 1
+ page
+ end
+
+ def page_size prm
+ page_size = prm.to_i
+ page_size = @max_page_size if page_size > @max_page_size
+ page_size = @default_page_size if page_size < 1
+ page_size
+ end
+
+ def list_opt
+ {@from => {} }
+ end
+
+ def where filter_item
+ w = @model.list_where
+ w += ' and ' unless w.blank?
+ [w + @table_name + '.' + @filter_key + ' = ?', filter_item.id]
+ end
+
+ def items filter_item
+ @model.where(self.where(filter_item)).includes(self.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
+ end
+
+ def paginate filter_item
+ Kaminari.paginate_array(Array.new(@model.where(self.where(filter_item)).includes(self.list_opt).count, nil)).page(@offset).per(@page_size)
+ end
+
+ end
+
+ class ThroughFilterList
+ def initialize page, page_size, operators, item_name, list_name, conf, manifest
+ @operators = operators
+ @item_name = item_name
+ @list_name = list_name
+ @conf = conf
+ @manifest = manifest
+ @default_page_size = @conf['default_page_size'] || 25
+ @max_page_size = @conf['max_page_size'] || 100
+ @page = self.page_number(page)
+ @page_size = self.page_size page_size
+
+ @model = @item_name.classify.constantize
+ @table_name = @model.table_name
+ @offset = (@page -1) * @page_size
+ @list_list_conf = @manifest.list(@item_name).lists[list_name] || {}
+ @filter_key = @list_list_conf['filter_key']
+ @from = @list_list_conf['from']
+ @through = @list_list_conf['through']
+ end
+
+ def page_number prm = nil
+ page = prm.to_i
+ page = 1 if page < 1
+ page
+ end
+
+ def page_size prm
+ page_size = prm.to_i
+ page_size = @max_page_size if page_size > @max_page_size
+ page_size = @default_page_size if page_size < 1
+ page_size
+ end
+
+ def list_opt
+ {@through => {@from => {}} }
end
def where filter_item
w = @model.list_where
w += ' and ' unless w.blank?
- p w
- p @model.table_name
- p @filter_key
- p filter_item
- [w + @model.table_name + '.' + @filter_key + ' = ?', filter_item.id]
+ [w + @through + '.' + @filter_key + ' = ?', filter_item.id]
end
def items filter_item
- @model.where(self.where(filter_item)).includes(@model.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
+ @model.where(self.where(filter_item)).includes(self.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
end
def paginate filter_item
- Kaminari.paginate_array(Array.new(@model.where(self.where(filter_item)).includes(@model.list_opt).count, nil)).page(page).per(page_size)
+ Kaminari.paginate_array(Array.new(@model.where(self.where(filter_item)).includes(self.list_opt).count, nil)).page(@offset).per(@page_size)
end
end
- @@types = {'public' => PublicList, 'private' => PrivateList, 'has_many' => HasManyList, 'filter' => FilterList}
+ @@types = {'public' => PublicList, 'private' => PrivateList, 'has_many' => HasManyList, 'filter' => FilterList, 'through_filter' => ThroughFilterList}
def initialize list_manifest
@list_manifest = list_manifest
@item_name = @list_manifest.item_name
end
def open list_name, page, page_size, operators
- @lists[list_name].new page, page_size, operators, @item_name, @list_conf, @manifest
+ @lists[list_name].new page, page_size, operators, @item_name, list_name, @list_conf, @manifest
end
end