OSDN Git Service

fix form extend
[pettanr/pettanr.git] / lib / peta / item.rb
index f9a3de7..0a3ba0b 100644 (file)
@@ -1,6 +1,7 @@
 module Peta
   class Item < ActiveRecord::Base
     self.abstract_class = true
+    attr :boosters
     
     # Dynamic ClassMethods
     
@@ -14,6 +15,15 @@ module Peta
       define_singleton_method("valid_encode_columns") do 
         r
       end
+      r = self.my_manifest.child_models
+      define_singleton_method("child_models") do
+        r
+      end
+      r = self.my_manifest.child_element_names
+      define_singleton_method("child_element_names") do
+        r
+      end
+      # Instance Methods
     end
     
     # ClassMethods
@@ -22,6 +32,10 @@ module Peta
     
     before_validation :valid_encode
     
+    def self.my_peta
+      Manifest.manifest.items[self.item_name]
+    end
+    
     def self.my_manifest
       Manifest.manifest.models[self.item_name]
     end
@@ -46,10 +60,30 @@ module Peta
       false
     end
     
+    def self.element?
+      false
+    end
+    
+    def self.root?
+      false
+    end
+    
+    def self.parent_model
+      nil
+    end
+    
     def self.path_name with_engine = false
       self.plural.underscore
     end
     
+    def self.find_boost_name column_name
+      self.my_peta.find_boost_name column_name
+    end
+    
+    def self.extend_column? column_name
+      self.my_peta.extend_column? column_name
+    end
+    
     def self.visible_count_options
       nil
     end
@@ -74,6 +108,7 @@ module Peta
       opt = {}
       opt.merge!(self.show_opt)
       item = self.find(item_id, opt)
+      item.boosts 'read'
       raise ActiveRecord::Forbidden unless item.visible?(operators)
       item
     end
@@ -86,6 +121,18 @@ module Peta
       {}
     end
     
+    def self.fold_extend_settings params
+      self.my_peta.boost.each do |name, manifest|
+        my_settings = params[self.item_name][manifest.settings_column_name]
+        if my_settings.is_a?(Hash)
+          params[self.item_name][manifest.settings_column_name] = my_settings.to_json
+        end
+      end
+      self.child_models.each do |child_model|
+        child_model.fold_extend_settings params
+      end
+    end
+    
     #InstanceMethods
     
     def item_name
@@ -108,16 +155,8 @@ module Peta
       self.path_name(with_engine) + '/form'
     end
     
-    def extend_column
-      nil
-    end
-    
-    def extend_item_name
-      self.extend_column ? self.attributes[self.extend_column] : self.item_name
-    end
-    
     def form_name
-      self.extend_item_name
+      self.extend_column ? self.attributes[self.extend_column] : self.item_name
     end
     
     def valid_encode
@@ -127,13 +166,34 @@ module Peta
       end
     end
     
+    def boosts level
+      self.class.my_peta.boost.each do |boost_name, boost_manifest|
+        next if level == 'read' and boost_manifest.level == 'post'
+        self.boost boost_manifest
+      end
+    end
+    
+    def boost boost_manifest
+      @boosters ||= {}
+      @boosters[boost_manifest.name] ||= Locmare::Booster.new(boost_manifest, self)
+    end
+    
+    def boosters
+      @boosters
+    end
+    
+    def extend_column? column_name
+      self.class.extend_column? column_name
+    end
+    
     def supply_default
+      self.class.my_peta.supply_defaults self
     end
     
     def overwrite 
     end
     
-    def visible? operators
+    def user_visible? operators
       if Manifest.manifest.magic_numbers['run_mode'] == 0
         return false unless operators.guest?
       else
@@ -142,34 +202,29 @@ module Peta
       true
     end
     
-    def editor
-      @editor
-    end
-    
-    def editor=(e)
-      @editor = e
-    end
-    
-    def pool_id
-      @pool_id || self.id
+    def visible? operators
+      return false unless self.user_visible? operators
+      true
     end
     
-    def pool_id=(i)
-      @pool_id = i
+    def editize?
+      self.respond_to? :editor
     end
     
     def dom_id
-      self.pool_id.to_s
+      self.id.to_s
     end
     
     def dom_pool_type
       self.new_record? ? 'stored' : 'new'
     end
     
-    def dom_item_id name = nil
-      r = [self.editor.eid, self.dom_pool_type, self.item_name, self.dom_id]
-      r += name.to_s if column_name
-      r.join '-'
+    def merge_dom_item_id attr, name = nil
+      if self.editize?
+        attr.merge({'id' => self.dom_item_id(name)})
+      else
+        attr
+      end
     end
     
     def tag_attributes name = nil, opt = {}
@@ -177,7 +232,7 @@ module Peta
         'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id, 
         'data-item_name' => self.item_name
       }
-      r.merge!({'id' => self.dom_item_id(name)}) if self.editor
+      r = self.merge_dom_item_id r, name
       r.merge!(opt)
       r
     end
@@ -188,5 +243,9 @@ module Peta
       )
     end
     
+    def post_attribute_key
+      self.dom_id
+    end
+    
   end
 end