OSDN Git Service

fix: devise
[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     routes = [routes] if _.isString(routes)\r
130     route = routes.shift()\r
131     if _.isEmpty(routes)\r
132       # fetching terminate association. callback\r
133       cxt = options.context || context\r
134       @fetch_association(route, cxt, {\r
135         success: (association_item, options) =>\r
136           options.success.call(context, association_item)\r
137         context: context,\r
138         options: options\r
139       })\r
140     else\r
141       # fetching through associations\r
142       @fetch_association(route, this, {\r
143         success: (association_item, options) =>\r
144           association_item.get_association(routes, this, options)\r
145         context: context,\r
146         options: options\r
147       })\r
148   \r
149   fetch_association: (name, context, options) =>\r
150     a = @my_class().my_manifest().associations\r
151     fetch_options = {\r
152       success: (association_item) =>\r
153         options.success.call(context, association_item, options.options)\r
154     }\r
155     if a.belongs_to[name]\r
156       @get_parent(name, context, fetch_options)\r
157     else if a.has_many[name]\r
158       @get_children(name, context, fetch_options)\r
159     else if a.has_one[name]\r
160       @get_child(name, context, fetch_options)\r
161     else\r
162       console.error('association does not exist in model manifest')\r
163   \r
164   get_parent: (belongs_to_name, context, options = null) ->\r
165     m = Manifest.item_name_to_model(belongs_to_name)\r
166     retriever = new Pettanr.Cache.Retriever(m, @get(belongs_to_name + '_id'))\r
167     return retriever if !options\r
168     @listenTo(retriever, 'retrieve', (item) =>\r
169       options.success.call(context, item)\r
170     )\r
171     retriever.retrieve()\r
172   \r
173   get_child: (has_one_name, context, options = null) ->\r
174     list = @has_one(has_one_name)\r
175     list.open(context, {\r
176       success: (items) =>\r
177         callback = options.success\r
178         item = items[0]\r
179         callback.call(context, item)\r
180     })\r
181   \r
182   get_children: (has_many_name, context, options = null) ->\r
183     list = @has_many(has_many_name)\r
184     list.open(context, {\r
185       success: (items) =>\r
186         callback = options.success\r
187         callback.call(context, items)\r
188     })\r
189   \r
190   has_many: (has_many_name) ->\r
191     has_many_manifest = @my_class().my_manifest().associations.has_many[has_many_name]\r
192     action_name = has_many_manifest.list_action_name\r
193     Locmare.ListGroup.list(\r
194       has_many_name, action_name, {id: @get('id')}\r
195     )\r
196   \r
197   has_one: (has_one_name) ->\r
198     has_one_manifest = @my_class().my_manifest().associations.has_one[has_one_name]\r
199     controller_name = has_one_manifest.model().table_name()\r
200     action_name = has_one_manifest.list_action_name\r
201     Locmare.ListGroup.list(\r
202       controller_name, action_name, {id: @get('id')}\r
203     )\r
204   \r
205   trace_to: (trace_name, context, options) ->\r
206     routes = @my_class().trace_routes()[trace_name]\r
207     if !routes\r
208       console.error('no trace route')\r
209       return\r
210     @get_association(routes, this, {\r
211       success: (association) => \r
212         options.success.call(context, association)\r
213     })\r
214   \r
215   boosts: (level) ->\r
216     c = @my_class().my_peta().boost\r
217     _.each c, (boost_manifest, boost_name) =>\r
218       return if level == 'read' and boost_manifest.level == 'post'\r
219       @boost boost_manifest\r
220   \r
221   boost: (boost_manifest) ->\r
222     @boosters[boost_manifest.name] = new Locmare.Booster(boost_manifest, this)\r
223     # fetched item is not cleared .  force write booster\r
224     #@boosters[boost_manifest.name] ||= new Locmare.Booster(boost_manifest, this)\r
225   \r
226   is_extend_column: (column_name) ->\r
227     @is_extend_column column_name\r
228   \r
229   is_visible: (operators = Pettanr.cache.operators) ->\r
230     if Manifest.manifest().magic_numbers['run_mode'] == 0\r
231       return false if not operators.is_guest()\r
232     else\r
233       return false if not operators.is_resource_reader()\r
234     true\r
235   \r
236   retriever: () ->\r
237     new Pettanr.Cache.Retriever(@my_class(), @get('id'))\r
238   \r
239   retrieve: (context, options = {}) ->\r
240     retriever = new Pettanr.Cache.Retriever(@my_class(), @get('id'))\r
241     @listenTo(retriever, 'retrieve', (item) =>\r
242       callback = options.success\r
243       callback.call(context, item)\r
244     )\r
245     retriever.retrieve(options.force)\r
246   \r
247   @pick_item_name: () ->\r
248     null\r
249   \r
250   @pick_model: () ->\r
251     Manifest.item_name_to_model(@pick_item_name())\r
252   \r
253   @traceable_item_names: () ->\r
254     []\r
255   \r
256   @is_traceable: (item_name) ->\r
257     _.contains(@traceable_item_names(), item_name)\r
258   \r
259   @is_picker_inspire: (item_name) ->\r
260     item_name == @item_name()\r
261   \r
262   @is_picker_trace: (item_name) ->\r
263     @is_traceable(item_name)\r
264   \r
265   @is_picker_pick: (item_name) ->\r
266     item_name == @pick_item_name()\r
267   \r
268   @pick_type: (item_name) ->\r
269     if @is_picker_inspire(item_name)\r
270       'inspire'\r
271     else if @is_picker_trace(item_name)\r
272       'trace'\r
273     else if @is_picker_pick(item_name)\r
274       'pick'\r
275     else\r
276       'none'\r
277   \r
278   symbol_option: (context, options) ->\r
279     @trace_to('symbol', this, {\r
280       success: (symbol_item) => \r
281         options.success.call(context, symbol_item.to_symbol())\r
282     })\r
283   \r
284   to_symbol: () ->\r
285     @tmb_opt_img_tag()\r
286   \r
287   icon_view: (half) ->\r
288     new Pettanr.Views[@my_class().singular()].Icon({item: this, half: half})\r
289   \r
290   @index_url: () ->\r
291     Pettanr.url(@table_name(), 'index', {id: null})\r
292   \r
293   index_url: () ->\r
294     @my_class().index_url()\r
295   \r
296   list_url: (action_name = 'index') ->\r
297     Pettanr.url(@table_name(), action_name, {id: @get('id')})\r
298   \r
299   show_url: () ->\r
300     Pettanr.url(@table_name(), 'show', {id: @get('id')})\r
301   \r
302   prof_url: () ->\r
303     Pettanr.url(@table_name(), 'show', {id: @get('id'), format: 'prof'})\r
304   \r
305   new_url: () ->\r
306     Pettanr.url(@table_name(), 'new', {})\r
307   \r
308   create_url: () ->\r
309     Pettanr.url(@table_name(), 'create', {})\r
310   \r
311   edit_url: () ->\r
312     Pettanr.url(@table_name(), 'edit', {id: @get('id')})\r
313   \r
314   update_url: () ->\r
315     Pettanr.url(@table_name(), 'update', {id: @get('id')})\r
316   \r
317   destroy_url: () ->\r
318     Pettanr.url(@table_name(), 'destroy', {id: @get('id')})\r
319   \r
320   hold: () ->\r
321     Pettanr.cache.hold(this)\r
322   \r
323   fix: () ->\r
324     Pettanr.cache.fix(this)\r
325   \r
326   release: () ->\r
327     Pettanr.cache.release(this)\r
328   \r
329   save: (model_attr) ->\r
330     super(model_attr || @attributes, {\r
331       success: (model, response, options) =>\r
332         @trigger('save:success', model, response)\r
333       error: (model, response, options) =>\r
334         @trigger('save:fail', model, response)\r
335     })\r
336   \r
337   destroy: () ->\r
338     super({\r
339       success: (model, response, options) =>\r
340         @trigger('destroy:success', model, response)\r
341       error: (model, response, options) =>\r
342         @trigger('destroy:fail', model, response)\r
343     })\r
344   \r
345   is_editize: () ->\r
346     @editor\r
347   \r
348   dom_id: () ->\r
349     (@get('id') || '').toString()\r
350   \r
351   cache_key: () ->\r
352     @table_name() + '-' + @dom_id()\r
353   \r
354   dom_pool_type: () ->\r
355     @new_record ? 'stored' : 'new'\r
356   \r
357   merge_dom_item_id: (attr, name = null) ->\r
358     if @is_editize()\r
359       _.extend(attr, {'id': @dom_item_id(name)})\r
360     else\r
361       attr\r
362   \r
363   tag_attributes: (name = null, opt = {}) ->\r
364     r = {\r
365       'data-pool_type': @dom_pool_type(), 'data-id': @dom_id(), \r
366       'data-item_name': @item_name()\r
367     }\r
368     r = @merge_dom_item_id(r, name)\r
369     _.extend(r, opt)\r
370     r\r
371   \r
372   field_tag_attributes: (column_name, opt = {}) ->\r
373     r = @tag_attributes(column_name, opt)\r
374     _.extend(r, {'data-column_name': column_name})\r
375     r\r
376   \r
377   post_attribute_key: () ->\r
378     @dom_id\r
379   \r
380   @test: () ->\r
381     console.log(@child_models())\r
382     console.log(@child_element_names())\r
383     console.log(@my_peta())\r
384     console.log(@my_manifest())\r
385     console.log()\r
386     console.log()\r
387   \r
388   test: () ->\r
389     console.log(@my_class())\r
390     console.log(@item_name())\r
391     console.log(@model_name())\r
392     console.log(@table_name())\r
393     console.log(@path_name())\r
394     console.log(@pickup_item_name())\r
395     console.log(@pickup_column_name())\r
396     console.log(@dom_id())\r
397     console.log(@dom_pool_type())\r
398     console.log(@tag_attributes())\r
399     console.log(@field_tag_attributes('id'))\r
400     console.log(@post_attribute_key())\r