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
44 return false unless super
45 return true if self.new_record?
50 self.visible? operators
61 'sheets.updated_at desc'
65 {:sheet_panels => {:panel => {}}, :author => {} }
68 def self.list_json_opt
69 {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
73 {:include => {:sheet_panels => {:panel => {}}, :author => {}}}
76 def self.show_json_opt
77 {:include => {:sheet_panels => {:include => {:panel => {}}}, :author => {}}}
82 self.class.each_element_class_names do |k|
83 r += (self.elements_by_class_name(k) || [])
90 self.parts_element.each do |e|
98 self.parts_element.each do |e|
105 self.sheet_elements.size
109 self.sheet_elements.size + 1
112 def self.visible_count
113 Sheet.count 'visible > 0'
116 def self.collect_element_value elements, name
119 if o['_destroy'] or o[:_destroy]
128 def self.validate_serial ary, offset = 0
130 ary.compact.sort.each do |n|
131 break false unless n == i
134 ary.compact.size == i - offset
137 def self.validate_element_serial elements, name, offset = 0
138 Sheet.validate_serial(Sheet.collect_element_value(elements, name), offset)
141 def self.validate_elements_serial c
143 Sheet.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
147 def validate_serial_list
149 self.class.each_element_class_names do |k|
150 l << self.elements_by_class_name(k)
152 # l = [self.sheet_panels]
154 {:elements => l, :name => :t, :offset => 0},
155 {:elements => l, :name => :z, :offset => 1}
160 # r1 = Panel.validate_elements_id validate_id_list
161 Sheet.validate_elements_serial validate_serial_list
164 def store attr, operators
166 self.errors.add :base, I18n.t('errors.invalid_json')
169 self.attributes = attr
170 self.overwrite operators
173 self.sheet_elements.each do |elm|
178 unless validate_child
180 self.errors.add :base, I18n.t('errors.invalid_t')
181 raise ActiveRecord::Rollback
187 def destroy_with_sheet_panel
190 self.sheet_panels.each do |sheet_panel|
191 raise ActiveRecord::Rollback unless sheet_panel.destroy
193 raise ActiveRecord::Rollback unless self.destroy
211 def licensed_pictures
213 self.sheet_elements.each do |elm|
214 r.merge!(elm.licensed_pictures)
221 Sheet.each_element_class_names do |n|
222 self.elements_by_class_name(n).each do |elm|
223 next if elm.copyable?
233 attr = self.copy_attributes
234 Sheet.each_element_class_names do |n|
235 element_attr = Sheet.class_name_to_class(n).panelize(
236 self.elements_by_class_name(n).map {|elm|
237 elm.copy_attributes.merge elm.panel_attributes
240 attr.merge! element_attr
249 r.delete 'created_at'
250 r.delete 'updated_at'
254 def self.panelize sheet
255 attr = sheet.attributes