OSDN Git Service

fix: finder
[pettanr/pettanr.git] / app / assets / javascripts / peta / item.js.coffee
1 class Peta.Item extends Backbone.Model\r
2   \r
3   initialize: (attr = {}, options = {}) ->\r
4     @url = @default_url()\r
5     super(attr, options)\r
6     @expire_time = options.expire_time\r
7     @boosters = {}\r
8     @templates = {}\r
9   \r
10   @child_models: () ->\r
11     @my_manifest().child_models()\r
12   \r
13   @child_element_names: () ->\r
14     @my_manifest().child_element_names()\r
15   \r
16   # ClassMethods\r
17   \r
18   @default_url: () ->\r
19     '/' + @table_name() + '/'\r
20   \r
21   @my_class: () ->\r
22     this\r
23   \r
24   my_class: () ->\r
25     @constructor\r
26   \r
27   @my_peta: () ->\r
28     return null if not Manifest.manifest().items\r
29     Manifest.manifest().items[@item_name()]\r
30   \r
31   @my_manifest: () ->\r
32     return null if not Manifest.manifest().models\r
33     Manifest.manifest().models[@item_name()]\r
34   \r
35   @singular: () ->\r
36     'Name'\r
37   \r
38   @plural: () ->\r
39     table_name = Manifest.manifest().pluralize @item_name()\r
40     Pettanr.camelize(table_name)\r
41   \r
42   @class_name: () ->\r
43     @singular()\r
44   \r
45   @model_name: () ->\r
46     @class_name()\r
47   \r
48   @item_name: () ->\r
49     Pettanr.underscore(@singular())\r
50   \r
51   @table_name: () ->\r
52     Pettanr.underscore(@plural())\r
53   \r
54   @is_item: () ->\r
55     true\r
56   \r
57   @is_content: () ->\r
58     false\r
59   \r
60   @is_element: () ->\r
61     false\r
62   \r
63   @is_root: () ->\r
64     false\r
65  \r
66   @parent_model: () ->\r
67     null\r
68   \r
69   @has_picture: () ->\r
70     false\r
71   \r
72   @path_name: (with_engine = false) ->\r
73     @table_name()\r
74   \r
75   @find_boost_name: (column_name) ->\r
76     @my_peta().find_boost_name column_name\r
77   \r
78   @is_extend_column: (column_name) -> \r
79     @my_peta().is_extend_column column_name\r
80   \r
81   @fold_extend_settings: (attr) ->\r
82     _.each my_peta().boost, (name, manifest) ->\r
83       my_settings = attr[manifest.settings_column_name]\r
84       if my_settings\r
85         attr[manifest.settings_column_name] = my_settings.to_json\r
86   \r
87   @retrieve: (id, context, options = {}) ->\r
88     item = new this({id: id})\r
89     item.retrieve(context, options)\r
90   \r
91   @trace_routes: () ->\r
92     {}\r
93   \r
94   #InstanceMethods\r
95   \r
96   default_url: () ->\r
97     r = @my_class().default_url()\r
98     r = r.concat( @id ) if @id\r
99     r\r
100   \r
101   singular: () ->\r
102     @my_class().singular()\r
103   \r
104   plural: () ->\r
105     @my_class().plural()\r
106   \r
107   item_name: () ->\r
108     @my_class().item_name()\r
109   \r
110   model_name: () ->\r
111     @item_name()\r
112   \r
113   table_name: () ->\r
114     @my_class().table_name()\r
115   \r
116   path_name: (with_engine = false) ->\r
117     @my_class().path_name(with_engine)\r
118   \r
119   form_template: (with_engine = false) ->\r
120     @path_name(with_engine) + '/form'\r
121   \r
122   form_name: () ->\r
123     if @extend_column()\r
124       @get(@extend_column())\r
125     else\r
126       @item_name()\r
127   \r
128   get_association: (routes, context, options) ->\r
129     console.log 'get_association'\r
130     routes = [routes] if _.isString(routes)\r
131     console.log routes\r
132     route = routes.shift()\r
133     if _.isEmpty(routes)\r
134       # fetching terminate association. callback\r
135       console.log 'fetching terminate association'\r
136       cxt = options.context || context\r
137       @fetch_association(route, cxt, {\r
138         success: (association_item, options) =>\r
139           console.log 'success'\r
140           console.log association_item\r
141           console.log options\r
142           options.success.call(context, association_item)\r
143         context: context,\r
144         options: options\r
145       })\r
146     else\r
147       # fetching through associations\r
148       console.log 'fetching through associations'\r
149       @fetch_association(route, this, {\r
150         success: (association_item, options) =>\r
151           console.log 'success'\r
152           console.log association_item\r
153           console.log options\r
154           association_item.get_association(routes, this, options)\r
155         context: context,\r
156         options: options\r
157       })\r
158   \r
159   fetch_association: (name, context, options) =>\r
160     console.log context\r
161     console.log options\r
162     a = @my_class().my_manifest().associations\r
163     fetch_options = {\r
164       success: (association_item) =>\r
165         options.success.call(context, association_item, options.options)\r
166     }\r
167     if a.belongs_to[name]\r
168       console.log 'belongs_to'\r
169       console.log name\r
170       @get_parent(name, context, fetch_options)\r
171     else if a.has_many[name]\r
172       console.log 'has_many'\r
173       console.log name\r
174       @get_children(name, context, fetch_options)\r
175     else if a.has_one[name]\r
176       console.log 'has_one'\r
177       console.log name\r
178       @get_child(name, context, fetch_options)\r
179     else\r
180       console.error('association does not exist in model manifest')\r
181   \r
182   get_parent: (belongs_to_name, context, options = null) ->\r
183     m = Manifest.item_name_to_model(belongs_to_name)\r
184     retriever = new Pettanr.Cache.Retriever(m, @get(belongs_to_name + '_id'))\r
185     return retriever if !options\r
186     @listenTo(retriever, 'retrieve', (item) =>\r
187       options.success.call(context, item)\r
188     )\r
189     retriever.retrieve()\r
190   \r
191   get_child: (has_one_name, context, options = null) ->\r
192     list = @has_one(has_one_name)\r
193     list.open(context, {\r
194       success: (items) =>\r
195         callback = options.success\r
196         item = items[0]\r
197         callback.call(context, item)\r
198     })\r
199   \r
200   get_children: (has_many_name, context, options = null) ->\r
201     list = @has_many(has_many_name)\r
202     list.open(context, {\r
203       success: (items) =>\r
204         callback = options.success\r
205         callback.call(context, items)\r
206     })\r
207   \r
208   has_many: (has_many_name) ->\r
209     has_many_manifest = @my_class().my_manifest().associations.has_many[has_many_name]\r
210     action_name = has_many_manifest.list_action_name\r
211     Locmare.ListGroup.list(\r
212       has_many_name, action_name, {id: @get('id')}\r
213     )\r
214   \r
215   has_one: (has_one_name) ->\r
216     has_one_manifest = @my_class().my_manifest().associations.has_one[has_one_name]\r
217     controller_name = has_one_manifest.model().table_name()\r
218     action_name = has_one_manifest.list_action_name\r
219     Locmare.ListGroup.list(\r
220       controller_name, action_name, {id: @get('id')}\r
221     )\r
222   \r
223   trace_to: (trace_name, context, options) ->\r
224     routes = @my_class().trace_routes()[trace_name]\r
225     if !routes\r
226       console.error('no trace route')\r
227       return\r
228     @get_association(routes, this, {\r
229       success: (association) => \r
230         options.success.call(context, association)\r
231     })\r
232   \r
233   boosts: (level) ->\r
234     c = @my_class().my_peta().boost\r
235     _.each c, (boost_manifest, boost_name) =>\r
236       return if level == 'read' and boost_manifest.level == 'post'\r
237       @boost boost_manifest\r
238   \r
239   boost: (boost_manifest) ->\r
240     @boosters[boost_manifest.name] = new Locmare.Booster(boost_manifest, this)\r
241     # fetched item is not cleared .  force write booster\r
242     #@boosters[boost_manifest.name] ||= new Locmare.Booster(boost_manifest, this)\r
243   \r
244   is_extend_column: (column_name) ->\r
245     @is_extend_column column_name\r
246   \r
247   is_visible: (operators = Pettanr.cache.operators) ->\r
248     if Manifest.manifest().magic_numbers['run_mode'] == 0\r
249       return false if not operators.is_guest()\r
250     else\r
251       return false if not operators.is_resource_reader()\r
252     true\r
253   \r
254   retriever: () ->\r
255     new Pettanr.Cache.Retriever(@my_class(), @get('id'))\r
256   \r
257   retrieve: (context, options = {}) ->\r
258     retriever = new Pettanr.Cache.Retriever(@my_class(), @get('id'))\r
259     @listenTo(retriever, 'retrieve', (item) =>\r
260       callback = options.success\r
261       callback.call(context, item)\r
262     )\r
263     retriever.retrieve(options.force)\r
264   \r
265   @pick_item_name: () ->\r
266     null\r
267   \r
268   @pick_model: () ->\r
269     Manifest.item_name_to_model(@pick_item_name())\r
270   \r
271   @traceable_item_names: () ->\r
272     []\r
273   \r
274   @is_traceable: (item_name) ->\r
275     _.contains(@traceable_item_names(), item_name)\r
276   \r
277   @is_picker_inspire: (item_name) ->\r
278     item_name == @item_name()\r
279   \r
280   @is_picker_trace: (item_name) ->\r
281     @is_traceable(item_name)\r
282   \r
283   @is_picker_pick: (item_name) ->\r
284     item_name == @pick_item_name()\r
285   \r
286   @pick_type: (item_name) ->\r
287     if @is_picker_inspire(item_name)\r
288       'inspire'\r
289     else if @is_picker_trace(item_name)\r
290       'trace'\r
291     else if @is_picker_pick(item_name)\r
292       'pick'\r
293     else\r
294       'none'\r
295   \r
296   symbol_option: (context, options) ->\r
297     @trace_to('symbol', this, {\r
298       success: (symbol_item) => \r
299         options.success.call(context, symbol_item.to_symbol())\r
300     })\r
301   \r
302   to_symbol: () ->\r
303     @tmb_opt_img_tag()\r
304   \r
305   icon_view: (half) ->\r
306     new Pettanr.Views[@my_class().singular()].Icon({item: this, half: half})\r
307   \r
308   @index_url: () ->\r
309     Pettanr.url(@table_name(), 'index', {id: null})\r
310   \r
311   index_url: () ->\r
312     @my_class().index_url()\r
313   \r
314   list_url: (action_name = 'index') ->\r
315     Pettanr.url(@table_name(), action_name, {id: @get('id')})\r
316   \r
317   show_url: () ->\r
318     Pettanr.url(@table_name(), 'show', {id: @get('id')})\r
319   \r
320   prof_url: () ->\r
321     Pettanr.url(@table_name(), 'show', {id: @get('id'), format: 'prof'})\r
322   \r
323   new_url: () ->\r
324     Pettanr.url(@table_name(), 'new', {})\r
325   \r
326   create_url: () ->\r
327     Pettanr.url(@table_name(), 'create', {})\r
328   \r
329   edit_url: () ->\r
330     Pettanr.url(@table_name(), 'edit', {id: @get('id')})\r
331   \r
332   update_url: () ->\r
333     Pettanr.url(@table_name(), 'update', {id: @get('id')})\r
334   \r
335   destroy_url: () ->\r
336     Pettanr.url(@table_name(), 'destroy', {id: @get('id')})\r
337   \r
338   hold: () ->\r
339     Pettanr.cache.hold(this)\r
340   \r
341   fix: () ->\r
342     Pettanr.cache.fix(this)\r
343   \r
344   release: () ->\r
345     Pettanr.cache.release(this)\r
346   \r
347   save: (model_attr) ->\r
348     super(model_attr || @attributes, {\r
349       success: (model, response, options) =>\r
350         @trigger('save:success', model, response)\r
351       error: (model, response, options) =>\r
352         @trigger('save:fail', model, response)\r
353     })\r
354   \r
355   destroy: () ->\r
356     super({\r
357       success: (model, response, options) =>\r
358         @trigger('destroy:success', model, response)\r
359       error: (model, response, options) =>\r
360         @trigger('destroy:fail', model, response)\r
361     })\r
362   \r
363   is_editize: () ->\r
364     @editor\r
365   \r
366   dom_id: () ->\r
367     (@get('id') || '').toString()\r
368   \r
369   cache_key: () ->\r
370     @table_name() + '-' + @dom_id()\r
371   \r
372   dom_pool_type: () ->\r
373     @new_record ? 'stored' : 'new'\r
374   \r
375   merge_dom_item_id: (attr, name = null) ->\r
376     if @is_editize()\r
377       _.extend(attr, {'id': @dom_item_id(name)})\r
378     else\r
379       attr\r
380   \r
381   tag_attributes: (name = null, opt = {}) ->\r
382     r = {\r
383       'data-pool_type': @dom_pool_type(), 'data-id': @dom_id(), \r
384       'data-item_name': @item_name()\r
385     }\r
386     r = @merge_dom_item_id(r, name)\r
387     _.extend(r, opt)\r
388     r\r
389   \r
390   field_tag_attributes: (column_name, opt = {}) ->\r
391     r = @tag_attributes(column_name, opt)\r
392     _.extend(r, {'data-column_name': column_name})\r
393     r\r
394   \r
395   post_attribute_key: () ->\r
396     @dom_id\r
397   \r
398   @test: () ->\r
399     console.log(@child_models())\r
400     console.log(@child_element_names())\r
401     console.log(@my_peta())\r
402     console.log(@my_manifest())\r
403     console.log()\r
404     console.log()\r
405   \r
406   test: () ->\r
407     console.log(@my_class())\r
408     console.log(@item_name())\r
409     console.log(@model_name())\r
410     console.log(@table_name())\r
411     console.log(@path_name())\r
412     console.log(@pickup_item_name())\r
413     console.log(@pickup_column_name())\r
414     console.log(@dom_id())\r
415     console.log(@dom_pool_type())\r
416     console.log(@tag_attributes())\r
417     console.log(@field_tag_attributes('id'))\r
418     console.log(@post_attribute_key())\r