OSDN Git Service

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