OSDN Git Service

temp
[pettanr/pettanr.git] / app / models / sheet.rb
1 class Sheet < ActiveRecord::Base
2   has_many :sheet_panels
3   has_many :story_sheets
4   belongs_to :author
5   
6   validates :caption, :presence => true, :length => {:maximum => 100}
7   validates :width, :presence => true, :numericality => true, :natural_number => true
8   validates :height, :presence => true, :numericality => true, :natural_number => true
9   validates :visible, :presence => true, :numericality => true, :inclusion => {:in => 0..1}
10   accepts_nested_attributes_for :sheet_panels, :allow_destroy => true
11   before_validation :valid_encode
12   
13   def valid_encode
14     ['caption'].each do |a|
15       next if attributes[a] == nil
16       raise Pettanr::BadRequest unless attributes[a].valid_encoding?
17     end
18   end
19   
20   def self.each_element_class_names
21     {'SheetPanel' => 'sheet_panels'}.each do |k, n|
22       yield k
23     end
24   end
25   
26   def self.class_name_to_class k
27     Object.const_get k
28   end
29   
30   def self.each_element_classes
31     self.each_element_class_names do |k|
32       e = self.class_name_to_class k
33       yield e
34     end
35   end
36   
37   def elements_by_class_name class_name
38     self.__send__ class_name.tableize
39   end
40   
41   def supply_default
42     self.visible = 0 if self.visible.blank?
43   end
44   
45   def overwrite au
46     return false unless au
47     self.author_id = au.id
48   end
49   
50   def own? roles
51     roles = [roles] unless roles.respond_to?(:each)
52     au = Sheet.get_author_from_roles roles
53     return false unless au
54     self.author_id == au.id
55   end
56   
57   def visible? roles
58     if MagicNumber['run_mode'] == 0
59       return false unless guest_role_check(roles)
60     else
61       return false unless reader_role_check(roles)
62     end
63     return true if self.own?(roles)
64     return true if self.new_record?
65     self.visible > 0
66   end
67   
68   def usable? au
69     visible? au
70   end
71   
72   def symbol_filename
73   end
74   
75   def tag_id
76     'sheet' + self.tag_sheet_id
77   end
78   
79   def tag_sheet_id
80     self.new_record? ? '0' : self.id.to_s
81   end
82   
83   def field_tag_id f
84     self.tag_id + f.to_s
85   end
86   
87   def self.default_page_size
88     25
89   end
90   
91   def self.max_page_size
92     100
93   end
94   
95   def self.default_panel_size
96     30
97   end
98   
99   def self.max_panel_size
100     200
101   end
102   
103   def self.page prm = nil
104     page = prm.to_i
105     page = 1 if page < 1
106     page
107   end
108   
109   def self.page_size prm = self.default_page_size
110     page_size = prm.to_i
111     page_size = self.max_page_size if page_size > self.max_page_size
112     page_size = self.default_page_size if page_size < 1
113     page_size
114   end
115   
116   def self.list_where
117     'sheets.visible > 0'
118   end
119   
120   def self.mylist_where au
121     ['sheets.author_id = ?', au.id]
122   end
123   
124   def self.himlist_where au
125     ['sheets.author_id = ? and sheets.visible > 0', au.id]
126   end
127   
128   def self.list page = 1, page_size = self.default_page_size
129     Sheet.where(self.list_where()).includes(Sheet.list_opt).order('sheets.updated_at desc').offset((page -1) * page_size).limit(page_size)
130   end
131   
132   def self.mylist au, page = 1, page_size = Author.default_sheet_page_size
133     Sheet.where(self.mylist_where(au)).includes(Sheet.list_opt).order('sheets.updated_at desc').offset((page -1) * page_size).limit(page_size)
134   end
135   
136   def self.himlist au, page = 1, page_size = Author.default_sheet_page_size
137     Sheet.where(self.himlist_where(au)).includes(Sheet.list_opt).order('sheets.updated_at desc').offset((page -1) * page_size).limit(page_size)
138   end
139   
140   def self.list_paginate page = 1, page_size = self.default_page_size
141     Kaminari.paginate_array(Array.new(Sheet.where(self.list_where()).count, nil)).page(page).per(page_size)
142   end
143   
144   def self.mylist_paginate au, page = 1, page_size = Author.default_sheet_page_size
145     Kaminari.paginate_array(Array.new(Sheet.where(self.mylist_where(au)).count, nil)).page(page).per(page_size)
146   end
147   
148   def self.himlist_paginate au, page = 1, page_size = Author.default_sheet_page_size
149     Kaminari.paginate_array(Array.new(Sheet.where(self.himlist_where(au)).count, nil)).page(page).per(page_size)
150   end
151   
152   def self.list_by_story story_id, roles, page = 1, page_size = self.default_page_size
153     self.where(StorySheet.list_by_story_where(story_id)).includes(
154       {:story_sheets => {}}
155     ).order('story_sheets.updated_at desc').offset((page -1) * page_size).limit(page_size)
156   end
157   
158   def self.list_by_panel panel_id, roles, page = 1, page_size = self.default_page_size
159     self.where(SheetPanel.list_by_panel_where(panel_id)).includes(
160       {:sheet_panels => {}}
161     ).order('sheet_panels.updated_at desc').offset((page -1) * page_size).limit(page_size)
162   end
163   
164   def self.list_by_author_where author_id
165     ['sheets.author_id = ?', author_id]
166   end
167   
168   def self.list_by_author author_id, roles, page = 1, page_size = self.default_page_size
169     self.where(self.list_by_author_where(author_id)).includes(self.list_opt).order('sheets.updated_at desc').offset((page -1) * page_size).limit(page_size)
170   end
171   
172   def self.list_opt
173     {:sheet_panels => {:panel => {}}, :author => {} }
174   end
175   
176   def self.list_json_opt
177     {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
178   end
179   
180   def self.show sid, roles
181     opt = {}
182     opt.merge!(Sheet.show_opt)
183     res = Sheet.find(sid, opt)
184     raise ActiveRecord::Forbidden unless res.visible?(roles)
185     res
186   end
187   
188   def self.edit sid, au
189     opt = {}
190     opt.merge!(Sheet.show_opt)
191     res = Sheet.find(sid, opt)
192     raise ActiveRecord::Forbidden unless res.own?(au)
193     res
194   end
195   
196   def self.show_opt
197     {:include => {:sheet_panels => {:panel => {}}, :author => {}}}
198   end
199   
200   def self.show_json_opt
201     {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
202   end
203   
204   def parts_element
205     r = []
206     self.class.each_element_class_names do |k|
207       r += (self.elements_by_class_name(k) || [])
208     end
209     r
210   end
211   
212   def zorderd_elements
213     res = []
214     self.parts_element.each do |e|
215       res[e.z-1] = e
216     end
217     res
218   end
219   
220   def sheet_elements
221     res = []
222     self.parts_element.each do |e|
223       res[e.t] = e
224     end
225     res
226   end
227   
228   def new_t
229     self.sheet_elements.size
230   end
231   
232   def new_z
233     self.sheet_elements.size + 1
234   end
235   
236   def self.visible_count
237     Sheet.count 'visible > 0'
238   end
239   
240   def self.collect_element_value elements, name
241     elements.map {|e|
242       e.map {|o|
243         if o['_destroy'] or o[:_destroy]
244           nil
245         else
246           o[name]
247         end
248       }.compact
249     }.flatten
250   end
251   
252   def self.validate_serial ary, offset = 0
253     i = offset
254     ary.compact.sort.each do |n|
255       break false unless n == i
256       i += 1
257     end
258     ary.compact.size == i - offset
259   end
260   
261   def self.validate_element_serial elements, name, offset = 0
262     Sheet.validate_serial(Sheet.collect_element_value(elements, name), offset)
263   end
264   
265   def self.validate_elements_serial c
266     c.map {|conf|
267       Sheet.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
268     }.compact.empty?
269   end
270   
271   def validate_serial_list
272     l = []
273     self.class.each_element_class_names do |k|
274       l << self.elements_by_class_name(k)
275     end
276 #    l = [self.sheet_panels]
277     [
278       {:elements => l, :name => :t, :offset => 0}, 
279       {:elements => l, :name => :z, :offset => 1}
280     ]
281   end
282   
283   def validate_child
284 #    r1 = Panel.validate_elements_id validate_id_list
285     Sheet.validate_elements_serial validate_serial_list
286   end
287   
288   def boost
289     @new_element_index = 0
290     self.panel_elements.each do |elm|
291       if elm.new_record?
292         elm.new_index = @new_element_index
293         @new_element_index += 1
294       end
295     end
296   end 
297   
298   def store attr, au
299     if attr == false
300       self.errors.add :base, I18n.t('errors.invalid_json')
301       return false
302     end
303     self.attributes = attr
304     self.overwrite au
305     res = false
306     Sheet.transaction do
307       self.sheet_elements.each do |elm|
308         elm.new_sheet = self
309         elm.boost au
310       end
311       res = self.save
312       unless validate_child
313         res = false
314         self.errors.add :base, I18n.t('errors.invalid_t')
315         raise ActiveRecord::Rollback
316       end
317     end
318     res
319   end
320   
321   def destroy_with_sheet_panel
322     res = false
323     Sheet.transaction do
324       self.sheet_panels.each do |sheet_panel|
325         raise ActiveRecord::Rollback unless sheet_panel.destroy
326       end
327       raise ActiveRecord::Rollback unless self.destroy
328       res = true
329     end
330     res
331   end
332   
333   def scenario
334     panels.map {|panel|
335       panel.scenario
336     }.join
337   end
338   
339   def plain_scenario
340     panels.map {|panel|
341       panel.plain_scenario
342     }.join
343   end
344   
345   def licensed_pictures
346     r = {}
347     self.sheet_elements.each do |elm|
348       r.merge!(elm.licensed_pictures)
349     end
350     r
351   end
352   
353   def copyable?
354     r = true
355     Sheet.each_element_class_names do |n|
356       self.elements_by_class_name(n).each do |elm|
357         next if elm.copyable?
358         r = false
359         break
360       end
361       break unless r
362     end
363     r
364   end
365   
366   def copy
367     attr = self.copy_attributes
368     Sheet.each_element_class_names do |n|
369       element_attr = Sheet.class_name_to_class(n).panelize(
370         self.elements_by_class_name(n).map {|elm|
371           elm.copy_attributes.merge elm.panel_attributes
372         }
373       )
374       attr.merge! element_attr
375     end
376     attr
377   end
378   
379   def copy_attributes
380     r = self.attributes
381     r.delete 'id'
382     r.delete 'author_id'
383     r.delete 'created_at'
384     r.delete 'updated_at'
385     r
386   end
387   
388   def self.panelize sheet
389     attr = sheet.attributes
390     attr.delete 'id'
391     attr
392   end
393   
394 end