OSDN Git Service

rails upgrade to 4 for js
[pettanr/pettanr.git] / lib / locmare / list_group / list / base.rb
index 7e71f68..88fee26 100644 (file)
 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