OSDN Git Service

Merge branch 'v03_test' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v03_test
[pettanr/pettanr.git] / app / models / comic.rb
1 class Comic < ActiveRecord::Base
2   has_many :panels, :dependent => :destroy
3   belongs_to :author
4   
5   validates :title, :presence => true, :length => {:maximum => 100}\r
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   validates :editable, :presence => true, :numericality => true, :inclusion => {:in => 0..3}
10   
11   before_save do |r|
12     r.supply_default
13   end
14   
15   def supply_default
16     self.visible = 0 if self.visible.blank?
17     self.editable= 0 if self.editable.blank?
18   end
19   
20   def own? author
21     return false unless author
22     self.author_id == author.id
23   end
24   
25   def visible? author
26     self.visible > 0 or self.own?(author)
27   end
28   
29   def disp_editable
30     editable == 1 ? 'O' : 'X'
31   end
32   
33   def disp_visible
34     visible == 1 ? 'O' : 'X'
35   end
36   
37   def self.default_page_size
38     25
39   end
40   
41   def self.max_page_size
42     100
43   end
44   
45   def self.default_panel_size
46     30
47   end
48   
49   def self.max_panel_size
50     200
51   end
52   
53   def self.page prm = nil
54     page = prm.to_i
55     page = 1 if page < 1
56     page
57   end
58   
59   def self.page_size prm = self.default_page_size
60     page_size = prm.to_i
61     page_size = self.max_page_size if page_size > self.max_page_size
62     page_size = self.default_page_size if page_size < 1
63     page_size
64   end
65   
66   def self.offset cnt, prm = nil
67     offset = prm.to_i
68     offset = cnt - 1 if offset >= cnt
69     offset = cnt - offset.abs if offset < 0
70     offset = 0 if offset < 0
71     offset
72   end
73   
74   def self.panel_count cnt, prm = self.default_panel_size
75     count = prm.to_i
76     count = self.max_panel_size if count > self.max_panel_size
77     count = self.default_panel_size if count < 1
78     count
79   end
80   
81   def self.list opt = {}, page = 1, page_size = self.default_page_size
82     opt.merge!(self.list_opt) unless opt[:include]
83     opt.merge!({:conditions => ['visible > 0'], :order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size})
84     Comic.find(:all, opt)
85   end
86   
87   def self.list_opt
88     {:include => :author}
89   end
90   
91   def self.list_json_opt
92     {:include => :author}
93   end
94   
95   def self.show cid, au, opt = {}
96     c = Comic.find(cid, :include => self.show_include_opt(opt))
97     raise ActiveRecord::Forbidden unless c.visible?(au)
98     c
99   end
100   
101   def self.show_include_opt opt = {}
102     res = [:author]
103     res.push(opt[:include]) if opt[:include]
104     res
105   end
106   
107   def self.show_json_include_opt
108     {:include => :author}
109   end
110   
111   def self.play cid, opt = {}
112     Comic.find(cid, include: [
113       :author, 
114       :panels => [
115         :panel_pictures => :resource_picture, 
116         :balloons => :speaches
117       ]
118     ], order: 'panels.t, speaches.t')
119   end
120   
121   def to_json_play
122     self.to_json( :include => {:author => {}, :panels => {:methods => :panel_element}})
123   end
124   
125   def self.visible_count
126     Comic.count 'visible > 0'
127   end
128   
129 end