OSDN Git Service

Merge branch 'v05dev' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v06
[pettanr/pettanr.git] / app / models / panel.rb
1 #コマ
2 class Panel < ActiveRecord::Base
3   belongs_to :author
4   belongs_to :resource_picture
5   has_many :stories
6   has_many :panel_pictures, :dependent => :destroy
7   has_many :speech_balloons, :dependent => :destroy
8   has_many :ground_pictures, :dependent => :destroy
9   has_many :ground_colors, :dependent => :destroy
10   has_many :panel_colors, :dependent => :destroy
11   accepts_nested_attributes_for :panel_pictures, :allow_destroy => true
12   accepts_nested_attributes_for :speech_balloons, :allow_destroy => true
13   accepts_nested_attributes_for :ground_pictures, :allow_destroy => true
14   accepts_nested_attributes_for :ground_colors, :allow_destroy => true
15   accepts_nested_attributes_for :panel_colors, :allow_destroy => true
16
17   validates :width, :presence => true, :numericality => true, :natural_number => true
18   validates :height, :presence => true, :numericality => true, :natural_number => true
19   validates :border, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
20   validates :x, :numericality => {:allow_blank => true}
21   validates :y, :numericality => {:allow_blank => true}
22   validates :z, :numericality => {:allow_blank => true, :greater_than => 0}
23   validates :author_id, :presence => true, :numericality => true, :existence => {:both => false}
24   validates :publish, :presence => true, :numericality => true
25   
26   before_validation :valid_encode
27   
28   def valid_encode
29     ['caption'].each do |a|
30       next if attributes[a] == nil
31       raise Pettanr::BadRequest unless attributes[a].valid_encoding?
32     end
33   end
34   
35   def supply_default
36     self.border = 2
37     self.publish = 0
38   end
39   
40   def overwrite au
41     self.author_id = au.id
42   end
43   
44   def own? roles
45     roles = [roles] unless roles.respond_to?(:each)
46     au = Panel.get_author_from_roles roles
47     return false unless au
48     self.author_id == au.id
49   end
50   
51   def visible? roles
52     if MagicNumber['run_mode'] == 0
53       return false unless guest_role_check(roles)
54     else
55       return false unless reader_role_check(roles)
56     end
57     return true if self.own?(roles)
58     self.publish?
59   end
60   
61   def usable? au
62     visible? au
63   end
64   
65   def publish?
66     self.publish > 0
67   end
68   
69   def self.default_page_size
70     25
71   end
72   
73   def self.max_page_size
74     100
75   end
76   
77   def self.page prm = nil
78     page = prm.to_i
79     page = 1 if page < 1
80     page
81   end
82   
83   def self.page_size prm = self.default_page_size
84     page_size = prm.to_i
85     page_size = self.max_page_size if page_size > self.max_page_size
86     page_size = self.default_page_size if page_size < 1
87     page_size
88   end
89   
90   def self.list page = 1, page_size = self.default_page_size
91     opt = {}
92     opt.merge!(self.list_opt)
93     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
94     opt.merge!({:conditions => 'panels.publish > 0', :order => 'panels.updated_at desc'})
95     Panel.find(:all, opt)
96   end
97   
98   def self.list_opt
99     {:include => {
100       :panel_pictures => {
101         :picture => {:artist => {}, :license => {}}
102       }, 
103       :speech_balloons => {:balloons => {}, :speeches => {}},
104       :ground_pictures => {
105         :picture => {:artist => {}, :license => {}}
106       }, 
107       :ground_colors => {
108         :color => {}
109       }, 
110       :panel_colors => {
111       }, 
112       :author => {}
113     }}
114   end
115   
116   def self.mylist au, page = 1, page_size = Author.default_panel_page_size
117     opt = {}
118     opt.merge!(self.list_opt)
119     opt.merge!({:limit => page_size, :offset => (page -1) * page_size}) if page_size > 0
120     opt.merge!({:conditions => ['panels.author_id = ?', au.id], :order => 'panels.updated_at desc'})
121     Panel.find(:all, opt)
122   end
123   
124   def self.show rid, roles
125     opt = {}
126     opt.merge!(Panel.show_opt)
127     res = Panel.find(rid, opt)
128     raise ActiveRecord::Forbidden unless res.visible?(roles)
129     res
130   end
131   
132   def self.edit rid, au
133     opt = {}
134     opt.merge!(Panel.show_opt)
135     res = Panel.find(rid, opt)
136     raise ActiveRecord::Forbidden unless res.own?(au)
137     res
138   end
139   
140   def self.show_opt
141     {:include => {
142       :panel_pictures => {
143         :picture => {:artist => {}, :license => {}}
144       }, 
145       :speech_balloons => {:balloons => {}, :speeches => {}},
146       :ground_pictures => {
147         :picture => {:artist => {}, :license => {}}
148       }, 
149       :ground_colors => {
150         :color => {}
151       }, 
152       :panel_colors => {
153       }, 
154       :author => {}
155     }}
156   end
157   
158   def parts_element
159     ((self.panel_pictures || []) + (self.speech_balloons || [])).compact
160   end
161   
162   def parts
163     res = []
164     self.parts_element.each do |e|
165       res[e.t] = e
166     end
167     res
168   end
169   
170   def grounds
171     ((self.ground_colors || []) + (self.ground_pictures || []) + (self.panel_colors || [])).compact
172   end
173   
174   def panel_elements
175     parts + grounds
176   end
177   
178   @@elm_json_opt = {
179     'PanelPicture' => {
180       :picture => {:artist => {}, :license => {}}
181     }, 
182     'SpeechBalloon' => {:balloons => {}, :speeches => {}},
183     'GroundPicture' => {
184       :picture => {:artist => {}, :license => {}}
185     }, 
186     'GroundColor' => {
187       :color => {}
188     }, 
189     'PanelColor' => {
190     } 
191   }
192   
193   def self.elm_json_opt e
194     @@elm_json_opt[e.class.to_s]
195   end
196   
197   def elements
198     self.panel_elements.map {|e|
199       #(-_-;)<... kore wa hidoi
200       JSON.parse e.to_json({:include => Panel.elm_json_opt(e)})
201     }
202   end
203   
204   def panel_elements_as_json
205     self.to_json({:include => {:author => {}}, :methods => :elements})
206   end
207   
208   def self.list_as_json_text ary
209     '[' + ary.map {|i| i.panel_elements_as_json }.join(',') + ']'
210   end
211   
212   def scenario
213     panel_elements.map { |e|
214       e.scenario
215     }.join
216   end
217   
218   def plain_scenario
219     panel_elements.map { |e|
220       e.plain_scenario
221     }.join
222   end
223   
224   def licensed_pictures
225     r = {}
226     ((self.panel_pictures || []) + (self.ground_pictures || [])).compact.each do |elm|
227       r[elm.picture_id] = elm.picture unless r[elm.picture_id]
228     end
229     r
230   end
231   
232   def self.visible_count
233     Panel.count
234   end
235   
236   def self.collect_element_value elements, name
237     elements.map {|e|
238       e.map {|o|
239         o[name]
240       }
241     }.flatten
242   end
243   
244   def self.validate_t ary
245     i = 0
246     ary.compact.sort.each do |t|
247       break false unless t == i
248       i += 1
249     end
250     ary.compact.size == i
251   end
252   
253   def self.validate_element_t elements, name
254     Panel.validate_t(Panel.collect_element_value(elements, name))
255   end
256   
257   def self.validate_elements_t c
258     c.map {|conf|
259       Panel.validate_element_t(conf[:elements], conf[:name]) ? nil : false
260     }.compact.empty?
261   end
262   
263   def validate_t_list
264     [
265       {:elements => [self.panel_pictures, self.speech_balloons], :name => :t}
266     ]
267   end
268   def validate_child
269 #    r1 = Panel.validate_elements_id validate_id_list
270     Panel.validate_elements_t validate_t_list
271   end
272   
273   def store attr, au
274     if attr == false
275       self.errors.add :base, I18n.t('errors.invalid_json')
276       return false
277     end
278     self.attributes = attr
279     self.overwrite au
280     res = false
281     Panel.transaction do
282       unless validate_child
283         self.errors.add :base, I18n.t('errors.invalid_t')
284         raise ActiveRecord::Rollback
285       end
286       res = self.save
287     end
288     res
289   end
290   
291   def destroy_with_elements
292     res = false
293     Panel.transaction do
294       self.panel_elements.each do |element|
295         raise ActiveRecord::Rollback unless element.destroy
296       end
297       raise ActiveRecord::Rollback unless self.destroy
298       res = true
299     end
300     res
301   end
302   
303 =begin
304   def self.validate_id ary, pid
305     ary.map {|v|
306       if pid
307         (v == pid or v == nil) ? nil : false
308       else
309         v ? false : nil
310       end
311     }.compact.empty?
312   end
313   
314   def self.validate_element_id elements, name, pid
315     Panel.validate_id(Panel.collect_element_value(elements, name), pid)
316   end
317   
318   def self.validate_elements_id c
319     c.map {|conf|
320       Panel.validate_element_id(conf[:elements], conf[:name], conf[:parent_id]) ? nil : false
321     }.compact.empty?
322   end
323   
324   def validate_id_list
325     r = self.speech_balloons.map {|sb|
326       {:elements => [sb.speeches, sb.balloons], :name => :speech_balloon_id, :parent_id => sb.id}
327     }
328     r.unshift({:elements => [self.panel_pictures, self.speech_balloons], :name => :panel_id, :parent_id => self.id})
329     r
330   end
331 =end
332   
333 end