module Peta
class Item < ActiveRecord::Base
self.abstract_class = true
+ attr :boosters
# Dynamic ClassMethods
- def self._valid_encode_columns
- self.my_manifest.valid_encode_columns
+ def self._dev?
+ Rails.env == "development"
+ end
+
+ def self._skip_load?
+ if self._dev?
+ return true unless self.my_manifest
+ return true unless Manifest.manifest.items
+ return true unless Manifest.manifest.models
+ end
+ false
end
def self.load_manifest
- return nil unless self.my_manifest
- r = self._valid_encode_columns
+ return nil if self._skip_load?
+ vc = self.my_manifest.valid_encode_columns
define_singleton_method("valid_encode_columns") do
- r
+ vc
end
+ cm = self.my_manifest.child_models
+ define_singleton_method("child_models") do
+ cm
+ end
+ cen = self.my_manifest.child_element_names
+ define_singleton_method("child_element_names") do
+ cen
+ end
+ # Instance Methods
end
# ClassMethods
before_validation :valid_encode
+ def self.my_peta
+ return nil unless Manifest.manifest.items
+ Manifest.manifest.items[self.item_name]
+ end
+
def self.my_manifest
+ return nil unless Manifest.manifest.models
Manifest.manifest.models[self.item_name]
end
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.visible_count_options
- nil
+ 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.list_where
end
def self.list_order
- ''
+ self.table_name + '.updated_at desc'
end
def self.list_opt
opt = {}
opt.merge!(self.show_opt)
item = self.find(item_id, opt)
- raise ActiveRecord::Forbidden unless item.visible?(operators)
+ item.boosts 'read'
+ raise ActiveRecord::Forbidden if item.visible?(operators) == false
item
end
{}
end
+ def self.fold_extend_settings attr
+ self.my_peta.boost.each do |name, manifest|
+ my_settings = attr[manifest.settings_column_name]
+ if my_settings.is_a?(Hash)
+ attr[manifest.settings_column_name] = my_settings.to_json
+ end
+ end
+ end
+
#InstanceMethods
def item_name
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
self.class.valid_encode_columns.each do |a|
next if attributes[a] == nil
- raise Pettanr::BadRequest unless attributes[a].valid_encoding?
+ raise Pettanr::BadRequest unless self.attributes[a].valid_encoding?
+ 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.boosters.each do |boost_name, booster|
+ booster.supply_default
+ end
end
def overwrite
+ self.boosters.each do |boost_name, booster|
+ booster.overwrite
+ end
end
- def visible? operators
+ def user_visible? operators
if Manifest.manifest.magic_numbers['run_mode'] == 0
return false unless operators.guest?
else
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 = {}
'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
)
end
+ def post_attribute_key
+ self.dom_id
+ end
+
end
end