OSDN Git Service

temp
[pettanr/pettanr.git] / lib / manifest / list.rb
1
2 module Pettanr
3   class ListManager
4     class BaseList
5       def initialize page, page_size, operators, item_name, list_name, conf, manifest
6         @operators = operators
7         @item_name = item_name
8         @list_name = list_name
9         @conf = conf
10         @manifest = manifest
11         @default_page_size = @conf['default_page_size'] || 25
12         @max_page_size = @conf['max_page_size'] || 100
13         @page = self.page_number(page) 
14         @page_size = self.page_size page_size
15         
16         @model = @item_name.classify.constantize
17         @offset = (@page -1) * @page_size
18         @table_name = @model.table_name
19       end
20       
21       def page_number prm = nil
22         page = prm.to_i
23         page = 1 if page < 1
24         page
25       end
26       
27       def page_size prm
28         page_size = prm.to_i
29         page_size = @max_page_size if page_size > @max_page_size
30         page_size = @default_page_size if page_size < 1
31         page_size
32       end
33       
34       def where
35         @model.list_where
36       end
37       
38       def includes
39         @model.list_opt
40       end
41       
42       def order
43         @model.list_order
44       end
45       
46       def items
47         @model.where(self.where()).includes(self.includes).order(self.order).offset(@offset).limit(@page_size)
48       end
49       
50       def paginate
51         Kaminari.paginate_array(Array.new(@model.where(self.where()).includes(self.includes).count, nil)).page(@offset).per(@page_size)
52       end
53       
54     end
55     
56     class PublicList < BaseList
57     end
58     
59     class SystemResourceList < BaseList
60       def items
61         @model.where(self.where()).includes(@model.list_opt).order(@model.order).offset(@offset).limit(@page_size).delete_if {|sbt|
62           Pettanr::Application.manifest.system_resources.speech_balloon_templates[sbt.classname] == nil
63         }
64       end
65       
66       def paginate
67         Kaminari.paginate_array(Array.new(@model.where(self.where()).includes(@model.list_opt).count, nil)).page(@offset).per(@page_size)
68       end
69       
70     end
71     
72     class PrivateList < BaseList
73       def where 
74         case @model.owner_type
75         when :author
76           operator = @operators.author
77         when :artist
78           operator = @operators.artist
79         end
80         [@model.plural + '.' + @model.owner_type.to_s + '_id = ?', operator.id]
81       end
82      
83     end
84     
85     class HasManyList < BaseList
86       def initialize page, page_size, operators, item_name, list_name, conf, manifest
87         super
88         @association_name = @conf['association_name']
89         @has_many_conf = @manifest.model(@item_name).associations['has_many'] || {}
90         @association_conf = @has_many_conf[@association_name] || {}
91         @association_model_name = @association_conf['model']
92         @association_model = @association_model_name.classify.constantize
93         @foreign_key = @association_conf['foreign_key']
94       end
95       
96       def where parent_item
97         w = @model.list_where
98         w += ' and ' unless w.blank?
99         [w + @association_model_name + '.' + @foreign_key + ' = ?', parent_item.id] 
100       end
101       
102       def items parent_item
103         @model.where(self.where(parent_item)).includes(self.includes).order(self.order).offset(@offset).limit(@page_size)
104       end
105       
106       def paginate parent_item
107         Kaminari.paginate_array(Array.new(@model.where(self.where(parent_item)).includes(self.includes).count, nil)).page(@offset).per(@page_size)
108       end
109       
110     end
111     
112     class FilterList < BaseList
113       def initialize page, page_size, operators, item_name, list_name, conf, manifest
114         super
115         @list_list_conf = @manifest.list(@item_name).lists[list_name] || {}
116         @from = @list_list_conf['from']
117         @filter_key = @list_list_conf['filter_key']
118       end
119       
120       def where filter_item
121         w = @model.list_where
122         w += ' and ' unless w.blank?
123         [w + @table_name + '.' + @filter_key + ' = ?', filter_item.id] 
124       end
125       
126       def includes
127         {@from => {} }
128       end
129       
130       def items filter_item
131         @model.where(self.where(filter_item)).includes(self.includes).order(self.order).offset(@offset).limit(@page_size)
132       end
133       
134       def paginate filter_item
135         Kaminari.paginate_array(Array.new(@model.where(self.where(filter_item)).includes(self.includes).count, nil)).page(@offset).per(@page_size)
136       end
137       
138     end
139     
140     class ThroughFilterList < FilterList
141       def initialize page, page_size, operators, item_name, list_name, conf, manifest
142         super
143         @through = @list_list_conf['through']
144       end
145       
146       def includes
147         {@through => {@from => {}} }
148       end
149       
150       def where filter_item
151         w = @model.list_where
152         w += ' and ' unless w.blank?
153         [w + @through + '.' + @filter_key + ' = ?', filter_item.id] 
154       end
155       
156     end
157     
158     @@types = {
159       'public' => PublicList, 'system_resource' => SystemResourceList, 'private' => PrivateList, 
160       'has_many' => HasManyList, 'filter' => FilterList, 'through_filter' => ThroughFilterList
161     }
162     def initialize list_manifest
163       @list_manifest = list_manifest
164       @item_name = @list_manifest.item_name
165       @manifest = @list_manifest.manifest
166       @list_conf = @list_manifest.conf
167       @lists = {}
168       @list_manifest.lists.each {|list_name, conf|
169         type = conf['type']
170         @lists[list_name] = @@types[type]
171       }
172     end
173     
174     def open list_name, page, page_size, operators
175       @lists[list_name].new page, page_size, operators, @item_name, list_name, @list_conf, @manifest
176     end
177     
178   end
179 end
180