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._extend_column_name
- self.my_manifest.extend_column_name
+ 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
- end
- define_singleton_method("parent_model") do |tree_name|
- self.my_manifest.tree[tree_name].parent_model
+ vc
end
- define_singleton_method("child_models") do |tree_name|
- self.my_manifest.child_models tree_name
+ cm = self.my_manifest.child_models
+ define_singleton_method("child_models") do
+ cm
end
- define_singleton_method("child_element_names") do |tree_name|
- self.my_manifest.child_element_names tree_name
+ cen = self.my_manifest.child_element_names
+ define_singleton_method("child_element_names") do
+ cen
end
# Instance Methods
- n = self._extend_column_name
- define_singleton_method("extend_column_name") do
- n
- end
end
# ClassMethods
# class_name
- # table_name
before_validation :valid_encode
+ def self.my_peta
+ return nil unless Manifest.manifest.items
+ Manifest.manifest.items[self.item_name]
+ end
+
+ def self.my_controller
+ return nil unless Manifest.manifest.controllers
+ Manifest.manifest.controllers[self.table_name]
+ end
+
def self.my_manifest
+ return nil unless Manifest.manifest.models
Manifest.manifest.models[self.item_name]
end
end
def self.plural
- self.singular.pluralize
+ table_name = Manifest.manifest.pluralize self.item_name
+ table_name.camelize
end
def self.item_name
self.singular.underscore
end
+ # self.model_name
+ # => "PanelPicture"
+
+ # self.table_name
+ # => "panel_picture"
+
def self.item?
true
end
false
end
- def self.path_name with_engine = false
- self.plural.underscore
+ def self.element?
+ false
end
- def self.visible_count_options
+ def self.root?
+ false
+ end
+
+ def self.parent_model
nil
end
- def self.list_where
- ''
+ def self.path_name with_engine = false
+ self.table_name
+ end
+
+ def self.pickup_item_name
+ self.item_name
+ end
+
+ def self.pickup_column_name
+ 'id'
+ end
+
+ def self.find_boost_name column_name
+ self.my_peta.find_boost_name column_name
end
- def self.list_order
- ''
+ def self.extend_column? column_name
+ self.my_peta.extend_column? column_name
+ end
+
+ def self.index_list_where list
+ nil
end
def self.list_opt
{}
end
- def self.show item_id, operators
+ def self.show item_id, operators = nil
opt = {}
opt.merge!(self.show_opt)
- item = self.find(item_id, opt)
- raise ActiveRecord::Forbidden unless item.visible?(operators)
+ item = self.find(item_id)
+ item.boosts 'read'
+ raise ActiveRecord::Forbidden if operators and 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 my_manifest
+ self.class.my_manifest
+ end
+
+ def singular
+ self.class.singular
+ end
+
+ def plural
+ self.class.plural
+ end
+
def item_name
self.class.item_name
end
self.class.table_name
end
- def extend_column_name
- self.class.extend_column_name
- end
-
def path_name with_engine = false
self.class.path_name(with_engine)
end
+ def pickup_item_name
+ self.class.pickup_item_name
+ end
+
+ def pickup_column_name
+ self.class.pickup_column_name
+ end
+
+ def pickup_id
+ self.attributes[self.pickup_column_name]
+ end
+
def form_template with_engine = false
self.path_name(with_engine) + '/form'
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 self.fold_extend_settings params
- speech_balloon_settings = params[:speech_balloon][:settings]
- if speech_balloon_settings.is_a?(Hash)
- params[:speech_balloon][:settings] = speech_balloon_settings.to_json
- end
- balloon_settings = params[:speech_balloon][:balloon_attributes][:settings]
- if balloon_settings.is_a?(Hash)
- params[:speech_balloon][:balloon_attributes][:settings] = balloon_settings.to_json
+ 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
- speech_settings = params[:speech_balloon][:speech_attributes][:settings]
- if speech_settings.is_a?(Hash)
- params[:speech_balloon][:speech_attributes][:settings] = speech_settings.to_json
- end
- end
-
- def engine
- Object.const_get self.attributes[self.extend_column_name]
end
- def my_engine_resource
- Manifest.manifest.system_resources.engine_resources[self.table_name]
+ def boost boost_manifest
+ @boosters ||= {}
+ @boosters[boost_manifest.name] ||= Locmare::Booster.new(boost_manifest, self)
end
- def engine?
- self.my_engine_resource.resource_items.include? self.attributes[self.extend_column_name]
+ def boosters
+ @boosters ||= {}
end
- def boost
- return false unless self.engine?
- self.engine.boost self
- true
+ 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 visible? operators
+ return false unless self.user_visible? operators
+ true
+ end
+
+ def permit_params params, default_permit_attributes = []
+ attrs = self.class.permit_attributes(default_permit_attributes)
+ params.require(self.item_name.to_sym).permit(attrs)
+ end
+
+ def self.permit_attributes default_permit_attributes = []
+ attrs = self.my_manifest.attributes.keys
+ attrs.concat(default_permit_attributes)
+ attrs
+ end
+
def editize?
self.respond_to? :editor
end
self.new_record? ? 'stored' : 'new'
end
+ 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 = {}
r = {
'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.editize?
+ r = self.merge_dom_item_id r, name
r.merge!(opt)
r
end
+ def tag_attr column = nil, opt = {}
+ self.tag_attributes(column, opt).to_attr
+ end
+
def field_tag_attributes column_name, opt = {}
self.tag_attributes(column_name, opt).merge(
{'data-column_name' => column_name}
)
end
+ def post_attribute_key
+ self.dom_id
+ end
+
+ ##################################################################
+ # importer
+ ##################################################################
+
+ def self.each_import data
+ data.each do |n, d|
+ yield n, d
+ end
+ end
+
+ def self.import_system_picture attr
+ d = attr["text"]
+ return false if d.blank?
+ imager = PettanImager.load(Base64.decode64(d.to_s))
+ return false unless imager
+ sp = SystemPicture.store(imager)
+ return false unless sp
+ sp.id
+ end
+
+ def self.replace_system_picture attr
+ attr.each do |name, value|
+ if value.is_a? Hash
+ r = if name.to_s =~ /_id$/
+ self.import_system_picture value
+ else
+ self.replace_system_picture value
+ end
+ return false unless r
+ attr[name] = r
+ end
+ end
+ end
+
+ def self.modify_object(name, attr, key = 'name')
+ c = 'find_by_' + key.to_s
+ r = self.__send__ c, name
+ if r
+ r.attributes = attr
+ else
+ r = self.new attr
+ r[key] = name
+ end
+ r
+ end
+
+ def self.import_list(attrs, &blk)
+ res = []
+ self.transaction do
+ attrs.each do |name, item|
+ m = blk.call(name, item)
+ res.push(m) unless m.valid?
+ end
+ raise ActiveRecord::Rollback unless res.empty?
+ end
+ res
+ end
+
+ def self.import_text(text, &blk)
+ attrs = JSON.parse(text)
+ self.import_list attrs, &blk
+ end
+
+ def self.import_file(filename, &blk)
+ text = File.open(filename, 'r').read
+ self.import_text text, &blk
+ end
+
+ def self.import_url(url, &blk)
+ text = open(url).read
+ self.import_text text, &blk
+ end
+
+ def self.import_urls(urls, &blk)
+ r = {}
+ urls.each do |url|
+ h = {}
+ begin
+ h[:validations] = self.import_url(url, &blk)
+ rescue
+ h[:exception] = {:location => $@, :message => $!}
+ end
+ r[url] = h
+ end
+ r
+ end
+
end
end