OSDN Git Service

fix: finder
[pettanr/pettanr.git] / app / controllers / application_controller.rb
1 class ApplicationController < ActionController::Base
2   protect_from_forgery
3   layout :devise_layout
4   before_action :bf
5   
6   def devise_layout
7     if devise_controller?
8       case resource_name
9       when :admin
10         'guest'
11       when :user
12         'guest'
13       when :demand_user
14         'guest'
15       end
16     else
17       'application'
18     end
19   end
20   
21   def bf
22     @server_result = {
23       :location => {:controller => params[:controller], :action => params[:action]}
24     }
25     @server_result[:location][:id] = params[:id] if params[:id]
26     user = if user_signed_in?
27       current_user
28     else
29       nil
30     end
31     author = if user
32       user.author
33     else
34       nil
35     end
36     artist = if user
37       user.artist
38     else
39       nil
40     end
41     admin = if admin_signed_in?
42       current_admin
43     else
44       nil
45     end
46     demand_user = if demand_user_signed_in?
47       current_demand_user
48     else
49       nil
50     end
51     @operators = Operator.new [user, author, artist, admin, demand_user]
52   end
53   
54   def authenticate_reader
55     authenticate_user! unless @operators.reader?
56   end
57   
58   def authenticate_user
59     authenticate_user! unless @operators.user?
60   end
61   
62   def authenticate_resource_reader
63     authenticate_user! unless @operators.resource_reader?
64   end
65   
66   def authenticate_admin
67     authenticate_admin! unless @operators.admin?
68   end
69   
70   def authenticate_author
71     if @operators.author
72       true
73     else
74       respond_to do |format|
75         format.html { redirect_to main_app.new_author_path, :status => :found }
76         format.json { 
77           raise ActiveRecord::Forbidden
78         }
79       end
80       false
81     end
82   end
83       
84   def authenticate_artist
85     if @operators.artist
86       true
87     else
88       respond_to do |format|
89         format.html { redirect_to main_app.new_artist_path, :status => :found }
90         format.json { 
91           raise ActiveRecord::Forbidden
92         }
93       end
94       false
95     end
96   end
97   
98   def self.controller
99     Manifest.manifest.controllers[self.model.item_name]
100   end
101   
102   def self.profiler_manager
103     Manifest.manifest.profiler_managers[self.model.item_name]
104   end
105   
106   def set_model
107     @my_controller = Manifest.manifest.controllers[params[:controller].to_s]
108     @my_action = @my_controller.actions[params[:action].to_s]
109     @my_model = Manifest.manifest.models[@my_action.item_name]
110     @my_model_class = @my_model.classify
111   end
112   
113   def set_list options = {}
114     set_model
115     # params merge to options
116     options[:page] ||= params[:page]
117     options[:page_size] ||= params[:page_size]
118     options[:order] ||= params[:order]
119     options[:direction] ||= params[:direction]
120     @finder = @my_action.find options
121   end
122   
123   def filer_list options = {}
124     set_list options
125     respond_to do |format|
126       format.html {
127         @filer = Locmare::Filer.new @my_action.return_item_name, @finder, @finder, @operators
128         render @filer.template_name, :locals => {
129           :filer => @filer
130         }
131       }
132       list_json_format @finder, format
133       format.atom 
134       format.rss
135     end
136   end
137   
138   def list_json_format list, format
139     format.json {
140       res = {
141         :page_status => {
142           :type => :default, :total => @finder.total_count, :total_page => @finder.total_pages, 
143           :page => @finder.page, :page_size => @finder.limit_value, 
144           :item_name => @my_action.return_item_name
145         },
146         # rails3.2 has problem
147         # y method defined as private
148         # attribute y conflict at PanelPicture, balloon ..etc
149         # use i.attributes[name]
150         :list => list.map{|i| i.attributes}
151         # :list => @finder.to_json
152       }
153       render json:  res.to_json
154     }
155   end
156   
157   def set_play
158     set_model
159     @item = @my_model_class.show(params[:id], @operators)
160     options = if @item.own?(@operators)
161       {finder: :find_private_play, param: [params[:id], @operators]}
162     else
163       {finder: :find_play, param: params[:id]}
164     end
165     set_list options
166   end
167   
168   def play_list
169     @items = @finder #.map {|sp| sp.root }
170     @count = @finder.total_count
171     @pager = @finder
172   end
173   
174   def set_show
175     set_model
176     @item = @my_model_class.show(params[:id], @operators)
177   end
178   
179   def show_prof_format format
180     format.prof {
181       self.formats = [:html]
182       @profiler = Locmare::Profiler.new @my_model_class.item_name, @item, @operators
183       render @profiler.template_name, :locals => {
184         :profiler => @profiler
185       }
186     }
187   end
188   
189   def show_json_format format
190     format.json { render json: @item.to_json(@my_model_class.show_json_opt) }
191   end
192   
193   def show_json_format_for_root format
194     format.json { render json: @item.to_json(@my_model_class.show_json_opt_for_root) }
195   end
196   
197   def set_new
198     set_model
199     @item = @my_model_class.new
200     @item.boosts 'post'
201     @item.supply_default
202   end
203   
204   def set_edit
205     set_model
206     @item = @my_model_class.edit(params[:id], @operators)
207     @item.boosts 'post'
208   end
209   
210   def render_form
211     respond_to do |format|
212       format.html { 
213         @form = Locmare::Bucket.factory @item.item_name, 'default', @item, true, true, @operators
214         render @form.template_name, :locals => {
215           :form => @form
216         }
217       }
218       format.json { render json: @item.to_json }
219     end
220   end
221   
222   def form_new
223     set_new
224     render_form
225   end
226   
227   def form_edit
228     set_edit
229     render_form
230   end
231   
232   def created_html_format format, redirect_url = nil
233     format.html {
234       flash[:notice] = I18n.t('flash.notice.created', :model => @my_model_class.model_name.human)
235       redirect_to (redirect_url ? redirect_url : @item)
236     }
237   end
238   
239   def created_json_format format
240     format.json {
241       render json: @item.to_json(@my_model_class.show_json_opt), status: :created, location: @item
242     }
243   end
244   
245   def not_created_html_format format
246     format.html {
247       flash[:notice] = I18n.t('flash.notice.not_created', :model => @my_model_class.model_name.human)
248       render_form
249     }
250   end
251   
252   def not_created_json_format format
253     format.json {
254       render json: @item.errors, status: :unprocessable_entity
255     }
256   end
257   
258   def render_create redirect_url = nil
259     if @item.save
260       respond_to do |format|
261         created_html_format format, redirect_url
262         created_json_format format
263       end
264     else
265       respond_to do |format|
266         not_created_html_format format
267         not_created_json_format format
268       end
269     end
270   end
271   
272   def leaf_created_html_format format, redirect_url
273     format.html {
274       flash[:notice] = I18n.t('flash.notice.created', :model => @my_model_class.model_name.human)
275       redirect_to redirect_url
276     }
277   end
278   
279   def leaf_not_created_html_format format, redirect_url
280     format.html {
281       flash[:notice] = I18n.t('flash.notice.not_created', :model => @my_model_class.model_name.human)
282       redirect_to redirect_url
283     }
284   end
285   
286   def leaf_render_create redirect_url
287     if @item.store @operators
288       respond_to do |format|
289         leaf_created_html_format format, redirect_url
290         created_json_format format
291       end
292     else
293       respond_to do |format|
294         leaf_not_created_html_format format, redirect_url
295         not_created_json_format format
296       end
297     end
298   end
299   
300   def updated_html_format format, redirect_url = nil
301     format.html {
302       flash[:notice] = I18n.t('flash.notice.updated', :model => @my_model_class.model_name.human)
303       redirect_to (redirect_url ? redirect_url : @item)
304     }
305   end
306   
307   def updated_json_format format
308     format.json {
309       render json: '{}', status: :ok
310     }
311   end
312   
313   def not_updated_html_format format
314     format.html {
315       flash[:notice] = I18n.t('flash.notice.not_updated', :model => @my_model_class.model_name.human)
316       render_form
317     }
318   end
319   
320   def not_updated_json_format format
321     format.json {
322       render json: @item.errors, status: :unprocessable_entity
323     }
324   end
325   
326   def render_update redirect_url = nil
327     if @item.save
328       respond_to do |format|
329         updated_html_format format, redirect_url
330         updated_json_format format
331       end
332     else
333       respond_to do |format|
334         not_updated_html_format format
335         not_updated_json_format format
336       end
337     end
338   end
339   
340   def leaf_updated_html_format format, redirect_url
341     format.html {
342       flash[:notice] = I18n.t('flash.notice.updated', :model => @my_model_class.model_name.human)
343       redirect_to redirect_url
344     }
345   end
346   
347   def leaf_not_updated_html_format format, redirect_url
348     format.html {
349       flash[:notice] = I18n.t('flash.notice.not_updated', :model => @my_model_class.model_name.human)
350       redirect_to redirect_url
351     }
352   end
353   
354   def leaf_render_update ot, redirect_url
355     if @item.store @operators, ot
356       respond_to do |format|
357         leaf_updated_html_format format, redirect_url
358         updated_json_format format
359       end
360     else
361       respond_to do |format|
362         leaf_not_updated_html_format format, redirect_url
363         not_updated_json_format format
364       end
365     end
366   end
367   
368   def destroyed_html_format format, redirect_url
369     format.html {
370       flash[:notice] = I18n.t('flash.notice.destroyed', :model => @my_model_class.model_name.human)
371       redirect_to redirect_url
372     }
373   end
374   
375   def destroyed_json_format format
376     format.json {
377       render json: '{}', status: :ok
378     }
379   end
380   
381   def not_destroyed_html_format format
382     format.html {
383       flash[:notice] = I18n.t('flash.notice.not_destroyed', :model => @my_model_class.model_name.human)
384       redirect_to @item
385     }
386   end
387   
388   def not_destroyed_json_format format
389     format.json {
390       render json: @item.errors, status: :unprocessable_entity
391     }
392   end
393   
394   def render_destroy redirect_url
395     if @item.destroy
396       respond_to do |format|
397         destroyed_html_format format, redirect_url
398         destroyed_json_format format
399       end
400     else
401       respond_to do |format|
402         not_destroyed_html_format format
403         not_destroyed_json_format format
404       end
405     end
406   end
407   
408   def render_destroy_by destroy_method_name, redirect_url = nil
409     if @item.__send__(destroy_method_name)
410       respond_to do |format|
411         destroyed_html_format format, redirect_url
412         destroyed_json_format format
413       end
414     else
415       respond_to do |format|
416         not_destroyed_html_format format
417         not_destroyed_json_format format
418       end
419     end
420   end
421   
422   def format_filer format
423     format.html {
424       @paginate = @@model.list_paginate(@page, @page_size)
425       render :template => 'system/filer', :locals => {
426         :items => @items, :model => @@model, 
427         :operators => @operators, :pager => @paginate
428       }
429     }
430   end
431   
432   def format_prof format
433     format.prof { 
434       @profiler = self.class.profiler_manager.open(@item, @operators)
435       render :template => 'system/prof', :locals => {
436         :profiler => @profiler
437       }
438     }
439   end
440   
441   def assist_items controller_name, action_name, options = {}
442     controller = Manifest.manifest.controllers[controller_name]
443     action = controller.actions[action_name]
444     options[:page] = 1
445     options[:page_size] = 5
446     finder = action.find options
447     finder
448   end
449   
450   def set_image(file)
451     if file.respond_to?(:read)
452       file.read
453     else
454       Base64.decode64(file.to_s.gsub(' ', '+'))
455     end
456   end
457   
458   def ymd_to_time ymd_str
459     return nil if ymd_str.blank?
460     date = nil
461     begin
462       date = Time.parse(ymd_str[0..3] + '/' + ymd_str[4..5] + '/' + ymd_str[6..7])
463     rescue
464       date = nil
465     end
466     date
467   end
468   
469   def export_url demander_url, action, token, date
470     u = demander_url + (demander_url[-1] == '/' ? '' : '/')
471     prm = '?auth_token=' + token
472     prm = prm + '&date=' + date.strftime("%Y%m%d") unless date.blank?
473     u = URI.join(u, action + '.json' + prm)
474     u.to_s
475   end
476   
477   def export_from_provider url
478     res = nil
479     begin
480       json = RestClient.get url
481       res = JSON.parse json
482     rescue
483     end
484     res
485   end
486   
487   def export_by action, provider_status, ymd
488     t = ymd_to_time ymd
489     url = export_url provider_status.provider.demander_url, action, provider_status.token, t
490     export_from_provider(url)
491   end
492   
493     rescue_from Pettanr::NotWork, :with => :render_not_work
494     def render_not_work(exception = nil)
495       if exception
496         logger.info "Rendering , :: #{exception.message}"
497       end
498       respond_to do |format|
499         format.html { 
500           render :file => "#{Rails.root}/public/not_work.html", :layout => false
501         }
502         format.json { 
503           render :text => "400 Not work", :status => 400
504         }
505       end
506     end
507     
508   if Rails.env == 'production'
509     rescue_from ActiveRecord::RecordNotFound, :with => :render_404
510     rescue_from ActiveRecord::Forbidden, :with => :render_403
511     
512     private
513     def render_404(exception = nil)
514       if exception
515         logger.info "Rendering 404: #{exception.message}"
516       end
517       respond_to do |format|
518         format.html { 
519           render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
520         }
521         format.json { 
522           render :text => "404 Not found", :status => 404
523         }
524       end
525     end
526     
527     def render_403(exception = nil)
528       if exception
529         logger.info "Rendering 403: #{exception.message}"
530       end
531       respond_to do |format|
532         format.html { 
533           render :file => "#{Rails.root}/public/403.html", :status => 404, :layout => false
534         }
535         format.json { 
536           render :text => "403 Forbidden", :status => 403
537         }
538       end
539     end
540   end
541 end