OSDN Git Service

55d8a503fe4516481944310f60b5ad3d736c9041
[pettanr/pettanr.git] / lib / locmare / list_group / list / base.rb
1 module Locmare
2   module ListGroupModule
3     class Base
4       class ListResult
5         attr :list, :items, :paginate
6         
7         def initialize list, items, paginate, operators, options
8           @list = list
9           @items = items
10           @paginate = paginate
11           @operators = operators
12           @options = options
13         end
14         
15         def path
16           if list_manifest.has_id?
17             filter_item_id = @options[:id]
18             if list_manifest.pre_id?
19               '/' + list_manifest.model.path_name + '/' + filter_item_id.to_s + '/' + list_manifest.action_name
20             else
21               '/' + list_manifest.model.path_name + '/' + list_manifest.action_name + '/' + filter_item_id.to_s
22             end
23           else
24             '/' + list_manifest.model.path_name + '/' + list_manifest.action_name
25           end
26         end
27         
28         def list_manifest
29           @list.list_manifest
30         end
31         
32       end
33       
34       attr :item_name, :list_name, 
35         :model_manifest, :model_list_manifest, :list_manifest, :model, 
36         :default_page_size, :max_page_size
37       def initialize item_name, list_name
38         @item_name = item_name
39         @list_name = list_name
40         self.init
41       end
42       
43       def init
44         @list_group_manifest = LocalManifest.manifest.list_groups[@item_name]
45         @list_manifest = @list_group_manifest.lists[@list_name]
46         @where = @list_manifest.where
47         @includes = @list_manifest.includes
48         @order = @list_manifest.order
49         @model_manifest = ::Manifest.manifest.models[@item_name]
50         @model_list_manifest = @model_manifest.list
51         @model = ::Manifest.item_name_to_model @item_name
52         @table_name = @model.table_name
53       end
54       
55       def model_name
56         @model.model_name
57       end
58       
59       def model_manifest
60         @model.model_manifest
61       end
62       
63       def page_number prm = nil
64         page = prm.to_i
65         page = 1 if page < 1
66         page
67       end
68       
69       def page_size prm
70         page_size = prm.to_i
71         page_size = self.max_page_size if page_size > self.max_page_size
72         page_size = self.default_page_size if page_size < 1
73         page_size
74       end
75       
76       def default_page_size
77         @model_list_manifest.default_page_size
78       end
79       
80       def max_page_size
81         @model_list_manifest.max_page_size
82       end
83       
84       def base_where_condition
85         method_name = @where.conditions do |name|
86           name
87         end
88         @model.__send__ method_name
89       end
90       
91       def where_condition
92         base_where_condition
93       end
94       
95       def include_hash
96         @includes.includes
97       end
98       
99       def order
100         @model.__send__ @order.order
101       end
102       
103       def items operators, options, offset, page_size
104         @model.where(self.where_condition).includes(self.include_hash).order(self.order).offset(offset).limit(page_size)
105       end
106       
107       def count operators, options
108         @model.where(self.where_condition).includes(self.include_hash).count
109       end
110       
111       def paginate count, page, page_size
112         c = count ? count.to_i : 0
113         Kaminari.paginate_array(Array.new(c, nil)).page(page).per(page_size)
114       end
115       
116       def boost_manifests
117         @model.my_peta.boost.select do |boost_name, boost_manifest|
118           boost_manifest.level == 'show'
119         end
120       end
121       
122       def boost items
123         manifests = self.boost_manifests
124         items.each do |item|
125           manifests.each do |boost_manifest|
126             item.boost_manifest # ?
127           end
128         end
129       end
130       
131       def open operators, options
132         page = self.page_number(options[:page]) 
133         page_size = self.page_size options[:page_size]
134         offset = (page -1) * page_size
135         items = self.items operators, options, offset, page_size
136         count = self.count operators, options
137         pg = self.paginate count, page, page_size
138         self.boost items
139         ListResult.new self, items, pg, operators, options
140       end
141       
142     end
143     
144   end
145 end