OSDN Git Service

fix Manifest
[pettanr/pettanr.git] / lib / manifest / list.rb
index 43d0c43..7dc85cd 100644 (file)
+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
-