OSDN Git Service

merge v04
[pettanr/pettanr.git] / app / models / comic.rb
1 class Comic < ActiveRecord::Base
2   has_many :stories
3   belongs_to :author
4   
5   validates :title, :presence => true, :length => {:maximum => 100}
6   validates :width, :presence => true, :numericality => true, :natural_number => true
7   validates :height, :presence => true, :numericality => true, :natural_number => true
8   validates :visible, :presence => true, :numericality => true, :inclusion => {:in => 0..3}
9   
10   before_save do |r|
11     r.supply_default
12   end
13   
14   def supply_default
15     self.visible = 0 if self.visible.blank?
16   end
17   
18   def own? author
19     return false unless author
20     self.author_id == author.id
21   end
22   
23   def visible? author
24     self.visible > 0 or self.own?(author)
25   end
26   
27   def disp_visible
28     visible == 1 ? 'O' : 'X'
29   end
30   
31   def self.default_page_size
32     25
33   end
34   
35   def self.max_page_size
36     100
37   end
38   
39   def self.default_panel_size
40     30
41   end
42   
43   def self.max_panel_size
44     200
45   end
46   
47   def self.page prm = nil
48     page = prm.to_i
49     page = 1 if page < 1
50     page
51   end
52   
53   def self.page_size prm = self.default_page_size
54     page_size = prm.to_i
55     page_size = self.max_page_size if page_size > self.max_page_size
56     page_size = self.default_page_size if page_size < 1
57     page_size
58   end
59   
60   def self.list opt = {}, page = 1, page_size = self.default_page_size
61     opt.merge!(self.list_opt) unless opt[:include]
62     opt.merge!({:conditions => ['visible > 0'], :order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size})
63     Comic.find(:all, opt)
64   end
65   
66   def self.list_opt
67     {:include => {:stories => {:panel => {}}, :author => {}}}
68   end
69   
70   def self.list_json_opt
71     {:include => {:stories => {:panel => {}}, :author => {}}}
72   end
73   
74   def self.show cid, au, opt = {}
75     c = Comic.find(cid, :include => self.show_include_opt(opt))
76     raise ActiveRecord::Forbidden unless c.visible?(au)
77     c
78   end
79   
80   def self.show_include_opt opt = {}
81     res = {:stories => {:panel => {}}, :author => {}}
82     res.push(opt[:include]) if opt[:include]
83     res
84   end
85   
86   def self.show_json_include_opt
87     {:include => {:stories => {:panel => {}}, :author => {}}}
88   end
89   
90   def self.visible_count
91     Comic.count 'visible > 0'
92   end
93   
94 end