OSDN Git Service

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