OSDN Git Service

fix editor
[pettanr/pettanr.git] / lib / peta / root.rb
index 0bcfb35..d2fd100 100644 (file)
 module Peta
-  class Root < Content
+  class Root < ElementNestableContent
     self.abstract_class = true
     
     # Dynamic Methods
     
-    def self._element_tree_name
-      self.my_manifest.peta.element_tree_name
-    end
-    
     def self.load_manifest
       super
       # Class Methods
-      n = self._element_tree_name
-      define_singleton_method("element_tree_name") do 
-        n
-      end
       # Instance Methods
-      define_method("element_items") do |element_model|
-        self.__send__ self.class.my_manifest.associations.child_element_name(element_model)
+    end
+    
+    # Class Methods
+    
+    def self.show_json_opt_for_root
+      r = (self.build_json_opt(self))
+      r[:include].merge!(:author => {})
+      r
+    end
+      
+    def self.build_json_opt my_model
+      if my_model.child_models.empty?
+        {}
+      else
+        r = {}
+        my_model.child_models.each do |child_model|
+          r[my_model.my_manifest.associations.child_element_name(child_model).to_sym] = self.build_json_opt(child_model)
+        end
+        {:include => r}
+      end
+    end
+    
+    # Instance Methods
+    def copy_attributes opt = {}
+      r = self.attributes
+      r.delete 'id'
+      r.delete 'author_id'
+      r.delete 'created_at'
+      r.delete 'updated_at'
+      r
+    end
+    
+    def parts_element
+      r = []
+      self.class.child_models.each do |k|
+        r += (self.element_items(k) || [])
       end
-      define_method("elements_items") do 
-        self.class.child_models(self.class.element_tree_name).map {|child_model|
-          self.element_items child_model
-        }.flatten
+      r
+    end
+    
+    def zorderd_elements
+      res = []
+      self.parts_element.each do |e|
+        res[e.z-1] = e
       end
+      res
     end
     
-    # Class Methods
+    def scenario_elements
+      res = []
+      self.parts_element.each do |e|
+        res[e.t] = e
+      end
+      res
+    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