OSDN Git Service

t#31470:create pager
[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 || [])).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 grounds
183     ((self.ground_colors || []) + (self.ground_pictures || [])).compact
184   end
185   
186   def panel_elements
187     parts + grounds
188   end
189   
190   @@elm_json_opt = {
191     'PanelPicture' => {
192       :picture => {:artist => {}, :license => {}}
193     }, 
194     'SpeechBalloon' => {:balloons => {}, :speeches => {}},
195     'GroundPicture' => {
196       :picture => {:artist => {}, :license => {}}
197     }, 
198     'GroundColor' => {
199     }, 
200   }
201   
202   def self.elm_json_opt e
203     @@elm_json_opt[e.class.to_s]
204   end
205   
206   def elements
207     self.panel_elements.map {|e|
208       #(-_-;)<... kore wa hidoi
209       JSON.parse e.to_json({:include => Panel.elm_json_opt(e)})
210     }
211   end
212   
213   def panel_elements_as_json
214     self.to_json({:include => {:author => {}}, :methods => :elements})
215   end
216   
217   def self.list_as_json_text ary
218     '[' + ary.map {|i| i.panel_elements_as_json }.join(',') + ']'
219   end
220   
221   def scenario
222     panel_elements.map { |e|
223       e.scenario
224     }.join
225   end
226   
227   def plain_scenario
228     panel_elements.map { |e|
229       e.plain_scenario
230     }.join
231   end
232   
233   def licensed_pictures
234     r = {}
235     ((self.panel_pictures || []) + (self.ground_pictures || [])).compact.each do |elm|
236       r[elm.picture_id] = elm.picture unless r[elm.picture_id]
237     end
238     r
239   end
240   
241   def self.visible_count
242     Panel.count
243   end
244   
245   def self.collect_element_value elements, name
246     elements.map {|e|
247       e.map {|o|
248         if o['_destroy'] or o[:_destroy]
249           nil
250         else
251           o[name]
252         end
253       }.compact
254     }.flatten
255   end
256   
257   def self.validate_t ary
258     i = 0
259     ary.compact.sort.each do |t|
260       break false unless t == i
261       i += 1
262     end
263     ary.compact.size == i
264   end
265   
266   def self.validate_element_t elements, name
267     Panel.validate_t(Panel.collect_element_value(elements, name))
268   end
269   
270   def self.validate_elements_t c
271     c.map {|conf|
272       Panel.validate_element_t(conf[:elements], conf[:name]) ? nil : false
273     }.compact.empty?
274   end
275   
276   def validate_t_list
277     [
278       {:elements => [self.panel_pictures, self.speech_balloons], :name => :t}
279     ]
280   end
281   def validate_child
282 #    r1 = Panel.validate_elements_id validate_id_list
283     Panel.validate_elements_t validate_t_list
284   end
285   
286   def store attr, au
287     if attr == false
288       self.errors.add :base, I18n.t('errors.invalid_json')
289       return false
290     end
291     self.attributes = attr
292     self.overwrite au
293     res = false
294     Panel.transaction do
295       res = self.save
296       unless validate_child
297         self.errors.add :base, I18n.t('errors.invalid_t')
298         raise ActiveRecord::Rollback
299       end
300     end
301     res
302   end
303   
304   def destroy_with_elements
305     res = false
306     Panel.transaction do
307       self.panel_elements.each do |element|
308         raise ActiveRecord::Rollback unless element.destroy
309       end
310       raise ActiveRecord::Rollback unless self.destroy
311       res = true
312     end
313     res
314   end
315   
316 =begin
317   def self.validate_id ary, pid
318     ary.map {|v|
319       if pid
320         (v == pid or v == nil) ? nil : false
321       else
322         v ? false : nil
323       end
324     }.compact.empty?
325   end
326   
327   def self.validate_element_id elements, name, pid
328     Panel.validate_id(Panel.collect_element_value(elements, name), pid)
329   end
330   
331   def self.validate_elements_id c
332     c.map {|conf|
333       Panel.validate_element_id(conf[:elements], conf[:name], conf[:parent_id]) ? nil : false
334     }.compact.empty?
335   end
336   
337   def validate_id_list
338     r = self.speech_balloons.map {|sb|
339       {:elements => [sb.speeches, sb.balloons], :name => :speech_balloon_id, :parent_id => sb.id}
340     }
341     r.unshift({:elements => [self.panel_pictures, self.speech_balloons], :name => :panel_id, :parent_id => self.id})
342     r
343   end
344 =end
345   
346 end