1 class Sheet < Peta::Root
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
45 when nil # super return
55 self.visible? operators
61 def self.public_list_where
66 'sheets.updated_at desc'
70 {:sheet_panels => {:panel => {}}, :author => {} }
73 def self.list_json_opt
74 {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
78 {:include => {:sheet_panels => {:panel => {}}, :author => {}}}
81 def self.show_json_opt
82 {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
87 self.class.each_element_class_names do |k|
88 r += (self.elements_by_class_name(k) || [])
95 self.parts_element.each do |e|
103 self.parts_element.each do |e|
110 self.sheet_elements.size
114 self.sheet_elements.size + 1
117 def self.visible_count
118 Sheet.count 'visible > 0'
121 def self.collect_element_value elements, name
124 if o['_destroy'] or o[:_destroy]
133 def self.validate_serial ary, offset = 0
135 ary.compact.sort.each do |n|
136 break false unless n == i
139 ary.compact.size == i - offset
142 def self.validate_element_serial elements, name, offset = 0
143 Sheet.validate_serial(Sheet.collect_element_value(elements, name), offset)
146 def self.validate_elements_serial c
148 Sheet.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
152 def validate_serial_list
154 self.class.each_element_class_names do |k|
155 l << self.elements_by_class_name(k)
157 # l = [self.sheet_panels]
159 {:elements => l, :name => :t, :offset => 0},
160 {:elements => l, :name => :z, :offset => 1}
165 # r1 = Panel.validate_elements_id validate_id_list
166 Sheet.validate_elements_serial validate_serial_list
169 def store attr, operators
171 self.errors.add :base, I18n.t('errors.invalid_json')
174 self.attributes = attr
175 self.overwrite operators
178 self.sheet_elements.each do |elm|
183 unless validate_child
185 self.errors.add :base, I18n.t('errors.invalid_t')
186 raise ActiveRecord::Rollback
192 def destroy_with_sheet_panel
195 self.sheet_panels.each do |sheet_panel|
196 raise ActiveRecord::Rollback unless sheet_panel.destroy
198 raise ActiveRecord::Rollback unless self.destroy
216 def licensed_pictures
218 self.sheet_elements.each do |elm|
219 r.merge!(elm.licensed_pictures)
226 Sheet.each_element_class_names do |n|
227 self.elements_by_class_name(n).each do |elm|
228 next if elm.copyable?
238 attr = self.copy_attributes
239 Sheet.each_element_class_names do |n|
240 element_attr = Sheet.class_name_to_class(n).panelize(
241 self.elements_by_class_name(n).map {|elm|
242 elm.copy_attributes.merge elm.panel_attributes
245 attr.merge! element_attr
254 r.delete 'created_at'
255 r.delete 'updated_at'
259 def self.panelize sheet
260 attr = sheet.attributes