OSDN Git Service

fix profiler extend system
authoryasushiito <yas@pen-chan.jp>
Mon, 7 Apr 2014 02:22:15 +0000 (11:22 +0900)
committeryasushiito <yas@pen-chan.jp>
Mon, 7 Apr 2014 02:22:15 +0000 (11:22 +0900)
37 files changed:
1  2 
app/assets/javascripts/manifest/work/forms.js.coffee.erb
app/assets/javascripts/manifest/work/items.js.coffee.erb
app/assets/javascripts/manifest/work/profilers.js.coffee.erb
app/assets/javascripts/manifest/work/system_resources.js.coffee.erb
app/controllers/application_controller.rb
app/models/license.rb
app/views/templates/r/profiler/_columns.html.erb
app/views/templates/r/profiler/column/_date.html.erb
app/views/templates/r/profiler/column/_default.html.erb
app/views/templates/r/profiler/column/_source.html.erb
config/locales/pettanr.ja.yml
db/migrate/20140329222717_fix_extend_system_data.rb
lib/local_manifest/profiler.rb
lib/local_manifest/profiler/column.rb
lib/local_manifest/profiler/column/base.rb
lib/local_manifest/profiler/column/date.rb
lib/local_manifest/profiler/column/default.rb
lib/local_manifest/profiler/column/extend.rb
lib/local_manifest/profiler/column/source.rb
lib/local_manifest/profiler/extend_setting.rb
lib/local_manifest/profiler/extend_setting/column.rb
lib/local_manifest/profiler/extend_setting/column/base.rb
lib/local_manifest/profiler/extend_setting/column/default.rb
lib/local_manifest/profiler/list.rb
lib/locmare/booster.rb
lib/locmare/profiler.rb
lib/locmare/profiler/column.rb
lib/locmare/profiler/column/base.rb
lib/locmare/profiler/column/date.rb
lib/locmare/profiler/column/default.rb
lib/locmare/profiler/column/extend.rb
lib/locmare/profiler/column/source.rb
lib/manifest_base/factory.rb
lib/peta/item.rb
lib/validators/boost_validator.rb
public/local_manifest.json
public/manifest.json

          'z',\r
          't',\r
        ]\r
-         'icense_group_settings',\r
 +    },\r
 +    speech_balloon_template: {\r
 +      fields: {\r
 +        id: {\r
 +          args: {\r
 +            label: {\r
 +              type: 'none',\r
 +            },\r
 +            tag: {\r
 +              type: 'hidden',\r
 +            },\r
 +          },\r
 +        },\r
 +        name: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        classname: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        caption: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        t: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'number',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        system_picture_id: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'number',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        settings: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +      },\r
 +      field_names: [\r
 +        'id',\r
 +        'name',\r
 +        'classname',\r
 +        'caption',\r
 +        't',\r
 +        'system_picture_id',\r
 +        'settings',\r
 +      ]\r
 +    },\r
 +    writing_format: {\r
 +      fields: {\r
 +        id: {\r
 +          args: {\r
 +            label: {\r
 +              type: 'none',\r
 +            },\r
 +            tag: {\r
 +              type: 'hidden',\r
 +            },\r
 +          },\r
 +        },\r
 +        name: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        classname: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        caption: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        system_picture_id: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'number',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        settings: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +      },\r
 +      field_names: [\r
 +        'id',\r
 +        'name',\r
 +        'classname',\r
 +        'caption',\r
 +        'system_picture_id',\r
 +        'settings',\r
 +      ]\r
 +    },\r
 +    license_group: {\r
 +      fields: {\r
 +        id: {\r
 +          args: {\r
 +            label: {\r
 +              type: 'none',\r
 +            },\r
 +            tag: {\r
 +              type: 'hidden',\r
 +            },\r
 +          },\r
 +        },\r
 +        name: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        classname: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        caption: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        url: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +      },\r
 +      field_names: [\r
 +        'id',\r
 +        'name',\r
 +        'classname',\r
 +        'caption',\r
 +        'url',\r
 +      ]\r
 +    },\r
 +    license: {\r
 +      fields: {\r
 +        id: {\r
 +          args: {\r
 +            label: {\r
 +              type: 'none',\r
 +            },\r
 +            tag: {\r
 +              type: 'hidden',\r
 +            },\r
 +          },\r
 +        },\r
 +        license_group_id: {\r
 +          args: {\r
 +            label: {\r
 +              type: 'none',\r
 +            },\r
 +            tag: {\r
 +              type: 'hidden',\r
 +            },\r
 +          },\r
 +        },\r
 +        license_group_classname: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        name: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        caption: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        system_picture_id: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'number',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        url: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        license_group_settings: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +        credit_picture_settings: {\r
 +          args: {\r
 +            tag: {\r
 +              type: 'text',\r
 +            },\r
 +            row_break: true,\r
 +          },\r
 +        },\r
 +      },\r
 +      field_names: [\r
 +        'id',\r
 +        'license_group_id',\r
 +        'license_group_classname',\r
 +        'name',\r
 +        'caption',\r
 +        'system_picture_id',\r
 +        'url',\r
++        'license_group_settings',\r
 +        'credit_picture_settings',\r
 +      ]\r
      }\r
      author: {\r
        fields: {\r
          license_group: {\r
          },\r
          credit_picture: {\r
++          level: 'read',\r
++          extend_model_class_name: 'CreditPicture',\r
            extend_item_name: 'credit_picture',\r
            extend_column_name: 'license_group_classname',\r
          },\r
@@@ -1,6 -1,6 +1,11 @@@
  #マニフェスト\r
  @profilers = {\r
    scroll: {\r
++    columns: {\r
++      visible: {\r
++        type: 'source',\r
++      }, \r
++    },\r
      column_names: [\r
        'title', \r
        'description', \r
        },\r
        license_group_settings: {\r
          type: 'extend',\r
++        args: {\r
++          boost_name: 'license_group',\r
++        },\r
+       }, \r
+       credit_picture_settings: {\r
+         type: 'extend',\r
++        args: {\r
++          boost_name: 'credit_picture',\r
++        },\r
        }, \r
      },\r
      column_names: [\r
@@@ -22,7 -22,7 +22,7 @@@
      writing_formats: {\r
        has_route: 0,\r
        resource_items: {\r
--        SimpleFormat: 'pettanr_simple_format',\r
++        PettanrSimpleFormat: 'pettanr_simple_format',\r
        },\r
      },\r
    },\r
@@@ -66,14 -66,10 +66,14 @@@ class ApplicationController < ActionCon
      authenticate_user! unless @operators.user?
    end
    
-   def authenticate_user
-     authenticate_user! unless @operators.user?
+   def authenticate_resource_reader
+     authenticate_user! unless @operators.resource_reader?
    end
    
 +  def authenticate_admin
 +    authenticate_admin! unless @operators.admin?
 +  end
 +  
    def authenticate_author
      if @operators.author
        true
Simple merge
@@@ -1,5 -1,5 +1,5 @@@
  <div class="columns">
--  <% profiler.columns.each do |column| %>
++  <% profiler.each_column do |column| %>
      <%= render column.template_name, :column => column %>
    <% end %>
  </div>
index 0000000,0000000..b5a6e27
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++<div class="column">
++  <%= column.label %>
++  <%= render column.value_template_name, :column => column %>
++</div>
index 0000000,0000000..b5a6e27
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++<div class="column">
++  <%= column.label %>
++  <%= render column.value_template_name, :column => column %>
++</div>
@@@ -297,7 -297,7 +297,7 @@@ ja
          url: URL
          system_picture_id: マーク
          license_group_settings: ライセンス拡張データ
--        credit_pictures: クレジット内画像
++        credit_picture_settings: クレジット内画像
          created_at: 作成
          updated_at: 更新
        author:
@@@ -5,28 -5,28 +5,30 @@@ class FixExtendSystemData < ActiveRecor
        if balloon.speech_balloon_template_classname == 'noname'
          balloon.speech_balloon_template_id = sbt.id
          balloon.speech_balloon_template_classname = sbt.classname
--        balloon.save!
++        balloon.boosts 'post'
        end
++      balloon.save!
      end
      Speech.find(:all).each do |speech|
        sbt = speech.speech_balloon.speech_balloon_template
        if speech.speech_balloon_template_classname == 'noname'
          speech.speech_balloon_template_id = sbt.id
          speech.speech_balloon_template_classname = sbt.classname
--        speech.save!
        end
        wf =  speech.writing_format
        if speech.writing_format_classname == 'noname'
          speech.writing_format_classname = wf.classname
--        speech.save!
        end
++      speech.boosts 'post'
++      speech.save!
      end
      License.find(:all).each do |license|
        lg = license.license_group
        if license.license_group_classname == 'noname'
          license.license_group_classname = lg.classname
--        license.save!
        end
++      license.boosts 'post'
++      license.save!
      end
    end
  
@@@ -1,23 -1,23 +1,34 @@@
  ManifestBase.require_modules "local_manifest/profiler/", 
--  %w|list association|
++  %w|column extend_setting list association|
  
  module LocalManifest
    class Profiler < ManifestBase::Base
      include ProfilerModule
      
--    attr :column_names, :lists, :associations
++    attr :columns, :column_names, :extend_settings, :lists, :associations
      
      def set_default
        super
++      @json['columns'] ||= {}
        @json['column_names'] ||= []
++      @json['extend_settings'] ||= {}
        @json['lists'] ||= {}
        @json['associations'] ||= {}
++      # supply column configures
++      @json['column_names'] = ['id'] + @json['column_names'] + ['created_at', 'updated_at']
++      @json['columns']['created_at'] = {'type' => 'date'}
++      @json['columns']['updated_at'] = {'type' => 'date'}
++      @json['column_names'].each do |column_name|
++        @json['columns'][column_name] = {} unless @json['columns'][column_name]
++      end
      end
      
      def init
        super
--      @column_names = ['id'] + @json['column_names'] + ['created_at', 'updated_at']
--      @lists =  ManifestBase.load_type_name_args self, @json, 'lists', List
++      @columns =  ManifestBase.load_type_name_args self, @json, 'columns', ColumnFactory
++      @column_names = @json['column_names']
++      @extend_settings = ManifestBase.load_name_values self, @json, 'extend_settings', ExtendSetting
++      @lists = ManifestBase.load_name_values self, @json, 'lists', List
        @associations = ManifestBase.load_value self, @json, 'associations', Association
      end
      
index 0000000,0000000..351a47c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++ManifestBase.require_modules "local_manifest/profiler/column/", 
++  %w|base default date source extend|
++
++module LocalManifest
++  module ProfilerModule
++    class ColumnFactory < ManifestBase::Factory
++      include ColumnModule
++      
++      def self.types
++        {
++          'default' => DefaultColumn, 'date' => DateColumn, 
++          'source' => SourceColumn, 'extend' => ExtendColumn
++        }
++      end
++      
++      def self.default_type
++        'default'
++      end
++      
++    end
++  end
++  
++end
++
index 0000000,0000000..5acf55b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++module LocalManifest
++  module ProfilerModule
++    module ColumnModule
++      class Base < ManifestBase::TypeNameArgs
++        
++        def set_default
++          super
++        end
++        
++        def init
++          super
++        end
++        
++        def item_name
++          @parent.item_name
++        end
++        
++        def profiler
++          @parent
++        end
++        
++      end
++    end
++  end
++end
index 0000000,0000000..6ee9f42
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,18 @@@
++module LocalManifest
++  module ProfilerModule
++    module ColumnModule
++      class DateColumn < Base
++        
++        def set_default
++          super
++        end
++        
++        def init
++          super
++        end
++        
++      end
++      
++    end
++  end
++end
index 0000000,0000000..618f5f3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,18 @@@
++module LocalManifest
++  module ProfilerModule
++    module ColumnModule
++      class DefaultColumn < Base
++        
++        def set_default
++          super
++        end
++        
++        def init
++          super
++        end
++        
++      end
++      
++    end
++  end
++end
index 0000000,0000000..2fa1c6d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,28 @@@
++module LocalManifest
++  module ProfilerModule
++    module ColumnModule
++      class ExtendColumn < Base
++        attr :boost_name
++        
++        def set_default
++          super
++          @args['boost_name'] ||= @name.gsub(/_settings/, '')
++        end
++        
++        def init
++          super
++          @boost_name = @args['boost_name']
++        end
++        
++        def item_manifest
++          Manifest.manifest.items[self.profiler.name]
++        end
++        
++        def boost_manifest
++          self.item_manifest.boost[@boost_name]
++        end
++        
++      end
++    end
++  end
++end
index 0000000,0000000..77ec5fa
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,18 @@@
++module LocalManifest
++  module ProfilerModule
++    module ColumnModule
++      class SourceColumn < Base
++        
++        def set_default
++          super
++        end
++        
++        def init
++          super
++        end
++        
++      end
++      
++    end
++  end
++end
index 0000000,0000000..ddcefab
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++ManifestBase.require_modules "local_manifest/profiler/extend_setting/", 
++  %w|column|
++
++module LocalManifest
++  module ProfilerModule
++    class ExtendSetting < ManifestBase::NameValues
++      include ExtendSettingModule
++      attr :columns, :column_names
++      
++      def set_default
++        super
++        @values['columns'] ||= {}
++        @values['column_names'] ||= []
++      end
++      
++      def init
++        super
++        @columns =  ManifestBase.load_type_name_args self, @values, 'columns', ColumnFactory
++        @column_names = @values['column_names']
++      end
++      
++    end
++  end
++end
index 0000000,0000000..2d90e90
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++ManifestBase.require_modules "local_manifest/profiler/column/", 
++  %w|base default|
++
++module LocalManifest
++  module ProfilerModule
++    module ExtendSettingModule
++      class ColumnFactory < ManifestBase::Factory
++        include ColumnModule
++        
++        def self.types
++          {
++            'default' => DefaultColumn
++          }
++        end
++        
++        def self.default_type
++          'default'
++        end
++        
++      end
++    end
++  end
++end
++
index 0000000,0000000..2ed8e72
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,27 @@@
++module LocalManifest
++  module ProfilerModule
++    module ExtendSettingModule
++      module ColumnModule
++        class Base < ManifestBase::TypeNameArgs
++          
++          def set_default
++            super
++          end
++          
++          def init
++            super
++          end
++          
++          def item_name
++            @parent.item_name
++          end
++          
++          def profiler
++            @parent
++          end
++          
++        end
++      end
++    end
++  end
++end
index 0000000,0000000..3e24c40
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,20 @@@
++module LocalManifest
++  module ProfilerModule
++    module ExtendSettingModule
++      module ColumnModule
++        class DefaultColumn < Base
++          
++          def set_default
++            super
++          end
++          
++          def init
++            super
++          end
++          
++        end
++        
++      end
++    end
++  end
++end
@@@ -1,33 -1,33 +1,24 @@@
  module LocalManifest
    module ProfilerModule
--    class List
--      attr :profiler, :my_name, :list_manifest, 
--        :model_name, :list_name
--      
--      def initialize profiler, my_name, list_manifest
--        @profiler = profiler
--        @my_name = my_name
--        @list_manifest = list_manifest
--        self.set_default
--        self.init
--      end
++    class List < ManifestBase::NameValues
++      attr :model_name, :list_name
        
        def set_default
--        raise "undefined model_name for profilers > #{self.profiler_name} > lists > #{@my_name}\n" unless @list_manifest['model_name']
--        raise "undefined list_name for profilers > #{self.profiler_name} > lists > #{@my_name}\n" unless @list_manifest['list_name']
++        ManifestBase::alert_undefined_message "model_name", self.module_message unless @json['model_name']
++        ManifestBase::alert_undefined_message "list_name", self.module_message unless @json['list_name']
        end
        
        def init
--        @model_name = list_manifest['model_name']
--        @list_name = list_manifest['list_name']
++        @model_name = @json['model_name']
++        @list_name = @json['list_name']
        end
        
        def profiler_name
--        @profiler.item_name
++        @parent.item_name
        end
        
        def profiler_manifest
--        @profiler.profiler_manifest
++        @parent.manifest
        end
        
      end
@@@ -5,18 -5,10 +5,12 @@@ module Locmar
      def initialize manifest, item
        @manifest = manifest
        @item = item
-       raise 'blank foreign_key' + @manifest.name unless self.check_resource
        # no check
        # return false unless self.resource.enable?
-       if extendable?
 -      @item.extend self.engine_extend_module
 -      @item.__send__ @manifest.setter_method_name, self.parsed_settings
++      if self.extendable?
 +        @item.extend self.engine_extend_module
 +        @item.__send__ @manifest.setter_method_name, self.parsed_settings
 +      end
-       @boosted = true
-     end
-     
-     def boosted?
-       @boosted
      end
      
      # get engine resource from system resource manifest
        Object.const_get self.class_name
      end
      
-       self.engine_module.constants.include? @manifest.extend_module_name
 +    def extendable?
++      self.engine_module.constants.include? @manifest.extend_module_name.to_sym
 +    end
 +    
      # extend module in engine
      # ex) CircleSpeechBalloon::SpeechBalloonModule
      def engine_extend_module
        self.engine_module.const_get @manifest.extend_model_name
      end
      
 +    def check_resource
 +      @item.attributes[@manifest.foreign_key].blank? == false
 +    end
 +    
      # get system resource instance
      def resource
 -      r = @item.__send__ @manifest.name
 -      raise 'resource not found' unless r
++      raise 'blank foreign_key ' + @manifest.name unless self.check_resource
 +      r = @item.__send__ @manifest.resource_name
 +      raise 'resource not found' + @manifest.resource_name unless r
        r
      end
      
++    # get extend instance
++    def extend_item
++      @item.__send__ @manifest.getter_method_name
++    end
++    
      def parsed_settings
        if self.settings.blank?
          {}
@@@ -16,12 -16,12 +16,23 @@@ module Locmar
        @profiler_manifest = LocalManifest.manifest.profilers[@item_name]
        @template_dir = 'templates/r/profiler/'
        @header = Header.new self
--      @columns = @profiler_manifest.column_names.map {|column_name|
--        Column.new self, column_name
++      @columns = {}
++      @profiler_manifest.columns.each {|name, column|
++        @columns[name] = Column.factory self, column
        }
        @associations = Association.new self, @profiler_manifest.associations
      end
      
++    def each_column
++      @profiler_manifest.column_names.each {|column_name|
++        yield @columns[column_name]
++      }
++    end
++    
++    def peta
++      Manifest.manifest.items[@item_name]
++    end
++    
      def model
        ::Manifest::item_name_to_model @item_name
      end
++require_dependency "locmare/profiler/column/base"
++require_dependency "locmare/profiler/column/default"
++require_dependency "locmare/profiler/column/date"
++require_dependency "locmare/profiler/column/source"
++require_dependency "locmare/profiler/column/extend"
  module Locmare
    module ProfilerModule
      class Column
--      attr :profiler, :column_name
--      def initialize profiler, column_name
--        @profiler = profiler
--        @column_name = column_name
--      end
--      
--      def label
--        self.item.class.human_attribute_name(@column_name)
--      end
--      
--      def value
--        if self.item.extend_column?(@column_name)
--          
--        else
--          self.item.attributes[@column_name]
--        end
--      end
--      
--      def note
--      end
--      
--      def date?
--        case model_attribute_manifest.type
--        when 'datetime'
--          if self.value
--            true
--          else
--            false
--          end
--        else
--          false
--        end
--      end
--      
--      def note?
--        if self.model_attribute_source_manifest
--          case self.model_attribute_source_manifest.type
--          when 'magic_number'
--            true
--          when 'model'
--            false
--          else
--            false
--          end
--        else
--          false
--        end
--      end
--      
--      def select_item_name
--        self.model_attribute_source_manifest.select_item_name
--      end
--      
--      def item
--        @profiler.item
--      end
--      
--      def model_manifest
--        ::Manifest.manifest.models[@profiler.item_name]
--      end
--      
--      def model_attribute_manifest
--        self.model_manifest.attributes[@column_name]
--      end
--      
--      def model_attribute_source_manifest
--        self.model_attribute_manifest.source
--      end
--      
--      def template_dir 
--        @profiler.template_dir
--      end
--      
--      def template_file_name
--        "column"
--      end
--      
--      def template_name
--        self.template_dir + self.template_file_name
--      end
--      
--      def value_template_dir 
--        @profiler.template_dir + "column_value/"
--      end
--      
--      def value_template_file_name
--        if self.date?
--          'date'
--        else
--          'default'
--        end
--      end
--      
--      def value_template_name
--        self.value_template_dir + self.value_template_file_name
--      end
--      
--      def note_template_dir 
--        @profiler.template_dir + "column_note/"
--      end
--      
--      def note_template_file_name
--        if self.note?
--          'default'
--        else
--          'none'
--        end
--      end
--      
--      def note_template_name
--        self.note_template_dir + self.note_template_file_name
++      include ColumnModule
++      @@types = {
++        'default' => Default, 'date' => Date, 'source' => Source, 'extend' => Extend
++      }
++      def self.factory profiler, my_manifest
++        type = my_manifest.type
++        raise "undefined type for local view filers > #{profiler.item_name} > edit\n" unless type
++        my_class = @@types[type]
++        raise "undefined class for local view filers > #{profiler.item_name} > edit > #{type}\n" unless my_class
++        my_class.new(profiler,  my_manifest)
        end
        
      end
index 0000000,0000000..7178640
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,51 @@@
++module Locmare
++  module ProfilerModule
++    module ColumnModule
++      class Base
++        attr :profiler, :column_name
++        def initialize profiler, column
++          @profiler = profiler
++          @column = column
++          @column_name = @column.name
++        end
++        
++        def label
++          self.item.class.human_attribute_name(@column_name)
++        end
++        
++        def value
++          self.item.attributes[@column_name]
++        end
++        
++        def item
++          @profiler.item
++        end
++        
++        def template_dir 
++          @profiler.template_dir + "column/"
++        end
++        
++        def template_file_name
++          "default"
++        end
++        
++        def template_name
++          self.template_dir + self.template_file_name
++        end
++        
++        def value_template_dir 
++          @profiler.template_dir + "column_value/"
++        end
++        
++        def value_template_file_name
++          'default'
++        end
++        
++        def value_template_name
++          self.value_template_dir + self.value_template_file_name
++        end
++        
++      end
++    end
++  end
++end
index 0000000,0000000..fcd866e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,22 @@@
++module Locmare
++  module ProfilerModule
++    module ColumnModule
++      class Date < Base
++        
++        def template_file_name
++          "date"
++        end
++        
++        def value_template_file_name
++          if self.value
++            'date'
++          else
++            # nil value can't localize for datetime
++            'default'
++          end
++        end
++        
++      end
++    end
++  end
++end
index 0000000,0000000..c6ec53d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,9 @@@
++module Locmare
++  module ProfilerModule
++    module ColumnModule
++      class Default < Base
++        
++      end
++    end
++  end
++end
index 0000000,0000000..72637c0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,21 @@@
++module Locmare
++  module ProfilerModule
++    module ColumnModule
++      class Extend < Base
++        
++        def value
++          self.extend_model_name
++        end
++        
++        def extend_model_name
++          self.item.boosters[@column.boost_name].model_name
++        end
++        
++        def extend_item
++          self.item.boosters[@column.boost_name].extend_item
++        end
++        
++      end
++    end
++  end
++end
index 0000000,0000000..dace381
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,41 @@@
++module Locmare
++  module ProfilerModule
++    module ColumnModule
++      class Source < Base
++        
++        def select_item_name
++          self.model_attribute_source_manifest.select_item_name
++        end
++        
++        def model_manifest
++          ::Manifest.manifest.models[@profiler.item_name]
++        end
++        
++        def model_attribute_manifest
++          self.model_manifest.attributes[@column_name]
++        end
++        
++        def model_attribute_source_manifest
++          self.model_attribute_manifest.source
++        end
++        
++        def template_file_name
++          "source"
++        end
++        
++        def note_template_dir 
++          @profiler.template_dir + "column_note/"
++        end
++        
++        def note_template_file_name
++          'default'
++        end
++        
++        def note_template_name
++          self.note_template_dir + self.note_template_file_name
++        end
++        
++      end
++    end
++  end
++end
@@@ -12,9 -12,9 +12,9 @@@ module ManifestBas
        module_message = ManifestBase.module_message(parent.module_names, [module_name, name])
        json['type'] ||= self.default_type
        type = json['type']
--      alert_undefined_message 'type', module_message unless type
++      ManifestBase.alert_undefined_message 'type', module_message unless type
        my_class = self.types[type]
--      alert_undefined_message 'class', module_message unless my_class
++      ManifestBase.alert_undefined_message 'class', module_message unless my_class
        my_class.new(parent, name, json, module_name)
      end
      
@@@ -22,9 -22,9 +22,9 @@@
        module_message = ManifestBase.module_message(parent.module_names, [module_name])
        json['type'] ||= self.default_type
        type = json['type']
--      alert_undefined_message 'type', module_message unless type
++      ManifestBase.alert_undefined_message 'type', module_message unless type
        my_class = self.types[type]
--      alert_undefined_message 'class', module_message unless my_class
++      ManifestBase.alert_undefined_message 'class', module_message unless my_class
        my_class.new(parent, json, module_name)
      end
      
@@@ -1,6 -1,6 +1,7 @@@
  module Peta
    class Item < ActiveRecord::Base
      self.abstract_class = true
++    attr :boosters
      
      # Dynamic ClassMethods
      
        self.plural.underscore
      end
      
++    def self.extend_column? column_name
++      self.my_peta.extend_column? column_name
++    end
++    
      def self.visible_count_options
        nil
      end
        end
      end
      
+     def boost boost_manifest
+       @boosters ||= {}
+       @boosters[boost_manifest.name] = Locmare::Booster.new(boost_manifest, self)
+     end
+     
      def extend_column? column_name
--      self.class.my_peta.extend_column? column_name
++      self.class.extend_column? column_name
      end
      
      def supply_default
index 40dce60,0000000..63ad5af
mode 100644,000000..100644
--- /dev/null
@@@ -1,8 -1,0 +1,8 @@@
-     resource = record.boosters[options[:resource_name].to_s].resource\r
 +class BoostValidator < ActiveModel::EachValidator\r
 +  def validate_each(record, attribute, value)\r
-     record.errors[attribute] << msg unless resource.valid?\r
++    rec = record.boosters[options[:resource_name].to_s].extend_item\r
 +    msg = options[:message] || I18n.t('activerecord.errors.messages.extend_settings')\r
++    record.errors[attribute] << msg unless rec.valid?\r
 +  end\r
 +end\r
 +\r
    },\r
    "profilers": {\r
      "scroll": {\r
++      "columns": {\r
++        "visible": {\r
++          "type": "source"\r
++        }\r
++      },\r
        "column_names": [\r
          "title",\r
          "description",\r
          "system_picture_id": {},\r
          "url": {},\r
          "license_group_settings": {\r
--          "type": "extend"\r
++          "type": "extend",\r
++          "args": {\r
++            "parent_model_name": "panel"\r
++          }\r
+         },\r
+         "credit_picture_settings": {\r
 -          "type": "extend"\r
++          "type": "extend",\r
++          "args": {\r
++            "boost_name": "credit_picture"\r
++          }\r
          }\r
        },\r
        "column_names": [\r
            "t"\r
          ]\r
        },\r
-           "icense_group_settings",\r
 +      "speech_balloon_template": {\r
 +        "fields": {\r
 +          "id": {\r
 +            "args": {\r
 +              "label": {\r
 +                "type": "none"\r
 +              },\r
 +              "tag": {\r
 +                "type": "hidden"\r
 +              }\r
 +            }\r
 +          },\r
 +          "name": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "classname": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "caption": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "t": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "number"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "system_picture_id": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "number"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "settings": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          }\r
 +        },\r
 +        "field_names": [\r
 +          "id",\r
 +          "name",\r
 +          "classname",\r
 +          "caption",\r
 +          "t",\r
 +          "system_picture_id",\r
 +          "settings"\r
 +        ]\r
 +      },\r
 +      "writing_format": {\r
 +        "fields": {\r
 +          "id": {\r
 +            "args": {\r
 +              "label": {\r
 +                "type": "none"\r
 +              },\r
 +              "tag": {\r
 +                "type": "hidden"\r
 +              }\r
 +            }\r
 +          },\r
 +          "name": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "classname": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "caption": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "system_picture_id": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "number"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "settings": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          }\r
 +        },\r
 +        "field_names": [\r
 +          "id",\r
 +          "name",\r
 +          "classname",\r
 +          "caption",\r
 +          "system_picture_id",\r
 +          "settings"\r
 +        ]\r
 +      },\r
 +      "license_group": {\r
 +        "fields": {\r
 +          "id": {\r
 +            "args": {\r
 +              "label": {\r
 +                "type": "none"\r
 +              },\r
 +              "tag": {\r
 +                "type": "hidden"\r
 +              }\r
 +            }\r
 +          },\r
 +          "name": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "classname": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "caption": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "url": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          }\r
 +        },\r
 +        "field_names": [\r
 +          "id",\r
 +          "name",\r
 +          "classname",\r
 +          "caption",\r
 +          "url"\r
 +        ]\r
 +      },\r
 +      "license": {\r
 +        "fields": {\r
 +          "id": {\r
 +            "args": {\r
 +              "label": {\r
 +                "type": "none"\r
 +              },\r
 +              "tag": {\r
 +                "type": "hidden"\r
 +              }\r
 +            }\r
 +          },\r
 +          "license_group_id": {\r
 +            "args": {\r
 +              "label": {\r
 +                "type": "none"\r
 +              },\r
 +              "tag": {\r
 +                "type": "hidden"\r
 +              }\r
 +            }\r
 +          },\r
 +          "license_group_classname": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "name": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "caption": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "system_picture_id": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "number"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "url": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "license_group_settings": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          },\r
 +          "credit_picture_settings": {\r
 +            "args": {\r
 +              "tag": {\r
 +                "type": "text"\r
 +              },\r
 +              "row_break": true\r
 +            }\r
 +          }\r
 +        },\r
 +        "field_names": [\r
 +          "id",\r
 +          "license_group_id",\r
 +          "license_group_classname",\r
 +          "name",\r
 +          "caption",\r
 +          "system_picture_id",\r
 +          "url",\r
++          "license_group_settings",\r
 +          "credit_picture_settings"\r
 +        ]\r
 +      },\r
        "author": {\r
          "fields": {\r
            "id": {\r
Simple merge