OSDN Git Service

3ac07653627d77e09e1e163bd368f489325be413
[pettanr/pettanr.git] / lib / manifest / list.rb
1
2 module Pettanr
3   class ListManager
4     class PublicList
5       def initialize page, page_size, operators, item_name, conf, manifest
6         @item_name = item_name
7         @conf = conf
8         @manifest = manifest
9         @default_page_size = @conf['default_page_size'] || 25
10         @max_page_size = @conf['max_page_size'] || 100
11         @page = self.page_number(page) 
12         @page_size = self.page_size page_size
13         @operators = operators
14         
15         @model = @item_name.classify.constantize
16         @offset = (@page -1) * @page_size
17       end
18       
19       def page_number prm = nil
20         page = prm.to_i
21         page = 1 if page < 1
22         page
23       end
24       
25       def page_size prm
26         page_size = prm.to_i
27         page_size = @max_page_size if page_size > @max_page_size
28         page_size = @default_page_size if page_size < 1
29         page_size
30       end
31       
32       def where
33         @model.list_where
34       end
35       
36       def items
37         @model.where(self.where()).includes(@model.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
38       end
39       
40       def paginate
41         @model.list_paginate(@page, @page_size)
42       end
43       
44     end
45     
46     class PrivateList
47       def initialize page, page_size, operators, item_name, conf, manifest
48         @page = page
49         @page_size = page_size
50         @operators = operators
51         @item_name = item_name
52         @conf = conf
53         @manifest = manifest
54         
55         @model = @item_name.classify.constantize
56       end
57       
58       def where 
59         case @model.owner_type
60         when :author
61           operator = @operators.author
62         when :artist
63           operator = @operators.artist
64         end
65         [@model.plural + '.' + @model.owner_type.to_s + '_id = ?', operator.id]
66       end
67       
68       def items
69         @model.where(self.where()).includes(@model.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
70       end
71       
72       def paginate
73         @model.list_paginate(@page, @page_size)
74       end
75       
76     end
77     
78     class HasManyList
79       def initialize page, page_size, operators, item_name, conf, manifest
80         @page = page
81         @page_size = page_size
82         @operators = operators
83         @item_name = item_name
84         @conf = conf
85         @manifest = manifest
86         
87         @model = @item_name.classify.constantize
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(@model.list_opt).order(@model.list_order).offset(@offset).limit(@page_size)
104       end
105       
106       def paginate
107         @model.list_paginate(@page, @page_size)
108       end
109       
110     end
111     
112     class FilterList
113       def initialize page, page_size, operators, item_name, conf, manifest
114         @page = page
115         @page_size = page_size
116         @operators = operators
117         @item_name = item_name
118         @conf = conf
119         @manifest = manifest
120         
121         @model = @item_name.classify.constantize
122         @filter_key = @conf['filter_key']
123       end
124       
125       def items filter_item
126         @model.filtered_list filter_item, @filter_key, @operators, @page, @page_size
127       end
128       
129       def paginate filter_item
130         @model.list_paginate(filter_item, @filter_key, @operators, @page, @page_size)
131       end
132       
133     end
134     
135     @@types = {'public' => PublicList, 'private' => PrivateList, 'has_many' => HasManyList, 'filter' => FilterList}
136     def initialize list_manifest
137       @list_manifest = list_manifest
138       @item_name = @list_manifest.item_name
139       @manifest = @list_manifest.manifest
140       @list_conf = @list_manifest.conf
141       @lists = {}
142       @list_manifest.lists.each {|list_name, conf|
143         type = conf['type']
144         @lists[list_name] = @@types[type]
145       }
146     end
147     
148     def open list_name, page, page_size, operators
149       @lists[list_name].new page, page_size, operators, @item_name, @list_conf, @manifest
150     end
151     
152   end
153 end
154