OSDN Git Service

fix orm
[pettanr/pettanr.git] / lib / manifest / list.rb
index 41cf269..4fdd3f0 100644 (file)
-
-module Pettanr
-  class ListManager
-    class PublicList
-      def initialize page, page_size, operators, item_name, conf, manifest
-        @page = page
-        @page_size = page_size
-        @operators = operators
-        @item_name = item_name
-        @conf = conf
-        @manifest = manifest
-        
-        @model = @item_name.classify.constantize
-      end
-      
-      def items
-        @model.public_list @page, @page_size
-      end
-      
-      def paginate
-        @model.list_paginate(@page, @page_size)
-      end
-      
-    end
-    
-    class PrivateList
-      def initialize page, page_size, operators, item_name, conf, manifest
-        @page = page
-        @page_size = page_size
-        @operators = operators
-        @item_name = item_name
-        @conf = conf
-        @manifest = manifest
-        
-        @model = @item_name.classify.constantize
-      end
-      
-      def items
-        @model.private_list @operators, @page, @page_size
-      end
-      
-      def paginate
-        @model.list_paginate(@page, @page_size)
-      end
-      
-    end
-    
-    class HasManyList
-      def initialize page, page_size, operators, item_name, conf, manifest
-        @page = page
-        @page_size = page_size
-        @operators = operators
-        @item_name = item_name
-        @conf = conf
-        @manifest = manifest
-        
-        @model = @item_name.classify.constantize
-        @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 items item
-        method_name = 'list_by_' + item.item_name
-        @association_model.__send__ @method_name, item.id, @operators, @page, @page_size
-      end
-      
-      def paginate
-        @model.list_paginate(@page, @page_size)
-      end
-      
-    end
-    
-    class FilterList
-      def initialize page, page_size, operators, item_name, conf, manifest
-        @page = page
-        @page_size = page_size
-        @operators = operators
-        @item_name = item_name
-        @conf = conf
-        @manifest = manifest
-        
-        @model = @item_name.classify.constantize
-        @filter_key = @conf['filter_key']
-      end
-      
-      def items filter_item
-        @model.filtered_list filter_item, @filter_key, @operators, @page, @page_size
-      end
-      
-      def paginate filter_item
-        @model.list_paginate(filter_item, @filter_key, @operators, @page, @page_size)
+require_dependency "manifest/list/base"
+require_dependency "manifest/list/public"
+require_dependency "manifest/list/private"
+require_dependency "manifest/list/system_resource"
+require_dependency "manifest/list/filter"
+require_dependency "manifest/list/through_filter"
+require_dependency "manifest/list/foreign_filter"
+require_dependency "manifest/list/play"
+module Manifest
+  module ListModule
+    class ListFactory
+      @@types = {
+        'public' => ListModule::PublicList, 'private' => PrivateList, 'system_resource' => SystemResourceList,
+        'filter' => FilterList, 'through_filter' => ThroughFilterList, 'foreign_filter' => ForeignFilterList, 
+        'play' => PlayList
+      }
+      def self.factory manifest, item_name, my_manifests
+        lists = {}
+        my_manifests.each {|list_name, my_manifest|
+          model_manifest = manifest.models[item_name]
+          raise "undefined model for lists > #{item_name}\n" unless model_manifest
+          model_list_manifest = model_manifest.lists[list_name]
+          raise "undefined model_list for lists > #{item_name} > #{list_name}\n" unless model_list_manifest
+          type = model_list_manifest.type
+          raise "undefined type for lists > #{item_name} > #{list_name}\n" unless type
+          my_class = @@types[type]
+          raise "undefined class for lists > #{item_name} > #{list_name} > #{type}\n" unless my_class
+          lists[list_name] = my_class.new(manifest, item_name, list_name, my_manifest)
+        }
+        lists
       end
       
     end
-    
-    @@types = {'public' => PublicList, 'private' => PrivateList, 'has_many' => HasManyList, 'filter' => FilterList}
-    def initialize list_manifest
-      @list_manifest = list_manifest
-      @item_name = @list_manifest.item_name
-      @manifest = @list_manifest.manifest
-      @list_conf = @list_manifest.conf
-      @lists = {}
-      @list_conf.each {|list_name, conf|
-        type = conf['type']
-        @lists[list_name] = @@types[type]
+  end
+  
+  class List
+    include ListModule
+    def self.manager manifest, my_manifests
+      lists = {}
+      my_manifests.each {|item_name, list_manifest|
+        lists[item_name] = ListModule::ListFactory.factory(manifest, item_name, list_manifest)
       }
+      lists
     end
-    
-    def open list_name, page, page_size, operators
-      @lists[list_name].new page, page_size, operators, @item_name, @list_conf, @manifest
-    end
-    
   end
+  
 end