OSDN Git Service

clean
[pettanr/pettanr.git] / lib / peta / root.rb
index 5646504..db49986 100644 (file)
@@ -22,6 +22,132 @@ module Peta
       r
     end
     
+    def parts_element
+      r = []
+      self.class.child_models.each do |k|
+        r += (self.element_items(k) || [])
+      end
+      r
+    end
+    
+    def zorderd_elements
+      res = []
+      self.parts_element.each do |e|
+        res[e.z-1] = e
+      end
+      res
+    end
+    
+    def scenario_elements
+      res = []
+      self.parts_element.each do |e|
+        res[e.t] = e
+      end
+      res
+    end
+    
+    def elements
+      self.scenario_elements.map {|e|
+        #(-_-;)<... kore wa hidoi
+        JSON.parse e.to_json({:include => e.class.json_opt_for_panel})
+      }
+    end
+    
+    def scenario_elements_as_json
+      self.to_json({:include => {:author => {}}, :methods => :elements})
+    end
+    
+  def self.list_as_json_text ary
+    '[' + ary.map {|i| i.panel_elements_as_json }.join(',') + ']'
+  end
+  
+    def new_t
+      self.scenario_elements.size
+    end
+    
+    def new_z
+      self.scenario_elements.size + 1
+    end
+    
+    def self.collect_element_value elements, name
+      elements.map {|e|
+        if e['_destroy'] or e[:_destroy]
+          nil
+        else
+          e[name]
+        end
+      }
+    end
+    
+    def self.validate_serial ary, offset = 0
+      i = offset
+      ary.compact.sort.each do |n|
+        break false unless n == i
+        i += 1
+      end
+      ary.compact.size == i - offset
+    end
+    
+    def self.validate_element_serial elements, name, offset = 0
+      self.validate_serial(self.collect_element_value(elements, name), offset)
+    end
+    
+    def self.validate_elements_serial c
+      c.map {|conf|
+        self.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
+      }.compact.empty?
+    end
+    
+    def validate_serial_list
+      [
+        {:elements => self.elements_items, :name => :t, :offset => 0}, 
+        {:elements => self.elements_items, :name => :z, :offset => 1}
+      ]
+    end
+    
+    def validate_child
+  #    r1 = Panel.validate_elements_id validate_id_list
+      self.class.validate_elements_serial validate_serial_list
+    end
+    
+    def store attr, operators
+      if attr == false
+        self.errors.add :base, I18n.t('errors.invalid_json')
+        return false
+      end
+      self.attributes = attr
+      self.overwrite operators
+      res = false
+      self.class.transaction do
+        self.boosts 'post'
+        res = self.save
+        unless validate_child
+          res = false
+          self.errors.add :base, I18n.t('errors.invalid_t')
+          raise ActiveRecord::Rollback
+        end
+      end
+      res
+    end
+    
+    def destroy_with_elements
+      res = false
+      self.class.transaction do
+        self.parts_element.each do |element|
+          raise ActiveRecord::Rollback unless element.destroy
+        end
+        raise ActiveRecord::Rollback unless self.destroy
+        res = true
+      end
+      res
+    end
+    
+    def self.panelize panel
+      attr = panel.attributes
+      attr.delete 'id'
+      attr
+    end
+    
   end
 end