+require "manifest/list/base"
-module Pettanr
- class ListManager
- class BaseList
- 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
- 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
- @model.list_where
- end
-
- def items
- @model.where(self.where()).includes(@model.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
- end
-
- def paginate
- Kaminari.paginate_array(Array.new(@model.where(self.where()).includes(@model.list_opt).count, nil)).page(@offset).per(@page_size)
- end
-
- end
+module Manifest
+ class List
+ include ListModule
- class PublicList
- 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
- 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
- @model.list_where
- end
-
- def items
- @model.where(self.where()).includes(@model.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
- end
-
- def paginate
- Kaminari.paginate_array(Array.new(@model.where(self.where()).includes(@model.list_opt).count, nil)).page(@offset).per(@page_size)
- end
-
- end
-
- class SystemResourceList
- def items
- @model.where(self.where()).includes(@model.list_opt).order(@model.list_order).offset(@offset).limit(@page_size).delete_if {|sbt|
- Pettanr::Application.manifest.system_resources.speech_balloon_templates[sbt.classname] == nil
- }
- end
-
- def paginate
- Kaminari.paginate_array(Array.new(@model.where(self.where()).includes(@model.list_opt).count, nil)).page(@offset).per(@page_size)
- end
-
- end
-
- class PrivateList
- 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
- case @model.owner_type
- when :author
- operator = @operators.author
- when :artist
- operator = @operators.artist
- end
- [@model.plural + '.' + @model.owner_type.to_s + '_id = ?', operator.id]
- end
-
- def items
- @model.where(self.where()).includes(@model.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
- end
-
- def paginate
- 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, 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] || {}
- @association_model_name = @association_conf['model']
- @association_model = @association_model_name.classify.constantize
- @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?
- [w + @association_model_name + '.' + @foreign_key + ' = ?', parent_item.id]
- end
-
- def items parent_item
- @model.where(self.where(parent_item)).includes(@model.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
- end
-
- def paginate parent_item
- Kaminari.paginate_array(Array.new(@model.where(self.where(parent_item)).includes(@model.list_opt).count, nil)).page(@offset).per(@page_size)
- end
-
+ def self.manager manifest, my_manifests
+ my_manifests.each {|list_name, list_manifest|
+ self.new(manifest, list_name, list_manifest)
+ }
end
- class FilterList
- 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] || {}
- @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
-
+ @@types = {
+ 'public' => PublicList, 'private' => PrivateList, 'system_resource' => SystemResourceList,
+ 'has_many' => HasManyList, 'has_many_through' => HasManyThroughList, 'filter' => FilterList,
+ 'through_filter' => ThroughFilterList, 'element_filter' => ElementFilterList,
+ 'play' => PlayList
+ }
+ attr :list_name, :list_manifest,
+ :default_page_size, :max_page_size
+ def initialize manifest, list_name, list_manifest
+ @manifest = manifest
+ @list_name = list_name
+ @list_manifest = list_manifest
+ self.set_default
+ self.init
+ @list_manifest.lists.each {|list_name, conf|
+ type = conf['type']
+ @lists[list_name] = @@types[type]
+ }
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?
- [w + @through + '.' + @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
-
+ def set_default
+ @list_manifest['lists'] ||= {}
+ @list_manifest['default_page_size'] ||= 25
+ @list_manifest['max_page_size'] ||= 100
end
- @@types = {'public' => PublicList, 'system_resource' => SystemResourceList, 'private' => PrivateList, 'has_many' => HasManyList, 'filter' => FilterList, 'through_filter' => ThroughFilterList}
- def initialize list_manifest
- @list_manifest = list_manifest
- @item_name = @list_manifest.item_name
- @manifest = @list_manifest.manifest
- @list_conf = @list_manifest.conf
+ def init
+ @default_page_size = @list_manifest['default_page_size']
+ @max_page_size = @list_manifest['max_page_size']
@lists = {}
- @list_manifest.lists.each {|list_name, conf|
- type = conf['type']
- @lists[list_name] = @@types[type]
+ @list_manifest['lists'].each {|list_name, list_manifest|
+ raise "undefined type for models > #{@model_name} > attributes > #{attribute_name}\n" unless attribute_manifest['type']
+ @lists[list_name] = List.new(self, list_name, list_manifest)
}
end
def open list_name, page, page_size, operators
+ raise "undefined list for #{@item_name}::#{list_name}\nconf:#{@list_conf}\n" unless @lists[list_name]
@lists[list_name].new page, page_size, operators, @item_name, list_name, @list_conf, @manifest
end
+ def filer opt = nil
+ paginate = opt ? @list.paginate(opt) : @list.paginate
+ @filer ||= @manifest.filer_managers[@item_name].open(@item_name, @items, @operators, paginate)
+ end
+
+ def add_action action_name, list_name
+ @lists[list_name].add_action @item_name, action_name, list_name, @list_conf
+ end
+
end
end
-