OSDN Git Service

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