OSDN Git Service

rename model name
[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, :count, :paginate
6         
7         def initialize list, items, count, paginate, operators
8           @list = list
9           @items = items
10           @count = count  # total count
11           @paginate = paginate
12           @operators = operators
13         end
14         
15         def path
16           @list.action_manifest.url @list.options
17         end
18         
19       end
20       
21       attr :list_group_name, :list_name, :options, :item_name, 
22         :controller_manifest, :action_manifest, :list_manifest, :model,
23         :count
24       def initialize list_group_name, list_name, operators, options = {}
25         @list_group_name = list_group_name
26         @list_name = list_name
27         @operators = operators
28         @options = options
29         
30         @list_group_manifest = LocalManifest.manifest.list_groups[@list_group_name]
31         @list_manifest = @list_group_manifest.lists[@list_name]
32         @where = @list_manifest.where
33         @includes = @list_manifest.includes
34         
35         @controller_name = @list_group_name
36         @action_name = @list_name
37         @controller_manifest = ::Manifest.manifest.controllers[@controller_name]
38         @action_manifest = @controller_manifest.actions[@action_name]
39         @item_name = @action_manifest.item_name
40         @model = ::Manifest.item_name_to_model @item_name
41         @table_name = @model.table_name
42         self.init
43       end
44       
45       def init
46         self.set_count
47         self.set_offset
48         self.set_limit
49       end
50       
51       def model_name
52         @model.model_name
53       end
54       
55       def set_offset
56         if prm = @options['offset'] || @options[:offset]
57           @offset = prm.to_i
58           @offset = @count - 1 if @offset >= @count
59           @offset = @count - @offset.abs if @offset < 0
60           @offset = 0 if @offset < 0
61           offset
62         else
63           @offset = (self.fixed_page - 1) * self.fixed_page_size
64         end
65         @offset
66       end
67       
68       def limit?
69         self.max_page_size > 0
70       end
71       
72       def unlimit?
73         !limit?
74       end
75       
76       def fixed_page
77         page = self.opt_page.to_i
78         page = 1 if page < 1
79         page
80       end
81       
82       def fixed_page_size
83         page_size = self.opt_page_size || self.default_page_size
84         page_size = self.max_page_size if self.limit? and page_size > self.max_page_size
85         page_size
86       end
87       
88       def set_limit
89         prm = self.opt_page_size || self.opt_count
90         @limit = prm.to_i
91         if self.max_page_size > 0
92           @limit = self.max_page_size if @limit > self.max_page_size
93         else  # unlimited api
94           @limit = @count if @limit > @count
95         end
96         @limit = self.default_page_size if @limit < 1
97         @limit
98       end
99       
100       def opt_page
101         @options['page'] || @options[:page]
102       end
103       
104       def opt_page_size
105         @options['page_size'] || @options[:page_size]
106       end
107       
108       def opt_count
109         @options['count'] || @options[:count]
110       end
111       
112       def default_page_size
113         @action_manifest.default_page_size
114       end
115       
116       def max_page_size
117         @action_manifest.max_page_size
118       end
119       
120       def order
121         order = @options['order'] || @options[:order] || @action_manifest.order
122         order = 'updated_at' unless ::Manifest.manifest.models[@item_name].attributes[order]
123         @table_name + '.' + order
124       end
125       
126       def direction
127         direction = @options['direction'] || @options[:direction] || @action_manifest.direction
128         if direction < 0
129           'desc'
130         elsif direction > 0
131           'asc'
132         else
133           ''
134         end
135       end
136       
137       def filter_id
138         @options['id'] || @options[:id]
139       end
140       
141       def order_by
142         self.order + ' ' + self.direction
143       end
144       
145       def base_where_condition
146         method_name = @where.conditions do |name|
147           name
148         end
149         @model.__send__ method_name
150       end
151       
152       def where_condition
153         base_where_condition
154       end
155       
156       def include_hash
157         @includes.includes
158       end
159       
160       def items
161         @model.where(
162           self.where_condition
163         ).includes(
164           self.include_hash
165         ).order(
166           self.order_by
167         ).offset(@offset).limit(@limit)
168       end
169       
170       def set_count
171         @count = @model.where(
172           self.where_condition
173         ).includes(
174           self.include_hash
175         ).count
176       end
177       
178       def paginate count
179         c = count ? count.to_i : 0
180         Kaminari.paginate_array(Array.new(c, nil)).page(self.fixed_page).per(self.fixed_page_size)
181       end
182       
183       def boost_manifests
184         @model.my_peta.boost.select do |boost_name, boost_manifest|
185           boost_manifest.level == 'show'
186         end
187       end
188       
189       def boost items
190         manifests = self.boost_manifests
191         items.each do |item|
192           manifests.each do |boost_manifest|
193             item.boost_manifest # ?
194           end
195         end
196       end
197       
198       def open operators
199         items = self.items
200         pg = if limit?
201           self.paginate @count
202         else
203           nil
204         end
205         self.boost items
206         ListResult.new self, items, @count, pg, @operators
207       end
208       
209     end
210     
211   end
212 end