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
    picture: {\r
      args: {\r
        boost: {\r
+         license_group: {\r
+         },\r
          license: {\r
            extend_item_name: 'attribute',\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
        },\r
      },\r
    },\r
    resource_picture: {\r
      args: {\r
        boost: {\r
+         license_group: {\r
+         },\r
          license: {\r
            extend_item_name: 'attribute',\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
        },\r
      },\r
    },\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
        'url', \r
      ],\r
      extend_settings: {\r
-       pettanr_pettan_commons_v01_licenses: {\r
+       pettanr_pettan_commons_v01_licenses_license: {\r
          columns: {\r
            open: {\r
            },\r
            'overlap', \r
          ],\r
        },\r
+       pettanr_pettan_commons_v01_licenses_credit_picture: {\r
+         columns: {\r
+         },\r
+         column_names: [\r
+           'source_url_btn_id', \r
+           'source_url_off_btn_id', \r
+         ],\r
+       },\r
      },\r
      associations: {\r
        has_many: [\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
        'system_picture_id', \r
        'url', \r
        'license_group_settings', \r
-       'credit_pictures', \r
+       'credit_picture_settings', \r
      ],\r
      associations: {\r
        belongs_to: [\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
diff --combined app/models/license.rb
@@@ -1,5 -1,5 +1,5 @@@
  #
 -class License < Peta::Item
 +class License < Peta::SystemResource
    load_manifest
    belongs_to :license_group
    belongs_to :system_picture
@@@ -9,7 -9,7 +9,7 @@@
    validates :license_group_classname, :presence => true, :length => {:maximum => 50}
    validates :name, :presence => true, :length => {:maximum => 50}
    validates :caption, :presence => true, :length => {:maximum => 30}
-   validates :url, :presence => true, :length => {:maximum => 200}, :uniqueness => true, :url => {:message => I18n.t('errors.messages.url')} #{:allow_blank => true}
+   validates :url, :presence => true, :length => {:maximum => 200}, :uniqueness => {:scope => :name}, :url => {:message => I18n.t('errors.messages.url')} #{:allow_blank => true}
    validates :system_picture_id, :presence => true, :numericality => true, :existence => {:both => false}
    
    def supply_default
@@@ -52,7 -52,8 +52,8 @@@
    
    def self.store name, attr
      r = License.replace_system_picture attr
-     attr['credit_pictures'] = attr['credit_pictures'].to_json
+     attr['credit_picture_settings'] = attr['credit_picture_settings'].to_json
+     attr['license_group_settings'] = attr['license_group_settings'].to_json
      l = License.modify_object name, attr
      if r == false
        l.errors.add :base, SystemPicture.model_name.human + I18n.t('errors.not_create')
@@@ -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
diff --combined lib/locmare/booster.rb
@@@ -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?
          {}
diff --combined lib/locmare/profiler.rb
@@@ -11,17 -11,17 +11,28 @@@ module Locmar
        @item = item
        @operators = operators
        # feasible show parsed extend data
-       @item.boost 'post'
+       @item.boosts 'post'
        
        @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
      
diff --combined lib/peta/item.rb
@@@ -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
        opt = {}
        opt.merge!(self.show_opt)
        item = self.find(item_id, opt)
-       item.boost 'show'
+       item.boosts 'read'
        raise ActiveRecord::Forbidden unless item.visible?(operators)
        item
      end
        end
      end
      
-     def boost level
+     def boosts level
        self.class.my_peta.boost.each do |boost_name, boost_manifest|
          next unless boost_manifest.level == level
-         Locmare::Booster.new(boost_manifest, self)
+         self.boost boost_manifest
        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
          "url"\r
        ],\r
        "extend_settings": {\r
-         "pettanr_pettan_commons_v01_licenses": {\r
+         "pettanr_pettan_commons_v01_licenses_license": {\r
            "columns": {\r
              "open": {},\r
              "commercial": {},\r
              "sync_vh",\r
              "overlap"\r
            ]\r
+         },\r
+         "pettanr_pettan_commons_v01_licenses_credit_picture": {\r
+           "columns": {},\r
+           "column_names": [\r
+             "source_url_btn_id",\r
+             "source_url_off_btn_id"\r
+           ]\r
          }\r
        },\r
        "associations": {\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
          "system_picture_id",\r
          "url",\r
          "license_group_settings",\r
-         "credit_pictures"\r
+         "credit_picture_settings"\r
        ],\r
        "associations": {\r
          "belongs_to": [\r
        "summary": {\r
          "type": "none"\r
        },\r
 -      "edit": {\r
 -        "type": "none"\r
 -      }\r
 +      "edit": {}\r
      },\r
      "writing_format": {\r
        "symbol": {},\r
        "summary": {\r
          "type": "none"\r
        },\r
 -      "edit": {\r
 -        "type": "none"\r
 -      }\r
 +      "edit": {}\r
      },\r
      "license_group": {\r
        "symbol": {},\r
        "summary": {\r
          "type": "none"\r
        },\r
 -      "edit": {\r
 -        "type": "none"\r
 -      }\r
 +      "edit": {}\r
      },\r
      "license": {\r
        "symbol": {},\r
          }\r
        },\r
        "summary": {},\r
 -      "edit": {\r
 -        "type": "none"\r
 -      }\r
 +      "edit": {}\r
      },\r
      "author": {\r
        "symbol": {},\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
diff --combined public/manifest.json
      "picture": {\r
        "args": {\r
          "boost": {\r
+           "license_group": {},\r
            "license": {\r
              "extend_item_name": "attribute"\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
          }\r
        }\r
      "resource_picture": {\r
        "args": {\r
          "boost": {\r
+           "license_group": {},\r
            "license": {\r
              "extend_item_name": "attribute"\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
          }\r
        }\r
          "boost": {\r
            "license_group": {},\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
            "args": {\r
              "list_name": "public"\r
            }\r
 +        },\r
 +        "new": {\r
 +          "type": "new"\r
 +        },\r
 +        "edit": {\r
 +          "type": "edit"\r
          }\r
        }\r
      },\r
          },\r
          "count_by_system_picture": {\r
            "type": "count"\r
 +        },\r
 +        "new": {\r
 +          "type": "new"\r
 +        },\r
 +        "edit": {\r
 +          "type": "edit"\r
          }\r
        }\r
      },\r
            "args": {\r
              "list_name": "public"\r
            }\r
 +        },\r
 +        "new": {\r
 +          "type": "new"\r
 +        },\r
 +        "edit": {\r
 +          "type": "edit"\r
          }\r
        }\r
      },\r
          },\r
          "count_by_system_picture": {\r
            "type": "count"\r
 +        },\r
 +        "new": {\r
 +          "type": "new"\r
 +        },\r
 +        "edit": {\r
 +          "type": "edit"\r
          }\r
        }\r
      },\r
              "required": true\r
            }\r
          },\r
-         "credit": {\r
+         "license_group_settings": {\r
+           "type": "text",\r
+           "rules": {}\r
+         },\r
+         "credit_picture_settings": {\r
            "type": "text",\r
            "rules": {}\r
          },\r
              "required": true\r
            }\r
          },\r
-         "credit": {\r
+         "license_group_settings": {\r
+           "type": "text",\r
+           "rules": {}\r
+         },\r
+         "credit_picture_settings": {\r
            "type": "text",\r
            "rules": {}\r
          },\r
            "type": "text",\r
            "rules": {}\r
          },\r
-         "credit_pictures": {\r
+         "credit_picture_settings": {\r
            "type": "text",\r
            "rules": {}\r
          }\r
          }\r
        }\r
      },\r
+     "pettanr_pettan_commons_v01_licenses_credit_picture": {\r
+       "attributes": {\r
+         "source_url_btn_id": {\r
+           "type": "number",\r
+           "rules": {\r
+             "required": true,\r
+             "number": true\r
+           }\r
+         },\r
+         "source_url_off_btn_id": {\r
+           "type": "number",\r
+           "rules": {\r
+             "required": true,\r
+             "number": true\r
+           }\r
+         }\r
+       }\r
+     },\r
      "pettanr_pettan_commons_v01_licenses_attribute": {\r
        "attributes": {\r
          "license_id": {\r