OSDN Git Service

'sync'
[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.offset cnt, prm = nil
61     offset = prm.to_i
62     offset = cnt - 1 if offset >= cnt
63     offset = cnt - offset.abs if offset < 0
64     offset = 0 if offset < 0
65     offset
66   end
67   
68   def self.panel_count cnt, prm = self.default_panel_size
69     count = prm.to_i
70     count = self.max_panel_size if count > self.max_panel_size
71     count = self.default_panel_size if count < 1
72     count
73   end
74   
75   def self.list opt = {}, page = 1, page_size = self.default_page_size
76     opt.merge!(self.list_opt) unless opt[:include]
77     opt.merge!({:conditions => ['visible > 0'], :order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size})
78     Comic.find(:all, opt)
79   end
80   
81   def self.list_opt
82     {:include => {:stories => {:panel => {}}, :author => {}}}
83   end
84   
85   def self.list_json_opt
86     {:include => {:stories => {:panel => {}}, :author => {}}}
87   end
88   
89   def self.show cid, au, opt = {}
90     c = Comic.find(cid, :include => self.show_include_opt(opt))
91     raise ActiveRecord::Forbidden unless c.visible?(au)
92     c
93   end
94   
95   def self.show_include_opt opt = {}
96     res = {:stories => {:panel => {}}, :author => {}}
97     res.push(opt[:include]) if opt[:include]
98     res
99   end
100   
101   def self.show_json_include_opt
102     {:include => {:stories => {:panel => {}}, :author => {}}}
103   end
104   
105   def self.play cid, opt = {}
106     Comic.find(cid, include: [
107       :author, 
108       :panels => [
109         :panel_pictures => :resource_picture, 
110         :speech_balloons =>{:balloons => {}, :speeches => {}}
111       ]
112     ], order: 'panels.t')
113   end
114   
115   def to_json_play
116     self.to_json( :include => {:author => {}, :panels => {:methods => :panel_element}})
117   end
118   
119   def self.visible_count
120     Comic.count 'visible > 0'
121   end
122   
123 end