OSDN Git Service

fix: devise
[pettanr/pettanr.git] / app / assets / javascripts / peta / item.js.coffee
index 1c133c5..d2e77c3 100644 (file)
@@ -84,6 +84,13 @@ class Peta.Item extends Backbone.Model
       if my_settings\r
         attr[manifest.settings_column_name] = my_settings.to_json\r
   \r
+  @retrieve: (id, context, options = {}) ->\r
+    item = new this({id: id})\r
+    item.retrieve(context, options)\r
+  \r
+  @trace_routes: () ->\r
+    {}\r
+  \r
   #InstanceMethods\r
   \r
   default_url: () ->\r
@@ -118,6 +125,68 @@ class Peta.Item extends Backbone.Model
     else\r
       @item_name()\r
   \r
+  get_association: (routes, context, options) ->\r
+    routes = [routes] if _.isString(routes)\r
+    route = routes.shift()\r
+    if _.isEmpty(routes)\r
+      # fetching terminate association. callback\r
+      cxt = options.context || context\r
+      @fetch_association(route, cxt, {\r
+        success: (association_item, options) =>\r
+          options.success.call(context, association_item)\r
+        context: context,\r
+        options: options\r
+      })\r
+    else\r
+      # fetching through associations\r
+      @fetch_association(route, this, {\r
+        success: (association_item, options) =>\r
+          association_item.get_association(routes, this, options)\r
+        context: context,\r
+        options: options\r
+      })\r
+  \r
+  fetch_association: (name, context, options) =>\r
+    a = @my_class().my_manifest().associations\r
+    fetch_options = {\r
+      success: (association_item) =>\r
+        options.success.call(context, association_item, options.options)\r
+    }\r
+    if a.belongs_to[name]\r
+      @get_parent(name, context, fetch_options)\r
+    else if a.has_many[name]\r
+      @get_children(name, context, fetch_options)\r
+    else if a.has_one[name]\r
+      @get_child(name, context, fetch_options)\r
+    else\r
+      console.error('association does not exist in model manifest')\r
+  \r
+  get_parent: (belongs_to_name, context, options = null) ->\r
+    m = Manifest.item_name_to_model(belongs_to_name)\r
+    retriever = new Pettanr.Cache.Retriever(m, @get(belongs_to_name + '_id'))\r
+    return retriever if !options\r
+    @listenTo(retriever, 'retrieve', (item) =>\r
+      options.success.call(context, item)\r
+    )\r
+    retriever.retrieve()\r
+  \r
+  get_child: (has_one_name, context, options = null) ->\r
+    list = @has_one(has_one_name)\r
+    list.open(context, {\r
+      success: (items) =>\r
+        callback = options.success\r
+        item = items[0]\r
+        callback.call(context, item)\r
+    })\r
+  \r
+  get_children: (has_many_name, context, options = null) ->\r
+    list = @has_many(has_many_name)\r
+    list.open(context, {\r
+      success: (items) =>\r
+        callback = options.success\r
+        callback.call(context, items)\r
+    })\r
+  \r
   has_many: (has_many_name) ->\r
     has_many_manifest = @my_class().my_manifest().associations.has_many[has_many_name]\r
     action_name = has_many_manifest.list_action_name\r
@@ -133,6 +202,16 @@ class Peta.Item extends Backbone.Model
       controller_name, action_name, {id: @get('id')}\r
     )\r
   \r
+  trace_to: (trace_name, context, options) ->\r
+    routes = @my_class().trace_routes()[trace_name]\r
+    if !routes\r
+      console.error('no trace route')\r
+      return\r
+    @get_association(routes, this, {\r
+      success: (association) => \r
+        options.success.call(context, association)\r
+    })\r
+  \r
   boosts: (level) ->\r
     c = @my_class().my_peta().boost\r
     _.each c, (boost_manifest, boost_name) =>\r
@@ -157,6 +236,14 @@ class Peta.Item extends Backbone.Model
   retriever: () ->\r
     new Pettanr.Cache.Retriever(@my_class(), @get('id'))\r
   \r
+  retrieve: (context, options = {}) ->\r
+    retriever = new Pettanr.Cache.Retriever(@my_class(), @get('id'))\r
+    @listenTo(retriever, 'retrieve', (item) =>\r
+      callback = options.success\r
+      callback.call(context, item)\r
+    )\r
+    retriever.retrieve(options.force)\r
+  \r
   @pick_item_name: () ->\r
     null\r
   \r
@@ -188,6 +275,15 @@ class Peta.Item extends Backbone.Model
     else\r
       'none'\r
   \r
+  symbol_option: (context, options) ->\r
+    @trace_to('symbol', this, {\r
+      success: (symbol_item) => \r
+        options.success.call(context, symbol_item.to_symbol())\r
+    })\r
+  \r
+  to_symbol: () ->\r
+    @tmb_opt_img_tag()\r
+  \r
   icon_view: (half) ->\r
     new Pettanr.Views[@my_class().singular()].Icon({item: this, half: half})\r
   \r