OSDN Git Service

09f55105e5bfa36f58e6778a0a0f642cab35545a
[pettanr/pettanr.git] / lib / manifest / list_group / list / play.rb
1 module Manifest
2   module ListGroupModule
3     module ListModule
4       class PlayList
5         attr :list_group, :list_name, :list_manifest
6         
7         def initialize list_group, list_name, list_manifest
8           @list_group = list_group
9           @list_name = list_name
10           @list_manifest = list_manifest
11           self.set_default
12           self.init
13         end
14         
15         def set_default
16           return
17           @default_page_size = @conf['default_page_size'] || 25
18           @max_page_size = @conf['max_page_size'] || 100
19           @params_offset = params_offset
20           @params_count = params_count
21           @list_list_conf = @manifest.list(@item_name).lists[list_name] || {}
22           @model_name = @list_list_conf['model']
23           @filter_key = @list_list_conf['filter_key']
24           @model = @model_name.classify.constantize
25           @table_name = @model.table_name
26           if @model.content?
27             @owner_model = @model.owner_model
28             @owner_table_name = @owner_model.table_name if @owner_model
29           end
30         end
31         
32         def init
33         end
34         
35         def offset cnt, prm = nil
36           offset = prm.to_i
37           offset = cnt - 1 if offset >= cnt
38           offset = cnt - offset.abs if offset < 0
39           offset = 0 if offset < 0
40           offset
41         end
42         
43         def limit prm
44           prm ||= @default_page_size
45           count = prm.to_i
46           count = @max_page_size if count > @max_page_size
47           count = @default_page_size if count < 1
48           count
49         end
50         
51         def count filter_item
52           @count ||= @model.count(:conditions => self.where(filter_item), :include => self.includes).to_i
53         end
54         
55         def where filter_item
56           w = @model.list_where
57           w += ' and ' unless w.blank?
58           [w + @table_name + '.' + @filter_key + ' = ?', filter_item.id] 
59         end
60         
61         def includes
62           {@owner_model.item_name => {}}
63         end
64         
65         def order
66           @table_name + '.t'
67         end
68         
69         def items filter_item
70           c  = @count || self.count(filter_item)
71           o  = self.offset c, @offset
72           l  = self.limit @count
73           @model.where(self.where(filter_item)).includes(self.includes).order(self.order).offset(o).limit(l)
74         end
75         
76         def prev_offset filter_item
77           c  = @count || self.count(filter_item)
78           o  = self.offset c, @offset
79           l  = self.limit @count
80           if o > 0
81             if o - l < 0
82               0
83             else
84               o - l
85             end
86           else
87             nil
88           end
89         end
90         
91         def next_offset filter_item
92           c  = @count || self.count(filter_item)
93           o  = self.offset c, @offset
94           l  = self.limit @count
95           if o + l > c
96             nil
97           else
98             o + l
99           end
100         end
101         
102         def self.add_action item_name, action_name, list_name, list_conf
103           return
104         end
105       end
106       
107     end
108   end
109 end