OSDN Git Service

t#:
[pettanr/pettanr.git] / app / models / sheet_panel.rb
1 class SheetPanel < ActiveRecord::Base
2   belongs_to :author
3   belongs_to :panel
4   belongs_to :sheet
5   
6   validates :sheet_id, :numericality => {:allow_blank => true}
7   validates :panel_id, :numericality => {:allow_blank => true}
8   validates :author_id, :presence => true, :numericality => true, :existence => {:both => false}
9   validates :x, :presence => true, :numericality => true
10   validates :y, :presence => true, :numericality => true
11   validates :z, :presence => true, :numericality => {:greater_than => 0}
12   validates :t, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
13   
14   def supply_default
15 #    self.sheet_id = nil
16 #    self.panel_id = nil
17     self.x = 15
18     self.y = 15
19     if self.sheet
20       self.t = self.sheet.new_t 
21       self.z = self.sheet.new_z 
22     else
23       self.z = 1
24       self.t = nil
25     end
26   end
27   
28   def overwrite au
29     return false unless au
30     self.author_id = au.id
31   end
32   
33   def own? roles
34     roles = [roles] unless roles.respond_to?(:each)
35     au = SheetPanel.get_author_from_roles roles
36     return false unless au
37     self.author_id == au.id
38   end
39   
40   def visible? roles
41     if MagicNumber['run_mode'] == 0
42       return false unless guest_role_check(roles)
43     else
44       return false unless reader_role_check(roles)
45     end
46     return true if self.sheet.own?(roles)
47     self.sheet.visible? roles
48   end
49   
50   def self.default_page_size
51     25
52   end
53   
54   def self.max_page_size
55     100
56   end
57   
58   def self.page prm = nil
59     page = prm.to_i
60     page = 1 if page < 1
61     page
62   end
63   
64   def self.page_size prm = self.default_page_size
65     page_size = prm.to_i
66     page_size = self.max_page_size if page_size > self.max_page_size
67     page_size = self.default_page_size if page_size < 1
68     page_size
69   end
70   
71   def self.play_list_where cid
72     ['sheet_panels.sheet_id = ?', cid]
73   end
74   
75   def self.list_where
76     'sheets.visible > 0'
77   end
78   
79   def self.mylist_where au
80     ['sheet_panels.author_id = ?', au.id]
81   end
82   
83   def self.himlist_where au
84     ['sheet_panels.author_id = ? and sheets.visible > 0', au.id]
85   end
86   
87   def self.play_list sheet, author
88     SheetPanel.where(self.play_list_where(sheet.id)).includes(SheetPanel.list_opt).order('sheet_panels.t')
89   end
90   
91   def self.list page = 1, page_size = self.default_page_size
92     SheetPanel.where(self.list_where()).includes(SheetPanel.list_opt).order('sheet_panels.updated_at desc').offset((page -1) * page_size).limit(page_size)
93   end
94   
95   def self.mylist au, page = 1, page_size = Author.default_sheet_panel_page_size
96     SheetPanel.where(self.mylist_where(au)).includes(SheetPanel.list_opt).order('sheet_panels.updated_at desc').offset((page -1) * page_size).limit(page_size)
97   end
98   
99   def self.himlist au, page = 1, page_size = Author.default_sheet_panel_page_size
100     SheetPanel.where(self.himlist_where(au)).includes(SheetPanel.list_opt).order('sheet_panels.updated_at desc').offset((page -1) * page_size).limit(page_size)
101   end
102   
103   def self.list_paginate page = 1, page_size = self.default_page_size
104     Kaminari.paginate_array(Array.new(SheetPanel.where(self.list_where()).includes(SheetPanel.list_opt).count, nil)).page(page).per(page_size)
105   end
106   
107   def self.mylist_paginate au, page = 1, page_size = Author.default_sheet_panel_page_size
108     Kaminari.paginate_array(Array.new(SheetPanel.where(self.mylist_where(au)).includes(SheetPanel.list_opt).count, nil)).page(page).per(page_size)
109   end
110   
111   def self.himlist_paginate au, page = 1, page_size = Author.default_sheet_panel_page_size
112     Kaminari.paginate_array(Array.new(SheetPanel.where(self.himlist_where(au)).includes(SheetPanel.list_opt).count, nil)).page(page).per(page_size)
113   end
114   
115   def self.list_opt
116     {
117       :author => {}, 
118       :sheet => {
119         :author => {}
120       }, 
121       :panel => {
122         :author => {}, 
123         :panel_pictures => {:picture => {:artist => {}, :license => {}}}, 
124         :speech_balloons =>{:balloon => {}, :speech => {}}
125       }
126     }
127   end
128   
129   def self.list_json_opt
130     {:include => {
131       :author => {}, 
132       :sheet => {
133         :author => {}
134       }, 
135       :panel => {
136         :author => {}, 
137         :panel_pictures => {:picture => {:artist => {}, :license => {}}}, 
138         :speech_balloons =>{:balloon => {}, :speech => {}}
139       }
140     }}
141   end
142   
143   def self.show spid, roles
144     opt = {}
145     opt.merge!(SheetPanel.show_opt)
146     res = SheetPanel.find spid, opt
147     raise ActiveRecord::Forbidden unless res.visible?(roles)
148     res
149   end
150   
151   def self.edit spid, au
152     opt = {}
153     opt.merge!(SheetPanel.show_opt)
154     res = SheetPanel.find spid, opt
155     raise ActiveRecord::Forbidden unless res.own?(au)
156     res
157   end
158   
159   def self.show_opt
160     {:include => {
161       :author => {}, 
162       :sheet => {
163         :author => {}
164       }, 
165       :panel => {
166         :author => {}, 
167         :panel_pictures => {:picture => {:artist => {}, :license => {}}}, 
168         :speech_balloons =>{:balloon => {}, :speech => {}}
169       }
170     }}
171   end
172   
173   def elements
174     self.panel.elements
175   end
176   
177   def sheet_panel_as_json au
178     panel_include = if self.panel and self.panel.visible?(au)
179       {:include => {:author => {}}, :methods => :elements}
180     else
181       {:include => {:author => {}}}
182     end
183     self.to_json({:include => {:sheet => {:include => {:author => {}}}, :author => {}, :panel => panel_include}})
184   end
185   
186   def self.list_as_json_text ary, au
187     '[' + ary.map {|i| i.sheet_panel_as_json(au) }.join(',') + ']'
188   end
189   
190   def licensed_pictures
191     if self.panel
192       self.panel.licensed_pictures
193     else
194       {}
195     end
196   end
197   
198     def self.panelize elements_attributes
199       elements_attributes = [elements_attributes] unless elements_attributes.is_a?(Array)
200       hash = {}
201       index = 0
202       elements_attributes.each do |element_attributes|
203         hash[self.to_s.tableize + '_attributes'] ||= {}
204         n = if element_attributes['id']
205           element_attributes['id'].to_s
206         else
207           index += 1
208           'new' + index.to_s 
209         end
210         hash[self.to_s.tableize + '_attributes'][n] = element_attributes
211       end
212       hash
213     end
214     
215     def copy_attributes
216       r = self.attributes
217       r.delete 'id'
218       r.delete 'sheet_id'
219       r.delete 'created_at'
220       r.delete 'updated_at'
221       r
222     end
223     
224   def self.new_t sheet_id
225     r = SheetPanel.max_t(sheet_id)
226     r.blank? ? 0 : r.to_i + 1
227   end
228   
229   def self.max_t sheet_id
230     SheetPanel.maximum(:t, :conditions => ['sheet_id = ?', sheet_id])
231   end
232   
233   def self.find_t sheet_id, t
234     SheetPanel.find(:first, :conditions => ['sheet_id = ? and t = ?', sheet_id, t])
235   end
236   
237   def self.collect_t sheet_panel
238     r = SheetPanel.find(:all, :conditions => ['sheet_id = ?', sheet_panel.sheet_id], :order => 't')
239     r.map {|sp| sp.t}
240   end
241   
242   def self.serial? ary
243     i = 0
244     ary.compact.sort.each do |t|
245       break false unless t == i
246       i += 1
247     end
248     ary.compact.size == i
249   end
250   
251   def self.validate_t sheet_panel
252     SheetPanel.serial?(SheetPanel.collect_t(sheet_panel))
253   end
254   
255   def insert_shift
256     SheetPanel.update_all('t = t + 1', ['sheet_id = ? and t >= ?', self.sheet_id, self.t])
257   end
258   
259   def lesser_shift old_t
260     self.t = 0 if self.t < 0
261     SheetPanel.update_all('t = t + 1', ['sheet_id = ? and (t >= ? and t < ?)', self.sheet_id, self.t, old_t])
262   end
263   
264   def higher_shift old_t
265     nf = SheetPanel.find_t(self.sheet_id, self.t)
266     max_t = SheetPanel.max_t(self.sheet_id).to_i
267     self.t = max_t if self.t > max_t
268     SheetPanel.update_all('t = t - 1', ['sheet_id = ? and (t > ? and t <= ?)', self.sheet_id, old_t, self.t])
269   end
270   
271   def update_shift old_t
272     if self.t > old_t
273       higher_shift old_t
274     else
275       lesser_shift old_t
276     end
277   end
278   
279   def rotate old_t = nil
280     if self.new_record?
281       if self.t.blank?
282         self.t = SheetPanel.new_t self.sheet_id
283       else
284         self.insert_shift
285       end
286     else
287       if self.t.blank?
288       else
289         self.update_shift old_t
290       end
291     end
292   end
293   
294   def allow?
295     return nil if self.sheet_id == nil or self.panel_id == nil
296     self.sheet.own?(self.author) and self.panel.usable?(self.author)
297   end
298   
299   def store old_t = nil
300     res = false
301     SheetPanel.transaction do
302       case self.allow?
303       when true
304         self.rotate old_t
305       when false
306         raise ActiveRecord::Forbidden
307       else
308       end
309       res = self.save
310       raise ActiveRecord::Rollback unless res
311       res = SheetPanel.validate_t(self) 
312       unless res
313         self.errors.add :t, 'unserialized'
314         raise ActiveRecord::Rollback 
315       end
316     end
317     res
318   end
319   
320   def destroy_and_shorten
321     res = false
322     SheetPanel.transaction do
323       SheetPanel.update_all('t = t - 1', ['sheet_id = ? and (t > ?)', self.sheet_id, self.t])
324       raise ActiveRecord::Rollback unless self.destroy
325       res = true
326     end
327     res
328   end
329   
330     # element.rb
331     def self.colum_structures
332       @@colum_structures ||= {
333       }
334     end
335     
336     def self.path_name with_engine = false
337       self.to_s.tableize
338     end
339     
340     def new_index
341       @new_index
342     end
343     
344     def new_index= v
345       @new_index = v
346     end
347     
348     def new_sheet
349       @new_sheet
350     end
351     
352     def new_sheet= v
353       @new_sheet = v
354     end
355     
356     def get_sheet
357       self.sheet || @new_sheet
358     end
359     
360     def tag_id c = nil
361       'sheet' + self.tag_sheet_id + self.tag_element_type + self.tag_element_id + c.to_s
362     end
363     
364     def field_tag_id f
365       self.tag_id + f.to_s
366     end
367     
368     def tag_sheet_id
369       self.get_sheet == nil or self.get_sheet.new_record? ? '0' : self.get_sheet.id.to_s
370     end
371     
372     def tag_element_id
373       self.new_record? ? '0' : self.id.to_s
374     end
375     
376     def tag_element_type
377       'sheet_panel'
378     end
379     
380     def tag_new_index
381       self.new_index.to_s
382     end
383     
384     def path_name with_engine = false
385       self.class.path_name(with_engine)
386     end
387     
388     def form_template with_engine = false
389       self.path_name(with_engine) + '/form'
390     end
391     
392     def scenario_template with_engine = false
393       self.path_name(with_engine) + '/scenario'
394     end
395     
396     def element_face_template with_engine = false
397       self.path_name(with_engine) + '/element_face'
398     end
399     
400     def form_helper_template(colum_name)
401       self.class.colum_structures[colum_name][:helper]
402     end
403     
404     def tag_attributes column = nil, opt = {}
405       {
406         :id => self.field_tag_id(column), :sheet_id => self.tag_sheet_id, 
407         :element_id => self.tag_element_id, :element_type => self.tag_element_type
408       }.merge(opt)
409     end
410     
411     def field_tag_attributes column, no_attr, opt = {}
412       self.tag_attributes(column).merge(
413         {:column => column, :new_index => self.tag_new_index, :no_attr => no_attr}
414       ).merge(opt)
415     end
416     
417     #render element by body
418     def any_tag_attributes name = nil, opt = {}
419       r = self.tag_attributes(name)
420       r.merge!(
421         {:new_index => self.tag_new_index}
422       ) if self.new_index
423       r.merge(opt)
424     end
425     
426     def select_tag_attributes(selected, column, no_attr)
427       [
428         :last, :first, 
429         {:html => {:selected => selected}}, 
430         self.field_tag_attributes(column, no_attr)
431       ]
432     end
433     
434     def tag_attr column = nil, opt = {}
435       self.tag_attributes(column, opt).to_attr
436     end
437     
438     def field_tag_attr column, no_attr, opt = {}
439       self.field_tag_attributes(column, no_attr, opt).to_attr
440     end
441     
442     def any_tag_attr name = nil, opt = {}
443       self.any_tag_attributes(name, opt).to_attr
444     end
445     
446 end