OSDN Git Service

fix filer
[pettanr/pettanr.git] / lib / manifest / list / base.rb
1 module Manifest
2   module ListModule
3     class Base
4       class ListResult
5         attr :items, :paginate
6         def initialize items, paginate
7           @items = items
8           @paginate = paginate
9         end
10         
11       end
12       
13       attr :manifest, :item_name, :list_name, :list_manifest, 
14         :default_page_size, :max_page_size
15       def initialize manifest, item_name, list_name, list_manifest
16         @manifest = manifest
17         @item_name = item_name
18         @list_name = list_name
19         @list_manifest = list_manifest
20         self.set_default
21         self.init
22       end
23       
24       def set_default
25         @model_manifest = @manifest.models[@item_name]
26         @model_list_manifest = @model_manifest.lists[@list_name]
27         @list_manifest['default_page_size'] ||= @model_list_manifest.default_page_size
28         @list_manifest['max_page_size'] ||= @model_list_manifest.max_page_size
29       end
30       
31       def init
32         @default_page_size = @list_manifest['default_page_size']
33         @max_page_size = @list_manifest['max_page_size']
34         
35         @model = ::Manifest.item_name_to_model @item_name
36         @table_name = @model.table_name
37         if @model.content?
38           @owner_model = @model.owner_model
39           @owner_table_name = @owner_model.table_name if @owner_model
40         end
41       end
42       
43       def page_number prm = nil
44         page = prm.to_i
45         page = 1 if page < 1
46         page
47       end
48       
49       def page_size prm
50         page_size = prm.to_i
51         page_size = @max_page_size if page_size > @max_page_size
52         page_size = @default_page_size if page_size < 1
53         page_size
54       end
55       
56       def where
57         @model.list_where
58       end
59       
60       def includes
61         if @owner_model
62           if @owner_model.owner_model
63             {@owner_model.item_name => {@owner_model.owner_model.item_name => {}}}
64           else
65             {@owner_model.item_name => {}}
66           end
67         else
68           {}
69         end
70       end
71       
72       def order
73         @model.list_order
74       end
75       
76       def items operators, options, offset, page_size
77         @model.where(self.where).includes(self.includes).order(self.order).offset(offset).limit(page_size)
78       end
79       
80       def count operators, options
81         @model.where(self.where).includes(self.includes)
82       end
83       
84       def paginate items, offset, page_size
85         c = items ? items.count : 0
86         Kaminari.paginate_array(Array.new(c, nil)).page(offset).per(page_size)
87       end
88       
89       def open operators, options
90         page = self.page_number(options[:page]) 
91         page_size = self.page_size options[:page_size]
92         offset = (page -1) * page_size
93         items = self.items operators, options, offset, page_size
94         paginate = self.paginate items, offset, page_size
95         ListResult.new items, paginate
96       end
97       
98     end
99   end
100 end