1 class Panel < ActiveRecord::Base
4 belongs_to :resource_picture
5 # belongs_to :background_picture, :class_name => 'ResourcePicture'
6 has_many :panel_pictures, :dependent => :destroy
7 has_many :speech_balloons, :dependent => :destroy
8 accepts_nested_attributes_for :panel_pictures, :allow_destroy => true
9 accepts_nested_attributes_for :speech_balloons, :allow_destroy => true
11 # validates :comic_id, :presence => true, :numericality => true, :existence => true, :uniqueness => {:scope => :t}
12 validates :resource_picture_id, :numericality => {:allow_blank => true}
13 validates :width, :presence => true, :numericality => true, :natural_number => true
14 validates :height, :presence => true, :numericality => true, :natural_number => true
15 validates :border, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
16 validates :x, :numericality => {:allow_blank => true}
17 validates :y, :numericality => {:allow_blank => true}
18 validates :z, :numericality => {:allow_blank => true, :greater_than => 0}
19 validates :t, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
20 validates :author_id, :presence => true, :numericality => true, :existence => true
23 return false unless au
24 c = self.comic_id ? Comic.show(self.comic_id, au) : nil
26 self.width = c.width if self.width.blank?
27 self.height = c.height if self.height.blank?
28 self.t = Panel.new_t(c.id) if self.t.blank? and self.new_record?
30 self.border = 0 if self.border.blank?
31 self.author_id = au.id
34 def self.new_t comic_id
35 r = Panel.max_t(comic_id)
36 r.blank? ? 0 : r.to_i + 1
39 def self.max_t comic_id
40 Panel.maximum(:t, :conditions => ['comic_id = ?', comic_id])
43 def self.find_t comic_id, t
44 Panel.find(:first, :conditions => ['comic_id = ? and t = ?', comic_id, t])
47 #更新する時にPanelIDをチェックしとかないと勝手に所属先を変えられるゾ!?
52 f = Panel.find_t(self.comic_id, self.t) if self.t
54 Panel.update_all('t = t + 1', ['comic_id = ? and t >= ?', self.comic_id, self.t])
56 self.t = Panel.new_t self.comic_id
62 return true if self.t == new_t
64 Panel.update_all('t = t + 1', ['comic_id = ? and (t >= ? and t < ?)', self.comic_id, new_t, self.t])
66 nf = Panel.find_t(self.comic_id, new_t)
67 max_t = Panel.max_t.to_i self.comic_id
68 new_t = max_t if new_t > max_t
69 Panel.update_all('t = t - 1', ['comic_id = ? and (t > ? and t <= ?)', self.comic_id, self.t, new_t])
75 def destroy_and_shorten
76 Panel.update_all('t = t - 1', ['comic_id = ? and (t > ?)', self.comic_id, self.t])
80 def self.default_page_size
84 def self.max_page_size
88 def self.page prm = nil
94 def self.page_size prm = self.default_page_size
96 page_size = self.max_page_size if page_size > self.max_page_size
97 page_size = self.default_page_size if page_size < 1
101 def self.offset cnt, prm = nil
103 offset = cnt - 1 if offset >= cnt
104 offset = cnt - offset.abs if offset < 0
105 offset = 0 if offset < 0
109 def self.list opt = {}, page = 1, page_size = self.default_page_size
110 opt.merge!(self.list_opt) unless opt[:include]
111 opt.merge!({:order => 'updated_at desc', :limit => page_size, :offset => (page -1) * page_size})
112 Panel.find(:all, opt)
119 :resource_picture => {:artist => {}, :license => {}}
121 :speech_balloons => {:balloons => {}, :speeches => {}},
126 def self.list_json_opt
128 :comic => {:author => {}},
130 :resource_picture => {:artist => {}, :license => {}}
132 :speech_balloons => {:balloons => {}, :speeches => {}},
137 def self.show rid, au, opt = {}
138 r = Panel.find(rid, :include => self.show_include_opt(opt))
139 raise ActiveRecord::Forbidden unless r.visible?(au)
143 def self.show_include_opt opt = {}
147 :resource_picture => {:artist => {}, :license => {}}
149 :speech_balloons => {:balloons => {}, :speeches => {}},
152 res.merge!(opt[:include]) if opt[:include]
156 def self.show_json_include_opt
158 :comic => {:author => {}},
160 :resource_picture => {:artist => {}, :license => {}}
162 :speech_balloons => {:balloons => {}, :speeches => {}},
168 return false unless au
169 return false unless self.comic
170 self.comic.visible?(au) or self.author_id == au.id
174 return false unless author
175 self.author_id == author.id
180 self.panel_pictures.each do |picture|
181 pe[picture.t] = picture
183 self.speech_balloons.each do |sb|
190 self.sort_by_time.each do |e|
197 self.each_element do |elm|
198 if elm.kind_of?(PanelPicture)
199 res[elm.t] = elm.to_json({:include => :resource_picture})
201 if elm.kind_of?(SpeechBalloon)
202 res[elm.t] = elm.to_json({:include => {:balloons => {}, :speeches => {}}})
209 self.to_json :methods => :panel_elements
212 def self.visible_count