From 1b3722cca7c8de628bc1de97b4b95ab42a626454 Mon Sep 17 00:00:00 2001 From: yasushiito Date: Sun, 30 Mar 2014 10:22:20 +0900 Subject: [PATCH] fix extend --- .../javascripts/manifest/work/items.js.coffee.erb | 22 +++++ .../javascripts/manifest/work/models.js.coffee.erb | 4 - .../manifest/work/system_resources.js.coffee.erb | 8 -- app/models/panel.rb | 2 +- app/models/speech_balloon.rb | 44 ---------- app/models/speech_balloon_template.rb | 52 ------------ config/environments/development.rb | 1 + db/migrate/20140329220907_fix_extend_system.rb | 17 ++++ .../20140329222717_fix_extend_system_data.rb | 33 ++++++++ lib/manifest/item/base.rb | 29 ++++++- lib/manifest/item/boost.rb | 96 ++++++++++++++++++++++ lib/manifest/model.rb | 23 +++--- lib/peta/binder.rb | 11 ++- lib/peta/content.rb | 4 +- lib/peta/element.rb | 2 +- lib/peta/element_nestable_content.rb | 12 ++- lib/peta/item.rb | 54 ++---------- lib/peta/system_resource.rb | 9 ++ public/manifest.json | 91 +++++--------------- 19 files changed, 268 insertions(+), 246 deletions(-) create mode 100644 db/migrate/20140329220907_fix_extend_system.rb create mode 100644 db/migrate/20140329222717_fix_extend_system_data.rb create mode 100644 lib/manifest/item/boost.rb diff --git a/app/assets/javascripts/manifest/work/items.js.coffee.erb b/app/assets/javascripts/manifest/work/items.js.coffee.erb index 57179e76..eceb164d 100644 --- a/app/assets/javascripts/manifest/work/items.js.coffee.erb +++ b/app/assets/javascripts/manifest/work/items.js.coffee.erb @@ -53,18 +53,32 @@ type: 'element', args: { parent_model_name: 'panel', + boost: { + speech_balloon_template: { + }, + }, }, }, balloon: { type: 'element', args: { parent_model_name: 'speech_balloon', + boost: { + speech_balloon_template: { + }, + }, }, }, speech: { type: 'element', args: { parent_model_name: 'speech_balloon', + boost: { + writing_format: { + }, + speech_balloon_template: { + }, + }, }, }, ground_picture: { @@ -92,6 +106,14 @@ license_group: { }, license: { + type: 'leaf', + args: { + parent_model_name: 'license_group', + boost: { + license_group: { + }, + }, + }, }, author: { }, diff --git a/app/assets/javascripts/manifest/work/models.js.coffee.erb b/app/assets/javascripts/manifest/work/models.js.coffee.erb index fad4ac71..591ffc6d 100644 --- a/app/assets/javascripts/manifest/work/models.js.coffee.erb +++ b/app/assets/javascripts/manifest/work/models.js.coffee.erb @@ -514,7 +514,6 @@ }, }, speech_balloon: { - extend_column_name: 'classname', associations: { belongs_to: { panel: { @@ -1180,7 +1179,6 @@ }, }, speech_balloon_template: { - extend_column_name: 'classname', associations: { belongs_to: { system_picture: { @@ -1239,7 +1237,6 @@ }, }, writing_format: { - extend_column_name: 'classname', associations: { belongs_to: { system_picture: { @@ -1287,7 +1284,6 @@ }, }, license_group: { - extend_column_name: 'classname', associations: { belongs_to: { }, diff --git a/app/assets/javascripts/manifest/work/system_resources.js.coffee.erb b/app/assets/javascripts/manifest/work/system_resources.js.coffee.erb index 5b457386..d1e51c9a 100644 --- a/app/assets/javascripts/manifest/work/system_resources.js.coffee.erb +++ b/app/assets/javascripts/manifest/work/system_resources.js.coffee.erb @@ -19,14 +19,6 @@ # TestSpeechBalloon: 'test_speech_balloon', }, }, - speech_balloons: { - resource_items: { - CircleSpeechBalloon: 'circle_speech_balloon', - PlainSpeechBalloon: 'plain_speech_balloon', - SquareSpeechBalloon: 'square_speech_balloon', - # TestSpeechBalloon: 'test_speech_balloon', - }, - }, writing_formats: { has_route: 0, resource_items: { diff --git a/app/models/panel.rb b/app/models/panel.rb index 606b7623..b601cb0d 100644 --- a/app/models/panel.rb +++ b/app/models/panel.rb @@ -80,7 +80,7 @@ class Panel < Peta::Root r = { :author => {} } - self.child_models('panel').each do |child_model| + self.child_models.each do |child_model| r.merge!(child_model.show_opt_for_panel) end {:include => r} diff --git a/app/models/speech_balloon.rb b/app/models/speech_balloon.rb index a7f08e4a..875041ac 100644 --- a/app/models/speech_balloon.rb +++ b/app/models/speech_balloon.rb @@ -65,50 +65,6 @@ class SpeechBalloon < Peta::Element self.speech_balloon_template.symbol_option end - def boost - self.extend self.speech_balloon_template.engine_speech_balloon_module - if self.balloon - else - self.new_balloon = self.build_balloon - self.new_speech = self.build_speech - end - self.balloon.extend self.speech_balloon_template.engine_balloon_module - self.speech.extend self.speech_balloon_template.engine_speech_module - return false - self.balloon.new_parent = self - self.speech.new_parent = self - self.extend_speech_balloon = if self.settings.blank? - {} - else - JSON.parse(self.settings) - end - self.balloon.extend_balloon = if self.balloon.settings.blank? - {} - else - JSON.parse(self.get_balloon.settings) - end - self.speech.extend_speech = if self.speech.settings.blank? - {} - else - JSON.parse(self.get_speech.settings) - 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 - 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 tag_element_type 'speech_balloon' end diff --git a/app/models/speech_balloon_template.rb b/app/models/speech_balloon_template.rb index 9351b3ae..09e35004 100644 --- a/app/models/speech_balloon_template.rb +++ b/app/models/speech_balloon_template.rb @@ -48,58 +48,6 @@ class SpeechBalloonTemplate < Peta::SystemResource r end - def parsed_settings - @template_settings ||= JSON.parse(self.settings) - end - - def my_engine_resource - Manifest.manifest.system_resources.engine_resources['speech_balloon_templates'] - end - - def engine_name - self.my_engine_resource.resource_items[self.classname] - end - - def enable? - self.my_engine_resource.resource_items.include? self.classname - end - - def engine_module_name - self.engine_name.camelize - end - - def engine - Object.const_get self.engine_module_name - end - - def engine_speech_balloon_model - engine.const_get 'SpeechBalloon' - end - - def engine_speech_balloon_module - engine.const_get 'SpeechBalloonModule' - end - - def engine_extend_module - engine.extend_module - end - - def engine_balloon_model - engine.const_get 'Balloon' - end - - def engine_balloon_module - engine.const_get 'BalloonModule' - end - - def engine_speech_model - engine.const_get 'Speech' - end - - def engine_speech_module - engine.const_get 'SpeechModule' - end - def self.import filename SpeechBalloonTemplate.import_file(filename) {|name, attr| SpeechBalloonTemplate.store(name, attr)} end diff --git a/config/environments/development.rb b/config/environments/development.rb index 9eea6b01..dc6d945f 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,6 +1,7 @@ Pettanr::Application.configure do ActiveSupport::Dependencies.autoload_paths << File::join( Rails.root, 'lib') + ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Peta' ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Editor' ActiveSupport::Dependencies.explicitly_unloadable_constants << 'ManifestBase' ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Manifest' diff --git a/db/migrate/20140329220907_fix_extend_system.rb b/db/migrate/20140329220907_fix_extend_system.rb new file mode 100644 index 00000000..25fa4c92 --- /dev/null +++ b/db/migrate/20140329220907_fix_extend_system.rb @@ -0,0 +1,17 @@ +class FixExtendSystem < ActiveRecord::Migration + def up + rename_column :speech_balloons, :classname, :speech_balloon_template_classname + rename_column :speech_balloons, :settings, :speech_balloon_template_settings + add_column :balloons, :speech_balloon_template_classname, :string, :null => false, :limit => 50 + rename_column :balloons, :settings, :speech_balloon_template_settings + add_column :speeches, :speech_balloon_template_classname, :string, :null => false, :limit => 50 + rename_column :speeches, :settings, :speech_balloon_template_settings + add_column :speeches, :writing_format_classname, :string, :null => false, :limit => 50 + rename_column :speeches, :settings, :writing_format_settings + add_column :licenses, :license_group_classname, :string, :null => false, :limit => 50 + rename_column :licenses, :settings, :license_group_settings + end + + def down + end +end diff --git a/db/migrate/20140329222717_fix_extend_system_data.rb b/db/migrate/20140329222717_fix_extend_system_data.rb new file mode 100644 index 00000000..110a8301 --- /dev/null +++ b/db/migrate/20140329222717_fix_extend_system_data.rb @@ -0,0 +1,33 @@ +class FixExtendSystemData < ActiveRecord::Migration + def up + Balloon.find(:all).each do |balloon| + sbt = balloon.speech_balloon.speech_balloon_template + if balloon.speech_balloon_template_classname.blank? + balloon.speech_balloon_template_classname = sbt.classname + balloon.save! + end + end + Speech.find(:all).each do |speech| + sbt = speech.speech_balloon.speech_balloon_template + if speech.speech_balloon_template_classname.blank? + speech.speech_balloon_template_classname = sbt.classname + speech.save! + end + wf = speech.writing_format + if speech.writing_format_classname.blank? + speech.writing_format_classname = wf.classname + speech.save! + end + end + License.find(:all).each do |license| + lg = license.license_group + if license.license_group_classname.blank? + license.license_group_classname = lg.classname + license.save! + end + end + end + + def down + end +end diff --git a/lib/manifest/item/base.rb b/lib/manifest/item/base.rb index c3a901f1..c48cf985 100644 --- a/lib/manifest/item/base.rb +++ b/lib/manifest/item/base.rb @@ -1,16 +1,43 @@ +ManifestBase.require_modules "manifest/item/", + %w|boost| + module Manifest module ItemModule class BasePeta < ManifestBase::TypeNameArgs + attr :boost + def set_default super + @args['boost'] ||= {} end def init super + @boost = ManifestBase.load_name_values self, @args, 'boost', Boost + end + + def element? + @parent_model_name != nil + end + + def boosts item, level + @boost.each do |name, manifest| + next unless manifest.level == level + Boost::ItemBooster.new(manifest, item).boost + end + end + + def supply_defaults item + @boost.each do |name, manifest| + manifest.supply_default item + end + end + + def model + ::Manifest.manifest.models[@name] end end - end end diff --git a/lib/manifest/item/boost.rb b/lib/manifest/item/boost.rb new file mode 100644 index 00000000..1c3e7fa6 --- /dev/null +++ b/lib/manifest/item/boost.rb @@ -0,0 +1,96 @@ +module Manifest + module ItemModule + class Boost < ManifestBase::NameValues + attr :level, :extend_column_name, :settings_column_name, + :foreign_key, :setter_method_name, :getter_method_name + + def set_default + super + @values['level'] ||= 'post' + @values['extend_column_name'] ||= @name + '_classname' + @values['settings_column_name'] ||= @name + '_settings' + @values['foreign_key'] ||= @name + '_id' + @values['setter_method_name'] ||= @name + '_extend=' + @values['getter_method_name'] ||= @name + '_extend' + end + + def init + super + @level = @values['level'] + @extend_column_name = @values['extend_column_name'] + @settings_column_name = @values['settings_column_name'] + @foreign_key = @values['foreign_key'] + @setter_method_name = @values['setter_method_name'] + @getter_method_name = @values['getter_method_name'] + end + + def extend_model_name + @parent.model.singular + end + + def extend_module_name + @parent.model.singular + 'Module' + end + + class ItemBooster + def initialize manifest, item + @manifest = manifest + @item = item + end + + # get engine's name + def class_name + @item.attributes[@manifest.extend_column_name] + end + + def settings + @item.attributes[@manifest.settings_column_name] + end + + # name space for engine + def engine_module + Object.const_get self.class_name(@item) + end + + # extend module in engine + # ex) CircleSpeechBalloon::SpeechBalloonModule + def engine_extend_module + self.engine_module.const_get @manifest.extend_module_name + end + + # extend settings data model in engine + def engine_extend_model + self.engine_module.const_get @manifest.extend_module_name + end + + # get system resource instance + def resource + r = @item.__send__ @manifest.name + raise 'resource not found' unless r + r + end + + def parsed_settings + if self.settings.blank? + {} + else + JSON.parse(self.settings) + end + end + + def boost + # no check + # return false unless self.resource.enable? + @item.extend self.engine_extend_module + @item.__send__ @manifest.setter_method_name, self.parsed_settings + end + + end + + def supply_default item + self.engine_model(item).engine_extend_module.supply_default item, self + end + + end + end +end diff --git a/lib/manifest/model.rb b/lib/manifest/model.rb index 93f319c1..e513f8e3 100644 --- a/lib/manifest/model.rb +++ b/lib/manifest/model.rb @@ -5,15 +5,13 @@ module Manifest class Model < ManifestBase::Base include ModelModule - attr :attributes, :associations, :list, :extend_column_name + attr :attributes, :associations, :list def set_default super @json['attributes'] ||= {} @json['associations'] ||= {} @json['list'] ||= {} - @json['extend_column_name'] ||= 'classname' - @json['peta'] ||= {} @json['attributes']['id'] = { 'type' => 'number', 'primary_key' => 1, @@ -33,7 +31,6 @@ module Manifest super @attributes = ManifestBase.load_name_values self, @json, 'attributes', Attribute @associations = ManifestBase.load_value self, @json, 'associations', Association - @extend_column_name = @json['extend_column_name'] @list = ManifestBase.load_value self, @json, 'list', List end @@ -69,24 +66,24 @@ module Manifest false end - def child_model_manifests tree_name + def child_model_manifests r = [] - ::Manifest.manifest.models.each {|child_model_name, child_model_manifest| - next unless child_model_manifest.tree[tree_name] - next unless child_model_manifest.tree[tree_name].parent_model_name == @model_name - r << child_model_manifest + ::Manifest.manifest.items.each {|peta_name, peta_manifest| + next unless peta_manifest.element? + next unless peta_manifest.parent_model_name == @model_name + r << peta_manifest.model } r end - def child_models tree_name - self.child_model_manifests(tree_name).map {|child_model_manifest| + def child_models + self.child_model_manifests.map {|child_model_manifest| child_model_manifest.classify } end - def child_element_names tree_name - self.child_models(tree_name).map {|child_model| + def child_element_names + self.child_models.map {|child_model| self.associations.child_element_name(child_model) } end diff --git a/lib/peta/binder.rb b/lib/peta/binder.rb index dda200d7..43323c00 100644 --- a/lib/peta/binder.rb +++ b/lib/peta/binder.rb @@ -12,7 +12,7 @@ module Peta self.__send__ self.class.my_manifest.associations.child_element_name(leaf_model) end define_method("leafs_items") do - self.class.child_models(self.class.leaf_tree_name).map {|child_model| + self.class.child_models.map {|child_model| self.leaf_items child_model }.flatten end @@ -20,6 +20,15 @@ module Peta # Class Methods + # Instance Methods + + def boosts level + super + self.leafs_items.each do |item| + item.boosts level + end + end + end end diff --git a/lib/peta/content.rb b/lib/peta/content.rb index 048012f5..f544a633 100644 --- a/lib/peta/content.rb +++ b/lib/peta/content.rb @@ -13,9 +13,7 @@ module Peta end def self._owner_model - t = self.my_manifest.tree['owner'] - return nil unless t - t.parent_model + self.parent_model end def self._owner_column diff --git a/lib/peta/element.rb b/lib/peta/element.rb index e1abd935..fac8e116 100644 --- a/lib/peta/element.rb +++ b/lib/peta/element.rb @@ -19,7 +19,7 @@ module Peta end def self.root_model - if self.parent_model + if self.parent_model and self.parent_model.element? self.parent_model.root_model else self diff --git a/lib/peta/element_nestable_content.rb b/lib/peta/element_nestable_content.rb index 223b987f..3e58d094 100644 --- a/lib/peta/element_nestable_content.rb +++ b/lib/peta/element_nestable_content.rb @@ -12,7 +12,7 @@ module Peta self.__send__ self.class.my_manifest.associations.child_element_name(element_model) end define_method("elements_items") do - self.class.element_models.map {|element_model| + self.class.child_models.map {|element_model| self.element_items element_model }.flatten end @@ -21,10 +21,18 @@ module Peta # Class Methods # Instance Methods + + def boosts level + super + self.elements_items.each do |item| + item.boosts level + end + end + def post_attributes opt = {} attr = self.copy_attributes hash = {} - self.class.element_models.each do |element_model| + self.class.child_models.each do |element_model| name = self.class.my_manifest.associations.child_element_name(element_model) + '_attributes' hash[name] ||= {} self.element_items(element_model).each do |element| diff --git a/lib/peta/item.rb b/lib/peta/item.rb index 8f865ee4..c738aaa9 100644 --- a/lib/peta/item.rb +++ b/lib/peta/item.rb @@ -8,30 +8,19 @@ module Peta self.my_manifest.valid_encode_columns end - def self._child_models - self.my_manifest.child_models tree_name - end - - def self._extend_column_name - self.my_manifest.extend_column_name - end - def self.load_manifest return nil unless self.my_manifest r = self._valid_encode_columns define_singleton_method("valid_encode_columns") do r end - r = self._child_models + 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 - self.my_manifest.child_element_names tree_name - end - n = self._extend_column_name - define_singleton_method("extend_column_name") do - n + r end # Instance Methods end @@ -110,7 +99,7 @@ module Peta opt = {} opt.merge!(self.show_opt) item = self.find(item_id, opt) - self.boost if self.boost_level_is_read? + item.boosts 'show' raise ActiveRecord::Forbidden unless item.visible?(operators) item end @@ -149,14 +138,6 @@ module Peta self.class.table_name end - def boost_level_is_read? - self.class.my_peta.level == 'show' - end - - def extend_column_name - self.class.extend_column_name - end - def path_name with_engine = false self.class.path_name(with_engine) end @@ -176,33 +157,12 @@ module Peta 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] - end - - def engine? - return false unless self.my_engine_resource - self.my_engine_resource.resource_items.include? self.attributes[self.extend_column_name] - end - - def boost - return false unless self.engine? - self.engine.boost self - @boosted = true - end - - def boosted? - @boosted + def boosts level + self.class.my_peta.boosts self, level end def supply_default - self.my_peta.boost.each do |name, manifest| - manifest.engine_model.engine_extend_module.supply_default - end + self.class.my_peta.supply_defaults self end def overwrite diff --git a/lib/peta/system_resource.rb b/lib/peta/system_resource.rb index 324e6329..f425144a 100644 --- a/lib/peta/system_resource.rb +++ b/lib/peta/system_resource.rb @@ -12,5 +12,14 @@ module Peta } end + def my_engine_resource + Manifest.manifest.system_resources.engine_resources[self.item_name] + end + + def enable? + return false unless er = self.my_engine_resource + er.resource_items.include? self.classname + end + end end diff --git a/public/manifest.json b/public/manifest.json index 31714592..fbf9b366 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -47,19 +47,29 @@ "speech_balloon": { "type": "element", "args": { - "parent_model_name": "panel" + "parent_model_name": "panel", + "boost": { + "speech_balloon_template": {} + } } }, "balloon": { "type": "element", "args": { - "parent_model_name": "speech_balloon" + "parent_model_name": "speech_balloon", + "boost": { + "speech_balloon_template": {} + } } }, "speech": { "type": "element", "args": { - "parent_model_name": "speech_balloon" + "parent_model_name": "speech_balloon", + "boost": { + "writing_format": {}, + "speech_balloon_template": {} + } } }, "ground_picture": { @@ -80,7 +90,15 @@ "speech_balloon_template": {}, "writing_format": {}, "license_group": {}, - "license": {}, + "license": { + "type": "leaf", + "args": { + "parent_model_name": "license_group", + "boost": { + "license_group": {} + } + } + }, "author": {}, "artist": {}, "system_picture": {} @@ -1024,9 +1042,6 @@ "number": true } } - }, - "tree": { - "scroll_owner": "author" } }, "scroll_panel": { @@ -1067,10 +1082,6 @@ "number": true } } - }, - "tree": { - "owner": "scroll", - "scroll_owner": "scroll" } }, "comic": { @@ -1113,9 +1124,6 @@ "number": true } } - }, - "tree": { - "comic_owner": "author" } }, "story": { @@ -1166,10 +1174,6 @@ } } } - }, - "tree": { - "owner": "comic", - "comic_owner": "comic" } }, "story_sheet": { @@ -1208,10 +1212,6 @@ "number": true } } - }, - "tree": { - "owner": "story", - "comic_owner": "story" } }, "sheet": { @@ -1269,9 +1269,6 @@ "number": true } } - }, - "tree": { - "sheet_owner": "author" } }, "sheet_panel": { @@ -1331,10 +1328,6 @@ "number": true } } - }, - "tree": { - "owner": "sheet", - "sheet_owner": "sheet" } }, "panel": { @@ -1406,9 +1399,6 @@ "number": true } } - }, - "tree": { - "panel_owner": "author" } }, "panel_picture": { @@ -1486,11 +1476,6 @@ "min": 0 } } - }, - "tree": { - "owner": "panel", - "panel_owner": "panel", - "panel": "panel" } }, "speech_balloon": { @@ -1549,11 +1534,6 @@ "type": "text", "rules": {} } - }, - "tree": { - "owner": "panel", - "panel_owner": "panel", - "panel": "panel" } }, "balloon": { @@ -1619,11 +1599,6 @@ "type": "text", "rules": {} } - }, - "tree": { - "owner": "speech_balloon", - "panel_owner": "speech_balloon", - "panel": "speech_balloon" } }, "speech": { @@ -1735,11 +1710,6 @@ "type": "text", "rules": {} } - }, - "tree": { - "owner": "speech_balloon", - "panel_owner": "speech_balloon", - "panel": "speech_balloon" } }, "ground_picture": { @@ -1814,11 +1784,6 @@ "min": 0 } } - }, - "tree": { - "owner": "panel", - "panel_owner": "panel", - "panel": "panel" } }, "ground_color": { @@ -1895,11 +1860,6 @@ "min": 0 } } - }, - "tree": { - "owner": "panel", - "panel_owner": "panel", - "panel": "panel" } }, "original_picture": { @@ -2468,13 +2428,6 @@ "SquareSpeechBalloon": "square_speech_balloon" } }, - "speech_balloons": { - "resource_items": { - "CircleSpeechBalloon": "circle_speech_balloon", - "PlainSpeechBalloon": "plain_speech_balloon", - "SquareSpeechBalloon": "square_speech_balloon" - } - }, "writing_formats": { "has_route": 0, "resource_items": { -- 2.11.0