1 class Sheet < Peta::Content
7 validates :caption, :presence => true, :length => {:maximum => 100}
8 validates :width, :presence => true, :numericality => true, :natural_number => true
9 validates :height, :presence => true, :numericality => true, :natural_number => true
10 validates :visible, :presence => true, :numericality => true, :inclusion => {:in => 0..1}
11 accepts_nested_attributes_for :sheet_panels, :allow_destroy => true
13 def self.each_element_class_names
14 {'SheetPanel' => 'sheet_panels'}.each do |k, n|
19 def self.class_name_to_class k
23 def self.each_element_classes
24 self.each_element_class_names do |k|
25 e = self.class_name_to_class k
30 def elements_by_class_name class_name
31 self.__send__ class_name.tableize
35 self.visible = 0 if self.visible.blank?
38 def overwrite operators
39 return false unless operators.author
40 self.author_id = operators.author.id
43 def visible? operators
44 return false unless super
45 return true if self.new_record?
50 self.visible? operators
57 'sheet' + self.tag_sheet_id
61 self.new_record? ? '0' : self.id.to_s
73 'sheets.updated_at desc'
77 {:sheet_panels => {:panel => {}}, :author => {} }
80 def self.list_json_opt
81 {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
85 {:include => {:sheet_panels => {:panel => {}}, :author => {}}}
88 def self.show_json_opt
89 {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
94 self.class.each_element_class_names do |k|
95 r += (self.elements_by_class_name(k) || [])
102 self.parts_element.each do |e|
110 self.parts_element.each do |e|
117 self.sheet_elements.size
121 self.sheet_elements.size + 1
124 def self.visible_count
125 Sheet.count 'visible > 0'
128 def self.collect_element_value elements, name
131 if o['_destroy'] or o[:_destroy]
140 def self.validate_serial ary, offset = 0
142 ary.compact.sort.each do |n|
143 break false unless n == i
146 ary.compact.size == i - offset
149 def self.validate_element_serial elements, name, offset = 0
150 Sheet.validate_serial(Sheet.collect_element_value(elements, name), offset)
153 def self.validate_elements_serial c
155 Sheet.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
159 def validate_serial_list
161 self.class.each_element_class_names do |k|
162 l << self.elements_by_class_name(k)
164 # l = [self.sheet_panels]
166 {:elements => l, :name => :t, :offset => 0},
167 {:elements => l, :name => :z, :offset => 1}
172 # r1 = Panel.validate_elements_id validate_id_list
173 Sheet.validate_elements_serial validate_serial_list
177 @new_element_index = 0
178 self.panel_elements.each do |elm|
180 elm.new_index = @new_element_index
181 @new_element_index += 1
186 def store attr, operators
188 self.errors.add :base, I18n.t('errors.invalid_json')
191 self.attributes = attr
192 self.overwrite operators
195 self.sheet_elements.each do |elm|
200 unless validate_child
202 self.errors.add :base, I18n.t('errors.invalid_t')
203 raise ActiveRecord::Rollback
209 def destroy_with_sheet_panel
212 self.sheet_panels.each do |sheet_panel|
213 raise ActiveRecord::Rollback unless sheet_panel.destroy
215 raise ActiveRecord::Rollback unless self.destroy
233 def licensed_pictures
235 self.sheet_elements.each do |elm|
236 r.merge!(elm.licensed_pictures)
243 Sheet.each_element_class_names do |n|
244 self.elements_by_class_name(n).each do |elm|
245 next if elm.copyable?
255 attr = self.copy_attributes
256 Sheet.each_element_class_names do |n|
257 element_attr = Sheet.class_name_to_class(n).panelize(
258 self.elements_by_class_name(n).map {|elm|
259 elm.copy_attributes.merge elm.panel_attributes
262 attr.merge! element_attr
271 r.delete 'created_at'
272 r.delete 'updated_at'
276 def self.panelize sheet
277 attr = sheet.attributes